From 7ac9edb8f8f19d1190dbf8b6f8e55a38f0aadb25 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 12 Jun 2026 14:07:54 -0700 Subject: [PATCH 01/19] Add WorkOS MCP auth gateway --- api/mcp.ts | 155 ++++++++++++++++-- api/oauth-authorization-server.ts | 41 +++++ api/oauth-protected-resource.ts | 53 ++++++ packages/mcp/src/server.ts | 8 +- packages/mcp/tests/api-handler.test.ts | 89 +++++++++- sdks/typescript-sdk/src/client.test.ts | 20 +++ sdks/typescript-sdk/src/client.ts | 5 +- .../typescript-sdk/src/client/interceptors.ts | 10 +- sdks/typescript-sdk/src/client/transport.ts | 7 +- vercel.json | 14 ++ 10 files changed, 382 insertions(+), 20 deletions(-) create mode 100644 api/oauth-authorization-server.ts create mode 100644 api/oauth-protected-resource.ts diff --git a/api/mcp.ts b/api/mcp.ts index 3cb5103d..058544be 100644 --- a/api/mcp.ts +++ b/api/mcp.ts @@ -48,14 +48,15 @@ function getHeaderValue(value: string | string[] | undefined): string | undefine function extractAuthorizationToken( authorizationHeader: string | undefined, -): { token?: string; source?: 'authorization' } { +): { scheme?: 'Bearer' | 'Token'; token?: string; source?: 'authorization' } { if (authorizationHeader?.trim()) { const trimmed = authorizationHeader.trim(); const authMatch = trimmed.match(/^(bearer|token)\s+(.+)$/i); if (authMatch?.[2]) { const token = authMatch[2].trim(); if (token.length > 0) { - return { token, source: 'authorization' }; + const scheme = authMatch[1].toLowerCase() === 'bearer' ? 'Bearer' : 'Token'; + return { scheme, token, source: 'authorization' }; } } } @@ -63,6 +64,111 @@ function extractAuthorizationToken( return {}; } +type ResolvedTerminal49Auth = { + apiToken: string; + accountId?: string; + authSource: 'authorization' | 'environment' | 'workos_mcp'; +}; + +type McpConnectionResolutionResponse = { + data?: { + attributes?: { + access_token?: string; + account_id?: string; + }; + }; + error?: string; +}; + +function mcpResourceUrl(): string | undefined { + return process.env.T49_MCP_RESOURCE_URL?.trim() || process.env.WORKOS_MCP_RESOURCE?.trim(); +} + +function oauthProtectedResourceMetadataUrl(): string | undefined { + const configured = process.env.T49_MCP_RESOURCE_METADATA_URL?.trim(); + if (configured) { + return configured; + } + + const resource = mcpResourceUrl(); + if (!resource) { + return undefined; + } + + try { + const url = new URL(resource); + return `${url.origin}/.well-known/oauth-protected-resource`; + } catch { + return `${resource.replace(/\/+$/, '')}/.well-known/oauth-protected-resource`; + } +} + +function wwwAuthenticateHeader(): string { + const metadataUrl = oauthProtectedResourceMetadataUrl(); + const parts = [ + 'Bearer error="unauthorized"', + 'error_description="Authorization needed"', + ]; + + if (metadataUrl) { + parts.push(`resource_metadata="${metadataUrl}"`); + } + + return parts.join(', '); +} + +function setUnauthorizedChallenge(res: ResponseLike): void { + res.setHeader('WWW-Authenticate', wwwAuthenticateHeader()); +} + +function authKitMcpEnabled(): boolean { + return process.env.T49_MCP_AUTHKIT_ENABLED === 'true'; +} + +function resolveEndpointUrl(): string { + const apiBaseUrl = process.env.T49_API_BASE_URL?.trim() || 'https://api.terminal49.com/v2'; + return `${apiBaseUrl.replace(/\/+$/, '')}/auth/mcp/connections/resolve`; +} + +async function resolveWorkosMcpToken( + token: string, + requestId: string, +): Promise<{ apiToken: string; accountId: string }> { + const resolveSecret = process.env.T49_MCP_RESOLVE_SECRET?.trim(); + if (!resolveSecret) { + throw new Error('T49_MCP_RESOLVE_SECRET must be set when AuthKit MCP auth is enabled.'); + } + + const response = await fetch(resolveEndpointUrl(), { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-T49-MCP-Resolve-Secret': resolveSecret, + 'X-Request-Id': requestId, + }, + body: JSON.stringify({ access_token: token }), + }); + + let payload: McpConnectionResolutionResponse = {}; + try { + payload = (await response.json()) as McpConnectionResolutionResponse; + } catch { + payload = {}; + } + + if (!response.ok) { + throw new Error(payload.error || `Terminal49 MCP connection resolve failed with ${response.status}`); + } + + const accessToken = payload.data?.attributes?.access_token; + const accountId = payload.data?.attributes?.account_id; + if (!accessToken || !accountId) { + throw new Error('Terminal49 MCP connection resolve response is missing access_token or account_id.'); + } + + return { apiToken: `Bearer ${accessToken}`, accountId }; +} + function isMatchingClientSecret(providedToken: string, expectedSecret: string): boolean { const providedBuffer = Buffer.from(providedToken); const expectedBuffer = Buffer.from(expectedSecret); @@ -269,6 +375,7 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom if (!callerToken) { setCorsHeaders(res); + setUnauthorizedChallenge(res); res.status(401).json({ error: 'Unauthorized', message: @@ -280,10 +387,31 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom const configuredApiToken = process.env.T49_API_TOKEN?.trim(); const configuredClientSecret = process.env.T49_MCP_CLIENT_SECRET?.trim(); - let apiToken = callerToken; - let authSource: 'authorization' | 'environment' = resolvedAuth.source ?? 'authorization'; - - if (configuredApiToken) { + let resolvedTerminal49Auth: ResolvedTerminal49Auth = { + apiToken: callerToken, + authSource: resolvedAuth.source ?? 'authorization', + }; + + if (authKitMcpEnabled() && resolvedAuth.scheme === 'Bearer') { + try { + const resolved = await resolveWorkosMcpToken(callerToken, requestId); + resolvedTerminal49Auth = { + apiToken: resolved.apiToken, + accountId: resolved.accountId, + authSource: 'workos_mcp', + }; + } catch (error) { + const err = error as Error; + setCorsHeaders(res); + setUnauthorizedChallenge(res); + res.status(401).json({ + error: 'Unauthorized', + message: err.message, + }); + logLifecycle('mcp.request.complete', requestId, { reason: 'mcp_connection_resolve_failed' }); + return; + } + } else if (configuredApiToken) { if (!configuredClientSecret) { setCorsHeaders(res); res.status(500).json({ @@ -296,6 +424,7 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom if (!isMatchingClientSecret(callerToken, configuredClientSecret)) { setCorsHeaders(res); + setUnauthorizedChallenge(res); res.status(401).json({ error: 'Unauthorized', message: 'Invalid client credentials.', @@ -304,18 +433,24 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom return; } - apiToken = configuredApiToken; - authSource = 'environment'; + resolvedTerminal49Auth = { + apiToken: configuredApiToken, + authSource: 'environment', + }; } logLifecycle('mcp.request.auth', requestId, { - auth_source: authSource, + auth_source: resolvedTerminal49Auth.authSource, }); setCorsHeaders(res); // Create MCP server and per-request transport. - server = createTerminal49McpServer(apiToken, process.env.T49_API_BASE_URL); + server = createTerminal49McpServer( + resolvedTerminal49Auth.apiToken, + process.env.T49_API_BASE_URL, + resolvedTerminal49Auth.accountId, + ); transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, // Stateless mode enableJsonResponse: true, // Return JSON instead of SSE diff --git a/api/oauth-authorization-server.ts b/api/oauth-authorization-server.ts new file mode 100644 index 00000000..3f0f3fb0 --- /dev/null +++ b/api/oauth-authorization-server.ts @@ -0,0 +1,41 @@ +import type { IncomingMessage, ServerResponse } from 'node:http'; + +type RequestLike = { + method?: string; +} & IncomingMessage; + +type ResponseLike = { + status(code: number): ResponseLike; + json(payload: unknown): void; + setHeader(name: string, value: string): void; + end(): void; +} & ServerResponse; + +export default async function handler(req: RequestLike, res: ResponseLike): Promise { + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + + if (req.method === 'OPTIONS') { + res.status(200).end(); + return; + } + + if (req.method !== 'GET') { + res.status(405).json({ error: 'Method not allowed' }); + return; + } + + const authorizationServer = process.env.WORKOS_AUTHORIZATION_SERVER_URL?.trim() || + process.env.WORKOS_ISSUER?.trim(); + + if (!authorizationServer) { + res.status(500).json({ error: 'WORKOS_AUTHORIZATION_SERVER_URL or WORKOS_ISSUER must be set.' }); + return; + } + + const response = await fetch(`${authorizationServer.replace(/\/+$/, '')}/.well-known/oauth-authorization-server`); + const payload = await response.json(); + + res.status(response.status).json(payload); +} diff --git a/api/oauth-protected-resource.ts b/api/oauth-protected-resource.ts new file mode 100644 index 00000000..a03cd204 --- /dev/null +++ b/api/oauth-protected-resource.ts @@ -0,0 +1,53 @@ +import type { IncomingMessage, ServerResponse } from 'node:http'; + +type RequestLike = { + method?: string; +} & IncomingMessage; + +type ResponseLike = { + status(code: number): ResponseLike; + json(payload: unknown): void; + setHeader(name: string, value: string): void; + end(): void; +} & ServerResponse; + +function resourceUrl(req: RequestLike): string { + const configured = process.env.T49_MCP_RESOURCE_URL?.trim() || process.env.WORKOS_MCP_RESOURCE?.trim(); + if (configured) { + return configured.replace(/\/+$/, ''); + } + + const host = req.headers.host; + const protocol = host?.startsWith('localhost') || host?.startsWith('127.0.0.1') ? 'http' : 'https'; + return `${protocol}://${host}/mcp`; +} + +export default function handler(req: RequestLike, res: ResponseLike): void { + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + + if (req.method === 'OPTIONS') { + res.status(200).end(); + return; + } + + if (req.method !== 'GET') { + res.status(405).json({ error: 'Method not allowed' }); + return; + } + + const authorizationServer = process.env.WORKOS_AUTHORIZATION_SERVER_URL?.trim() || + process.env.WORKOS_ISSUER?.trim(); + + if (!authorizationServer) { + res.status(500).json({ error: 'WORKOS_AUTHORIZATION_SERVER_URL or WORKOS_ISSUER must be set.' }); + return; + } + + res.status(200).json({ + resource: resourceUrl(req), + authorization_servers: [authorizationServer.replace(/\/+$/, '')], + bearer_methods_supported: ['header'], + }); +} diff --git a/packages/mcp/src/server.ts b/packages/mcp/src/server.ts index 070d9568..666ef3c5 100644 --- a/packages/mcp/src/server.ts +++ b/packages/mcp/src/server.ts @@ -607,8 +607,12 @@ function wrapToolWithContract( }; } -export function createTerminal49McpServer(apiToken: string, apiBaseUrl?: string): McpServer { - const client = new Terminal49Client({ apiToken, apiBaseUrl, defaultFormat: "mapped" }); +export function createTerminal49McpServer( + apiToken: string, + apiBaseUrl?: string, + accountId?: string, +): McpServer { + const client = new Terminal49Client({ apiToken, apiBaseUrl, accountId, defaultFormat: "mapped" }); const server = instrumentMcpServer( new McpServer({ diff --git a/packages/mcp/tests/api-handler.test.ts b/packages/mcp/tests/api-handler.test.ts index 532bfeb3..9aa885fb 100644 --- a/packages/mcp/tests/api-handler.test.ts +++ b/packages/mcp/tests/api-handler.test.ts @@ -4,20 +4,24 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; const mockState = vi.hoisted(() => ({ servers: [] as any[], transports: [] as any[], - serverCreateArgs: [] as Array<{ apiToken: string; apiBaseUrl: string | undefined }>, + serverCreateArgs: [] as Array<{ + apiToken: string; + apiBaseUrl: string | undefined; + accountId: string | undefined; + }>, handleRequestImpl: undefined as | ((req: unknown, res: unknown, body: unknown) => Promise) | undefined, })); vi.mock('../src/server.js', () => ({ - createTerminal49McpServer: vi.fn((apiToken: string, apiBaseUrl?: string) => { + createTerminal49McpServer: vi.fn((apiToken: string, apiBaseUrl?: string, accountId?: string) => { const server = { connect: vi.fn().mockResolvedValue(undefined), close: vi.fn().mockResolvedValue(undefined), }; - mockState.serverCreateArgs.push({ apiToken, apiBaseUrl }); + mockState.serverCreateArgs.push({ apiToken, apiBaseUrl, accountId }); mockState.servers.push(server); return server; }), @@ -87,12 +91,16 @@ describe('api/mcp handler lifecycle', () => { beforeEach(() => { vi.resetModules(); vi.clearAllMocks(); + vi.unstubAllGlobals(); mockState.servers.length = 0; mockState.transports.length = 0; mockState.serverCreateArgs.length = 0; mockState.handleRequestImpl = undefined; delete process.env.T49_API_TOKEN; delete process.env.T49_MCP_CLIENT_SECRET; + delete process.env.T49_MCP_AUTHKIT_ENABLED; + delete process.env.T49_MCP_RESOLVE_SECRET; + delete process.env.T49_MCP_RESOURCE_URL; delete process.env.T49_API_BASE_URL; delete process.env.T49_MCP_ALLOWED_HOSTS; delete process.env.T49_MCP_ALLOWED_ORIGINS; @@ -229,6 +237,81 @@ describe('api/mcp handler lifecycle', () => { expect(mockState.serverCreateArgs[0]?.apiToken).toBe('env-token-value'); }); + it('resolves WorkOS MCP bearer tokens into Terminal49 bearer account context', async () => { + process.env.T49_MCP_AUTHKIT_ENABLED = 'true'; + process.env.T49_MCP_RESOLVE_SECRET = 'resolve-secret'; + process.env.T49_API_BASE_URL = 'https://api.test/v2'; + process.env.T49_MCP_RESOURCE_URL = 'https://mcp.test/mcp'; + const fetchMock = vi.fn(async () => + new Response( + JSON.stringify({ + data: { + attributes: { + access_token: 'terminal49-local-jwt', + account_id: 'account-123', + }, + }, + }), + { status: 200, headers: { 'Content-Type': 'application/json' } }, + ), + ); + vi.stubGlobal('fetch', fetchMock); + + const { default: handler } = await import('../../../api/mcp.ts'); + const req = createRequest({ + headers: { + host: 'localhost', + authorization: 'Bearer workos-mcp-token', + }, + }); + const res = new MockResponse(); + + await handler(req as any, res as any); + + expect(fetchMock).toHaveBeenCalledWith( + 'https://api.test/v2/auth/mcp/connections/resolve', + expect.objectContaining({ + method: 'POST', + headers: expect.objectContaining({ + 'X-T49-MCP-Resolve-Secret': 'resolve-secret', + }), + body: JSON.stringify({ access_token: 'workos-mcp-token' }), + }), + ); + expect(mockState.serverCreateArgs[0]).toMatchObject({ + apiToken: 'Bearer terminal49-local-jwt', + apiBaseUrl: 'https://api.test/v2', + accountId: 'account-123', + }); + }); + + it('returns a metadata challenge when WorkOS MCP resolve fails', async () => { + process.env.T49_MCP_AUTHKIT_ENABLED = 'true'; + process.env.T49_MCP_RESOLVE_SECRET = 'resolve-secret'; + process.env.T49_MCP_RESOURCE_URL = 'https://mcp.test/mcp'; + vi.stubGlobal( + 'fetch', + vi.fn(async () => new Response(JSON.stringify({ error: 'not connected' }), { status: 401 })), + ); + + const { default: handler } = await import('../../../api/mcp.ts'); + const req = createRequest({ + headers: { + host: 'localhost', + authorization: 'Bearer workos-mcp-token', + }, + }); + const res = new MockResponse(); + + await handler(req as any, res as any); + + expect(res.statusCode).toBe(401); + expect(res.headers['WWW-Authenticate']).toContain( + 'resource_metadata="https://mcp.test/.well-known/oauth-protected-resource"', + ); + expect(mockState.servers).toHaveLength(0); + }); + it('returns 401 when Authorization token does not match T49_MCP_CLIENT_SECRET', async () => { process.env.T49_API_TOKEN = 'env-token-value'; process.env.T49_MCP_CLIENT_SECRET = 'expected-client-secret'; diff --git a/sdks/typescript-sdk/src/client.test.ts b/sdks/typescript-sdk/src/client.test.ts index 184fc181..e7dfa500 100644 --- a/sdks/typescript-sdk/src/client.test.ts +++ b/sdks/typescript-sdk/src/client.test.ts @@ -142,6 +142,26 @@ describe('Terminal49Client', () => { ); }); + it('preserves bearer auth and sends account header when configured', async () => { + const { fetchImpl, calls } = createMockFetch({ + '/containers/abc?include=shipment,pod_terminal': () => + jsonResponse({ data: { id: 'abc', attributes: {} } }), + }); + + const client = new Terminal49Client({ + apiToken: 'Bearer local-jwt', + accountId: 'account-123', + apiBaseUrl: baseUrl, + fetchImpl, + }); + + await client.getContainer('abc'); + + const headers = new Headers(calls[0].init?.headers); + expect(headers.get('Authorization')).toBe('Bearer local-jwt'); + expect(headers.get('x-account-id')).toBe('account-123'); + }); + it('sets include params on shipment and lists shipping lines with search', async () => { const { fetchImpl, calls } = createMockFetch({ '/shipments/ship-1?include=containers,pod_terminal,port_of_lading,port_of_discharge,destination,destination_terminal': diff --git a/sdks/typescript-sdk/src/client.ts b/sdks/typescript-sdk/src/client.ts index b9b9cc2b..fabbcb57 100644 --- a/sdks/typescript-sdk/src/client.ts +++ b/sdks/typescript-sdk/src/client.ts @@ -50,8 +50,10 @@ export { /** Configuration for {@link Terminal49Client}. */ export interface Terminal49ClientConfig { - /** Terminal49 API token. Pass either the raw token or a value prefixed with `Token `. */ + /** Terminal49 API token. Pass either the raw token or a value prefixed with `Token ` or `Bearer `. */ apiToken: string; + /** Account id to send as `x-account-id` for user-scoped bearer tokens. */ + accountId?: string; /** API base URL. Defaults to `https://api.terminal49.com/v2`. */ apiBaseUrl?: string; /** Number of retry attempts for rate-limit and server errors. Defaults to `2`. */ @@ -103,6 +105,7 @@ export class Terminal49Client { this.transport = new Transport({ apiToken: config.apiToken, + accountId: config.accountId, baseUrl, maxRetries: config.maxRetries, fetchImpl: config.fetchImpl, diff --git a/sdks/typescript-sdk/src/client/interceptors.ts b/sdks/typescript-sdk/src/client/interceptors.ts index 3219bc08..8b0b1ee8 100644 --- a/sdks/typescript-sdk/src/client/interceptors.ts +++ b/sdks/typescript-sdk/src/client/interceptors.ts @@ -4,13 +4,19 @@ import { extractErrorMessage, toTerminal49Error } from './errors.js'; export type Interceptor = Middleware; export class AuthInterceptor { - constructor(private apiToken: string) {} + constructor( + private apiToken: string, + private accountId?: string, + ) {} onRequest({ request }: Pick) { - const authHeader = this.apiToken.startsWith('Token ') + const authHeader = this.apiToken.startsWith('Token ') || this.apiToken.startsWith('Bearer ') ? this.apiToken : `Token ${this.apiToken}`; request.headers.set('Authorization', authHeader); + if (this.accountId) { + request.headers.set('x-account-id', this.accountId); + } request.headers.set('Accept', 'application/json'); if (request.body && !request.headers.has('Content-Type')) { request.headers.set('Content-Type', 'application/json'); diff --git a/sdks/typescript-sdk/src/client/transport.ts b/sdks/typescript-sdk/src/client/transport.ts index 6b038766..8310712e 100644 --- a/sdks/typescript-sdk/src/client/transport.ts +++ b/sdks/typescript-sdk/src/client/transport.ts @@ -13,6 +13,7 @@ import { export interface TransportConfig { apiToken: string; + accountId?: string; baseUrl: string; maxRetries?: number; fetchImpl?: typeof fetch; @@ -22,6 +23,7 @@ export type ApiClient = ReturnType>; export class Transport { private apiToken: string; + private accountId?: string; public baseUrl: string; private maxRetries: number; private fetchImpl: typeof fetch; @@ -29,6 +31,7 @@ export class Transport { constructor(config: TransportConfig) { this.apiToken = config.apiToken; + this.accountId = config.accountId; this.baseUrl = config.baseUrl; this.maxRetries = config.maxRetries ?? 2; this.fetchImpl = config.fetchImpl ?? fetch; @@ -38,7 +41,7 @@ export class Transport { fetch: this.fetchImpl, }); - this.client.use(new AuthInterceptor(this.apiToken)); + this.client.use(new AuthInterceptor(this.apiToken, this.accountId)); this.client.use(new ErrorMappingInterceptor()); this.client.use(new RetryInterceptor(this.maxRetries, this.fetchImpl)); } @@ -62,7 +65,7 @@ export class Transport { // or we could construct a Request and run it through the middleware manually. // For search(), which is the only user, we'll just run it directly. const req = new Request(input, init); - const auth = new AuthInterceptor(this.apiToken); + const auth = new AuthInterceptor(this.apiToken, this.accountId); const retry = new RetryInterceptor(this.maxRetries, this.fetchImpl); const errorMap = new ErrorMappingInterceptor(); diff --git a/vercel.json b/vercel.json index 847f57e3..8000aea7 100644 --- a/vercel.json +++ b/vercel.json @@ -6,9 +6,23 @@ "functions": { "api/mcp.ts": { "maxDuration": 30 + }, + "api/oauth-protected-resource.ts": { + "maxDuration": 10 + }, + "api/oauth-authorization-server.ts": { + "maxDuration": 10 } }, "rewrites": [ + { + "source": "/.well-known/oauth-protected-resource", + "destination": "/api/oauth-protected-resource" + }, + { + "source": "/.well-known/oauth-authorization-server", + "destination": "/api/oauth-authorization-server" + }, { "source": "/mcp", "destination": "/api/mcp" From af83ade4407a24dfcc1f59d5fd47dbb31176f0d9 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 10:59:36 -0700 Subject: [PATCH 02/19] Update MCP OAuth gateway for connected clients --- api/mcp.ts | 50 +- api/oauth-protected-resource.ts | 14 +- packages/mcp/OAUTH_TEST_CLIENT.md | 62 + packages/mcp/scripts/oauth-test-client.mjs | 1095 +++++++++++++++++ packages/mcp/tests/api-handler.test.ts | 15 +- .../typescript-sdk/src/client/interceptors.ts | 7 +- 6 files changed, 1210 insertions(+), 33 deletions(-) create mode 100644 packages/mcp/OAUTH_TEST_CLIENT.md create mode 100644 packages/mcp/scripts/oauth-test-client.mjs diff --git a/api/mcp.ts b/api/mcp.ts index 058544be..3a6572a8 100644 --- a/api/mcp.ts +++ b/api/mcp.ts @@ -70,7 +70,7 @@ type ResolvedTerminal49Auth = { authSource: 'authorization' | 'environment' | 'workos_mcp'; }; -type McpConnectionResolutionResponse = { +type ConnectedClientResolutionResponse = { data?: { attributes?: { access_token?: string; @@ -80,20 +80,21 @@ type McpConnectionResolutionResponse = { error?: string; }; -function mcpResourceUrl(): string | undefined { - return process.env.T49_MCP_RESOURCE_URL?.trim() || process.env.WORKOS_MCP_RESOURCE?.trim(); +const DEFAULT_MCP_RESOURCE_URL = 'https://mcp.terminal49.com'; + +function mcpResourceUrl(): string { + return process.env.WORKOS_MCP_RESOURCE?.trim() || + process.env.T49_MCP_RESOURCE_URL?.trim() || + DEFAULT_MCP_RESOURCE_URL; } -function oauthProtectedResourceMetadataUrl(): string | undefined { +function oauthProtectedResourceMetadataUrl(): string { const configured = process.env.T49_MCP_RESOURCE_METADATA_URL?.trim(); if (configured) { return configured; } const resource = mcpResourceUrl(); - if (!resource) { - return undefined; - } try { const url = new URL(resource); @@ -106,13 +107,12 @@ function oauthProtectedResourceMetadataUrl(): string | undefined { function wwwAuthenticateHeader(): string { const metadataUrl = oauthProtectedResourceMetadataUrl(); const parts = [ - 'Bearer error="unauthorized"', + 'Bearer realm="mcp"', + 'error="unauthorized"', 'error_description="Authorization needed"', ]; - if (metadataUrl) { - parts.push(`resource_metadata="${metadataUrl}"`); - } + parts.push(`resource_metadata="${metadataUrl}"`); return parts.join(', '); } @@ -127,43 +127,46 @@ function authKitMcpEnabled(): boolean { function resolveEndpointUrl(): string { const apiBaseUrl = process.env.T49_API_BASE_URL?.trim() || 'https://api.terminal49.com/v2'; - return `${apiBaseUrl.replace(/\/+$/, '')}/auth/mcp/connections/resolve`; + return `${apiBaseUrl.replace(/\/+$/, '')}/connected-clients/resolve`; } -async function resolveWorkosMcpToken( +async function resolveConnectedClientToken( token: string, requestId: string, ): Promise<{ apiToken: string; accountId: string }> { - const resolveSecret = process.env.T49_MCP_RESOLVE_SECRET?.trim(); + const resolveSecret = process.env.T49_CONNECTED_CLIENTS_RESOLVE_SECRET?.trim() || + process.env.T49_MCP_RESOLVE_SECRET?.trim(); if (!resolveSecret) { - throw new Error('T49_MCP_RESOLVE_SECRET must be set when AuthKit MCP auth is enabled.'); + throw new Error( + 'T49_CONNECTED_CLIENTS_RESOLVE_SECRET must be set when AuthKit MCP auth is enabled.', + ); } const response = await fetch(resolveEndpointUrl(), { method: 'POST', headers: { 'Content-Type': 'application/json', - 'X-T49-MCP-Resolve-Secret': resolveSecret, + 'X-T49-Connected-Clients-Resolve-Secret': resolveSecret, 'X-Request-Id': requestId, }, body: JSON.stringify({ access_token: token }), }); - let payload: McpConnectionResolutionResponse = {}; + let payload: ConnectedClientResolutionResponse = {}; try { - payload = (await response.json()) as McpConnectionResolutionResponse; + payload = (await response.json()) as ConnectedClientResolutionResponse; } catch { payload = {}; } if (!response.ok) { - throw new Error(payload.error || `Terminal49 MCP connection resolve failed with ${response.status}`); + throw new Error(payload.error || `Terminal49 connected client resolve failed with ${response.status}`); } const accessToken = payload.data?.attributes?.access_token; const accountId = payload.data?.attributes?.account_id; if (!accessToken || !accountId) { - throw new Error('Terminal49 MCP connection resolve response is missing access_token or account_id.'); + throw new Error('Terminal49 connected client resolve response is missing access_token or account_id.'); } return { apiToken: `Bearer ${accessToken}`, accountId }; @@ -394,7 +397,7 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom if (authKitMcpEnabled() && resolvedAuth.scheme === 'Bearer') { try { - const resolved = await resolveWorkosMcpToken(callerToken, requestId); + const resolved = await resolveConnectedClientToken(callerToken, requestId); resolvedTerminal49Auth = { apiToken: resolved.apiToken, accountId: resolved.accountId, @@ -408,7 +411,10 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom error: 'Unauthorized', message: err.message, }); - logLifecycle('mcp.request.complete', requestId, { reason: 'mcp_connection_resolve_failed' }); + logLifecycle('mcp.request.complete', requestId, { + reason: 'connected_client_resolve_failed', + message: err.message, + }); return; } } else if (configuredApiToken) { diff --git a/api/oauth-protected-resource.ts b/api/oauth-protected-resource.ts index a03cd204..eefc3275 100644 --- a/api/oauth-protected-resource.ts +++ b/api/oauth-protected-resource.ts @@ -11,15 +11,25 @@ type ResponseLike = { end(): void; } & ServerResponse; +const DEFAULT_MCP_RESOURCE_URL = 'https://mcp.terminal49.com'; + function resourceUrl(req: RequestLike): string { - const configured = process.env.T49_MCP_RESOURCE_URL?.trim() || process.env.WORKOS_MCP_RESOURCE?.trim(); + const configured = process.env.WORKOS_MCP_RESOURCE?.trim() || process.env.T49_MCP_RESOURCE_URL?.trim(); if (configured) { return configured.replace(/\/+$/, ''); } const host = req.headers.host; + if (!host) { + return DEFAULT_MCP_RESOURCE_URL; + } + const protocol = host?.startsWith('localhost') || host?.startsWith('127.0.0.1') ? 'http' : 'https'; - return `${protocol}://${host}/mcp`; + if (protocol === 'http') { + return `${protocol}://${host}`; + } + + return DEFAULT_MCP_RESOURCE_URL; } export default function handler(req: RequestLike, res: ResponseLike): void { diff --git a/packages/mcp/OAUTH_TEST_CLIENT.md b/packages/mcp/OAUTH_TEST_CLIENT.md new file mode 100644 index 00000000..e2dbe318 --- /dev/null +++ b/packages/mcp/OAUTH_TEST_CLIENT.md @@ -0,0 +1,62 @@ +# MCP OAuth Test Client + +Run a local OAuth 2.1 client for the hosted MCP flow: + +```sh +node packages/mcp/scripts/oauth-test-client.mjs +``` + +Open `http://localhost:8787`, click `Authorize`, complete the WorkOS flow, then use the MCP buttons to call the resource with the issued access token. + +## WorkOS prerequisites + +In the WorkOS environment used by `WORKOS_AUTHORIZATION_SERVER_URL`: + +- Enable MCP Auth with Client ID Metadata Document (CIMD). Keep Dynamic Client Registration (DCR) enabled for clients that do not yet support CIMD. +- Add `https://mcp.terminal49.com` as an MCP resource indicator. + +Without the resource indicator, WorkOS issues the environment default audience instead of the MCP resource audience, and Terminal49 rejects the token. + +## Defaults + +- Client URL: `http://localhost:8787` +- Redirect URI: `http://localhost:8787/callback` +- MCP resource: `https://mcp.terminal49.com` +- Scope: `openid profile email offline_access` +- Client auth: public client with PKCE + +## Environment + +```sh +MCP_OAUTH_RESOURCE_URL=https://mcp.terminal49.com \ +MCP_OAUTH_CLIENT_BASE_URL=http://localhost:8787 \ +node packages/mcp/scripts/oauth-test-client.mjs +``` + +Useful overrides: + +- `PORT`: local port, default `8787` +- `HOST`: local bind host, default `127.0.0.1` +- `MCP_OAUTH_RESOURCE_URL`: MCP resource URI, sent as the OAuth `resource` parameter +- `MCP_OAUTH_MCP_ENDPOINT_URL`: MCP HTTP endpoint to call after OAuth, defaults to `MCP_OAUTH_RESOURCE_URL` +- `MCP_OAUTH_PROTECTED_RESOURCE_METADATA_URL`: explicit protected-resource metadata URL +- `MCP_OAUTH_AUTHORIZATION_SERVER_URL`: explicit authorization server issuer +- `MCP_OAUTH_SCOPE`: OAuth scopes +- `MCP_OAUTH_CLIENT_ID`: manually configured OAuth client id +- `MCP_OAUTH_CLIENT_SECRET`: optional client secret +- `MCP_OAUTH_CLIENT_AUTH_METHOD`: `none`, `client_secret_post`, or `client_secret_basic` +- `MCP_OAUTH_DYNAMIC_REGISTRATION`: set `false` to disable DCR + +## Registration Modes + +By default the client discovers the authorization server from `/.well-known/oauth-protected-resource` and uses Dynamic Client Registration if the metadata exposes `registration_endpoint`. + +Use DCR or CIMD for MCP testing. A manually configured `MCP_OAUTH_CLIENT_ID` is useful for generic OAuth client testing, but may not exercise WorkOS' MCP resource-indicator behavior. + +For CIMD testing, the app serves metadata at: + +```txt +http://localhost:8787/client-metadata.json +``` + +Because WorkOS cannot fetch your localhost URL from the cloud, expose this through a public HTTPS tunnel and use that tunnel URL as the OAuth `client_id`. diff --git a/packages/mcp/scripts/oauth-test-client.mjs b/packages/mcp/scripts/oauth-test-client.mjs new file mode 100644 index 00000000..33ef87a2 --- /dev/null +++ b/packages/mcp/scripts/oauth-test-client.mjs @@ -0,0 +1,1095 @@ +#!/usr/bin/env node + +import { createHash, randomBytes } from 'node:crypto'; +import { createServer } from 'node:http'; + +const DEFAULT_PORT = 8787; +const DEFAULT_HOST = '127.0.0.1'; +const DEFAULT_RESOURCE_URL = 'https://mcp.terminal49.com'; +const DEFAULT_SCOPE = 'openid profile email offline_access'; +const DEFAULT_CLIENT_NAME = 'Terminal49 MCP OAuth Test Client'; +const DEFAULT_CALLBACK_PATH = '/callback'; +const DEFAULT_MCP_PROTOCOL_VERSION = '2025-06-18'; +const SESSION_COOKIE = 't49_mcp_oauth_test_session'; +const STATE_TTL_MS = 10 * 60 * 1000; + +const sessions = new Map(); +const registeredClients = new Map(); + +const settings = { + port: numberEnv('PORT', DEFAULT_PORT), + host: stringEnv('HOST', DEFAULT_HOST), + baseUrl: trimTrailingSlash( + stringEnv( + 'MCP_OAUTH_CLIENT_BASE_URL', + `http://localhost:${numberEnv('PORT', DEFAULT_PORT)}`, + ), + ), + callbackPath: stringEnv('MCP_OAUTH_CALLBACK_PATH', DEFAULT_CALLBACK_PATH), + resourceUrl: trimTrailingSlash(stringEnv('MCP_OAUTH_RESOURCE_URL', DEFAULT_RESOURCE_URL)), + mcpEndpointUrl: trimTrailingSlash(stringEnv( + 'MCP_OAUTH_MCP_ENDPOINT_URL', + stringEnv('MCP_OAUTH_RESOURCE_URL', DEFAULT_RESOURCE_URL), + )), + protectedResourceMetadataUrl: optionalEnv('MCP_OAUTH_PROTECTED_RESOURCE_METADATA_URL'), + authorizationServerUrl: optionalEnv('MCP_OAUTH_AUTHORIZATION_SERVER_URL'), + scope: stringEnv('MCP_OAUTH_SCOPE', DEFAULT_SCOPE), + clientName: stringEnv('MCP_OAUTH_CLIENT_NAME', DEFAULT_CLIENT_NAME), + clientId: optionalEnv('MCP_OAUTH_CLIENT_ID'), + clientSecret: optionalEnv('MCP_OAUTH_CLIENT_SECRET'), + clientAuthMethod: optionalEnv('MCP_OAUTH_CLIENT_AUTH_METHOD'), + dynamicRegistration: booleanEnv('MCP_OAUTH_DYNAMIC_REGISTRATION', true), + registerEveryRun: booleanEnv('MCP_OAUTH_REGISTER_EVERY_RUN', false), + mcpProtocolVersion: stringEnv('MCP_PROTOCOL_VERSION', DEFAULT_MCP_PROTOCOL_VERSION), +}; + +function optionalEnv(name) { + const value = process.env[name]?.trim(); + return value ? value : undefined; +} + +function stringEnv(name, fallback) { + return optionalEnv(name) ?? fallback; +} + +function numberEnv(name, fallback) { + const value = optionalEnv(name); + if (!value) { + return fallback; + } + + const parsed = Number.parseInt(value, 10); + return Number.isFinite(parsed) ? parsed : fallback; +} + +function booleanEnv(name, fallback) { + const value = optionalEnv(name); + if (!value) { + return fallback; + } + + return !['0', 'false', 'no'].includes(value.toLowerCase()); +} + +function trimTrailingSlash(value) { + return value.replace(/\/+$/, ''); +} + +function callbackUrl() { + return `${settings.baseUrl}${settings.callbackPath}`; +} + +function base64Url(buffer) { + return Buffer.from(buffer) + .toString('base64') + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=+$/g, ''); +} + +function sha256(input) { + return createHash('sha256').update(input).digest(); +} + +function randomUrlToken(byteLength = 32) { + return base64Url(randomBytes(byteLength)); +} + +function parseCookies(header) { + return Object.fromEntries( + (header ?? '') + .split(';') + .map((item) => item.trim()) + .filter(Boolean) + .map((item) => { + const separator = item.indexOf('='); + if (separator === -1) { + return [item, '']; + } + + return [ + decodeURIComponent(item.slice(0, separator)), + decodeURIComponent(item.slice(separator + 1)), + ]; + }), + ); +} + +function getSession(req, res) { + const cookies = parseCookies(req.headers.cookie); + const existingId = cookies[SESSION_COOKIE]; + const sessionId = existingId && sessions.has(existingId) ? existingId : randomUrlToken(24); + + if (!sessions.has(sessionId)) { + sessions.set(sessionId, { + pendingStates: new Map(), + tokenResponse: undefined, + discovery: undefined, + client: undefined, + messages: [], + }); + } + + res.setHeader( + 'Set-Cookie', + `${SESSION_COOKIE}=${encodeURIComponent(sessionId)}; Path=/; HttpOnly; SameSite=Lax`, + ); + + return sessions.get(sessionId); +} + +function sendJson(res, statusCode, payload, extraHeaders = {}) { + res.writeHead(statusCode, { + 'Content-Type': 'application/json; charset=utf-8', + 'Cache-Control': 'no-store', + ...extraHeaders, + }); + res.end(JSON.stringify(payload, null, 2)); +} + +function sendHtml(res, statusCode, body) { + res.writeHead(statusCode, { + 'Content-Type': 'text/html; charset=utf-8', + 'Cache-Control': 'no-store', + }); + res.end(body); +} + +function redirect(res, location) { + res.writeHead(302, { + Location: location, + 'Cache-Control': 'no-store', + }); + res.end(); +} + +function escapeHtml(value) { + return String(value) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +async function readBody(req) { + const chunks = []; + let size = 0; + + for await (const chunk of req) { + size += chunk.length; + if (size > 1_000_000) { + throw new Error('Request body is too large.'); + } + + chunks.push(chunk); + } + + const rawBody = Buffer.concat(chunks).toString('utf8'); + const contentType = req.headers['content-type'] ?? ''; + + if (contentType.includes('application/json')) { + return rawBody ? JSON.parse(rawBody) : {}; + } + + return Object.fromEntries(new URLSearchParams(rawBody)); +} + +function protectedResourceMetadataUrl() { + if (settings.protectedResourceMetadataUrl) { + return settings.protectedResourceMetadataUrl; + } + + const resource = new URL(settings.resourceUrl); + return `${resource.origin}/.well-known/oauth-protected-resource`; +} + +async function fetchJson(url, label, options = {}) { + const response = await fetch(url, { + ...options, + headers: { + Accept: 'application/json', + ...(options.headers ?? {}), + }, + }); + const text = await response.text(); + let payload; + + try { + payload = text ? JSON.parse(text) : {}; + } catch { + payload = { raw: text }; + } + + if (!response.ok) { + const error = new Error(`${label} request failed with HTTP ${response.status}`); + error.statusCode = response.status; + error.payload = payload; + throw error; + } + + return payload; +} + +async function discoverOAuthMetadata() { + const resourceMetadata = await fetchJson( + protectedResourceMetadataUrl(), + 'Protected resource metadata', + ); + const authorizationServer = + settings.authorizationServerUrl || + resourceMetadata.authorization_servers?.[0]; + + if (!authorizationServer) { + throw new Error('Protected resource metadata did not include authorization_servers.'); + } + + const authServerMetadataUrl = `${trimTrailingSlash(authorizationServer)}/.well-known/oauth-authorization-server`; + const authorizationServerMetadata = await fetchJson( + authServerMetadataUrl, + 'Authorization server metadata', + ); + + return { + protectedResourceMetadataUrl: protectedResourceMetadataUrl(), + protectedResourceMetadata: resourceMetadata, + authorizationServer, + authorizationServerMetadataUrl: authServerMetadataUrl, + authorizationServerMetadata, + }; +} + +function localClientMetadata() { + return { + client_name: settings.clientName, + redirect_uris: [callbackUrl()], + grant_types: ['authorization_code', 'refresh_token'], + response_types: ['code'], + token_endpoint_auth_method: 'none', + scope: settings.scope, + }; +} + +async function resolveOAuthClient(discovery) { + if (settings.clientId) { + return { + source: 'environment', + client_id: settings.clientId, + client_secret: settings.clientSecret, + token_endpoint_auth_method: + settings.clientAuthMethod || + (settings.clientSecret ? 'client_secret_post' : 'none'), + }; + } + + const registrationEndpoint = discovery.authorizationServerMetadata.registration_endpoint; + if (!settings.dynamicRegistration || !registrationEndpoint) { + throw new Error( + [ + 'No OAuth client is configured.', + 'Set MCP_OAUTH_CLIENT_ID or enable Dynamic Client Registration in the authorization server.', + `This app also serves a client metadata document at ${settings.baseUrl}/client-metadata.json for CIMD testing through a public tunnel.`, + ].join(' '), + ); + } + + const cacheKey = [ + discovery.authorizationServerMetadata.issuer ?? discovery.authorizationServer, + callbackUrl(), + settings.resourceUrl, + settings.scope, + ].join('|'); + + if (!settings.registerEveryRun && registeredClients.has(cacheKey)) { + return registeredClients.get(cacheKey); + } + + const response = await fetch(registrationEndpoint, { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify(localClientMetadata()), + }); + const responseText = await response.text(); + let registrationResponse; + + try { + registrationResponse = responseText ? JSON.parse(responseText) : {}; + } catch { + registrationResponse = { raw: responseText }; + } + + if (!response.ok) { + const error = new Error(`Dynamic Client Registration failed with HTTP ${response.status}`); + error.statusCode = response.status; + error.payload = registrationResponse; + throw error; + } + + if (!registrationResponse.client_id) { + throw new Error('Dynamic Client Registration response did not include client_id.'); + } + + const client = { + source: 'dynamic_registration', + registration_endpoint: registrationEndpoint, + registration_response: registrationResponse, + client_id: registrationResponse.client_id, + client_secret: registrationResponse.client_secret, + token_endpoint_auth_method: + registrationResponse.token_endpoint_auth_method || + (registrationResponse.client_secret ? 'client_secret_post' : 'none'), + }; + + registeredClients.set(cacheKey, client); + return client; +} + +function authorizationUrl(discovery, client, state, codeChallenge) { + const endpoint = discovery.authorizationServerMetadata.authorization_endpoint; + if (!endpoint) { + throw new Error('Authorization server metadata did not include authorization_endpoint.'); + } + + const url = new URL(endpoint); + url.searchParams.set('response_type', 'code'); + url.searchParams.set('client_id', client.client_id); + url.searchParams.set('redirect_uri', callbackUrl()); + url.searchParams.set('scope', settings.scope); + url.searchParams.set('state', state); + url.searchParams.set('code_challenge', codeChallenge); + url.searchParams.set('code_challenge_method', 'S256'); + url.searchParams.set('resource', settings.resourceUrl); + return url.toString(); +} + +async function exchangeAuthorizationCode(discovery, client, code, codeVerifier) { + const endpoint = discovery.authorizationServerMetadata.token_endpoint; + if (!endpoint) { + throw new Error('Authorization server metadata did not include token_endpoint.'); + } + + const body = new URLSearchParams({ + grant_type: 'authorization_code', + code, + redirect_uri: callbackUrl(), + client_id: client.client_id, + code_verifier: codeVerifier, + resource: settings.resourceUrl, + }); + const headers = { + Accept: 'application/json', + 'Content-Type': 'application/x-www-form-urlencoded', + }; + + applyClientAuthentication(headers, body, client); + + const response = await fetch(endpoint, { + method: 'POST', + headers, + body, + }); + const responseText = await response.text(); + let payload; + + try { + payload = responseText ? JSON.parse(responseText) : {}; + } catch { + payload = { raw: responseText }; + } + + if (!response.ok) { + const error = new Error(`Token exchange failed with HTTP ${response.status}`); + error.statusCode = response.status; + error.payload = payload; + throw error; + } + + return payload; +} + +async function refreshToken(discovery, client, tokenResponse) { + if (!tokenResponse?.refresh_token) { + throw new Error('No refresh_token is available.'); + } + + const endpoint = discovery.authorizationServerMetadata.token_endpoint; + const body = new URLSearchParams({ + grant_type: 'refresh_token', + refresh_token: tokenResponse.refresh_token, + client_id: client.client_id, + resource: settings.resourceUrl, + }); + const headers = { + Accept: 'application/json', + 'Content-Type': 'application/x-www-form-urlencoded', + }; + + applyClientAuthentication(headers, body, client); + + const response = await fetch(endpoint, { + method: 'POST', + headers, + body, + }); + const responseText = await response.text(); + let payload; + + try { + payload = responseText ? JSON.parse(responseText) : {}; + } catch { + payload = { raw: responseText }; + } + + if (!response.ok) { + const error = new Error(`Refresh token exchange failed with HTTP ${response.status}`); + error.statusCode = response.status; + error.payload = payload; + throw error; + } + + return payload; +} + +function applyClientAuthentication(headers, body, client) { + const method = client.token_endpoint_auth_method || 'none'; + if (method === 'none') { + return; + } + + if (!client.client_secret) { + throw new Error(`Client authentication method ${method} requires a client_secret.`); + } + + if (method === 'client_secret_basic') { + const credentials = Buffer.from(`${client.client_id}:${client.client_secret}`).toString('base64'); + headers.Authorization = `Basic ${credentials}`; + return; + } + + if (method === 'client_secret_post') { + body.set('client_secret', client.client_secret); + return; + } + + throw new Error(`Unsupported token endpoint authentication method: ${method}`); +} + +function decodeJwtPayload(token) { + if (!token || token.split('.').length < 2) { + return undefined; + } + + try { + return JSON.parse(Buffer.from(token.split('.')[1], 'base64url').toString('utf8')); + } catch { + return undefined; + } +} + +function redactToken(value) { + if (!value || typeof value !== 'string') { + return value; + } + + if (value.length <= 24) { + return '[redacted]'; + } + + return `${value.slice(0, 12)}...${value.slice(-8)}`; +} + +function redactedTokenResponse(tokenResponse) { + if (!tokenResponse) { + return undefined; + } + + return Object.fromEntries( + Object.entries(tokenResponse).map(([key, value]) => [ + key, + key.endsWith('token') ? redactToken(value) : value, + ]), + ); +} + +function redactedClient(client) { + if (!client) { + return undefined; + } + + return { + ...client, + client_secret: client.client_secret ? '[redacted]' : undefined, + registration_response: client.registration_response + ? redactedTokenResponse(client.registration_response) + : undefined, + }; +} + +async function callMcp(tokenResponse, method, params = {}) { + if (!tokenResponse?.access_token) { + throw new Error('No access_token is available.'); + } + + const payload = { + jsonrpc: '2.0', + id: Date.now(), + method, + params, + }; + + const response = await fetch(settings.mcpEndpointUrl, { + method: 'POST', + headers: { + Accept: 'application/json, text/event-stream', + Authorization: `Bearer ${tokenResponse.access_token}`, + 'Content-Type': 'application/json', + 'MCP-Protocol-Version': settings.mcpProtocolVersion, + }, + body: JSON.stringify(payload), + }); + const text = await response.text(); + let body; + + try { + body = text ? JSON.parse(text) : undefined; + } catch { + body = text; + } + + return { + status: response.status, + ok: response.ok, + headers: { + 'www-authenticate': response.headers.get('www-authenticate'), + 'mcp-session-id': response.headers.get('mcp-session-id'), + 'content-type': response.headers.get('content-type'), + }, + body, + }; +} + +function initializeParams() { + return { + protocolVersion: settings.mcpProtocolVersion, + capabilities: {}, + clientInfo: { + name: 'terminal49-mcp-oauth-test-client', + version: '0.1.0', + }, + }; +} + +function page(session) { + const tokenPayload = decodeJwtPayload(session.tokenResponse?.access_token); + const hasToken = Boolean(session.tokenResponse?.access_token); + const messages = session.messages.splice(0); + + return ` + + + + + Terminal49 MCP OAuth Test Client + + + +
+
+
+

Terminal49 MCP OAuth Test Client

+
+ ${hasToken ? 'Authorized' : 'No Token'} +
+ + ${messages.map((message) => `

${escapeHtml(message)}

`).join('')} + +
+
+

OAuth

+
+
Resource
+
${escapeHtml(settings.resourceUrl)}
+
MCP Endpoint
+
${escapeHtml(settings.mcpEndpointUrl)}
+
Metadata
+
${escapeHtml(protectedResourceMetadataUrl())}
+
Redirect URI
+
${escapeHtml(callbackUrl())}
+
Client Source
+
${escapeHtml(session.client?.source ?? (settings.clientId ? 'environment' : 'pending'))}
+
+
+ Authorize + + + +
+
+ +
+

Token

+
+
Type
+
${escapeHtml(session.tokenResponse?.token_type ?? '')}
+
Expires In
+
${escapeHtml(session.tokenResponse?.expires_in ?? '')}
+
Scope
+
${escapeHtml(session.tokenResponse?.scope ?? '')}
+
Subject
+
${escapeHtml(tokenPayload?.sub ?? '')}
+
Audience
+
${escapeHtml(JSON.stringify(tokenPayload?.aud ?? ''))}
+
Account Claim
+
${escapeHtml(tokenPayload?.['urn:terminal49:account_id'] ?? tokenPayload?.account_id ?? '')}
+
+
+ +
+

MCP

+
+ + + + +
+ +
+ +
+

Output

+
${escapeHtml(JSON.stringify({
+            settings: visibleSettings(),
+            client: redactedClient(session.client),
+            token: redactedTokenResponse(session.tokenResponse),
+            token_payload: tokenPayload,
+            last_error: session.lastError,
+          }, null, 2))}
+
+
+
+ + +`; +} + +function visibleSettings() { + return { + base_url: settings.baseUrl, + callback_url: callbackUrl(), + resource_url: settings.resourceUrl, + mcp_endpoint_url: settings.mcpEndpointUrl, + protected_resource_metadata_url: protectedResourceMetadataUrl(), + scope: settings.scope, + dynamic_registration: settings.dynamicRegistration, + configured_client_id: settings.clientId ? '[set]' : '[not set]', + configured_client_secret: settings.clientSecret ? '[set]' : '[not set]', + }; +} + +async function handleAuthorize(res, session) { + const discovery = await discoverOAuthMetadata(); + const client = await resolveOAuthClient(discovery); + const state = randomUrlToken(32); + const codeVerifier = randomUrlToken(64); + const codeChallenge = base64Url(sha256(codeVerifier)); + + session.discovery = discovery; + session.client = client; + session.pendingStates.set(state, { + codeVerifier, + createdAt: Date.now(), + }); + + redirect(res, authorizationUrl(discovery, client, state, codeChallenge)); +} + +async function handleCallback(url, res, session) { + const error = url.searchParams.get('error'); + if (error) { + const description = url.searchParams.get('error_description') || error; + throw new Error(`Authorization failed: ${description}`); + } + + const code = url.searchParams.get('code'); + const state = url.searchParams.get('state'); + if (!code || !state) { + throw new Error('Callback is missing code or state.'); + } + + const pending = session.pendingStates.get(state); + if (!pending) { + throw new Error('OAuth state was not found.'); + } + + session.pendingStates.delete(state); + if (Date.now() - pending.createdAt > STATE_TTL_MS) { + throw new Error('OAuth state expired.'); + } + + const discovery = session.discovery ?? await discoverOAuthMetadata(); + const client = session.client ?? await resolveOAuthClient(discovery); + const tokenResponse = await exchangeAuthorizationCode(discovery, client, code, pending.codeVerifier); + + session.discovery = discovery; + session.client = client; + session.tokenResponse = tokenResponse; + session.messages.push('Authorization completed.'); + redirect(res, '/'); +} + +async function handleRefresh(res, session) { + const discovery = session.discovery ?? await discoverOAuthMetadata(); + const client = session.client ?? await resolveOAuthClient(discovery); + const tokenResponse = await refreshToken(discovery, client, session.tokenResponse); + + session.discovery = discovery; + session.client = client; + session.tokenResponse = { + ...session.tokenResponse, + ...tokenResponse, + refresh_token: tokenResponse.refresh_token ?? session.tokenResponse?.refresh_token, + }; + sendJson(res, 200, { + token: redactedTokenResponse(session.tokenResponse), + token_payload: decodeJwtPayload(session.tokenResponse.access_token), + }); +} + +async function handleMcpCall(req, res, session) { + const body = await readBody(req); + const method = body.method || 'tools/list'; + const params = body.params ?? {}; + const result = await callMcp(session.tokenResponse, method, params); + sendJson(res, result.ok ? 200 : 502, result); +} + +function clearSession(session) { + session.pendingStates.clear(); + session.tokenResponse = undefined; + session.discovery = undefined; + session.client = undefined; + session.messages.push('Session cleared.'); +} + +async function route(req, res) { + const session = getSession(req, res); + const url = new URL(req.url, settings.baseUrl); + + try { + if (req.method === 'GET' && url.pathname === '/') { + sendHtml(res, 200, page(session)); + return; + } + + if (req.method === 'GET' && url.pathname === '/healthz') { + sendJson(res, 200, { ok: true }); + return; + } + + if (req.method === 'GET' && url.pathname === '/client-metadata.json') { + sendJson(res, 200, localClientMetadata()); + return; + } + + if (req.method === 'GET' && url.pathname === '/api/discovery') { + const discovery = await discoverOAuthMetadata(); + session.discovery = discovery; + sendJson(res, 200, discovery); + return; + } + + if (req.method === 'GET' && url.pathname === '/authorize') { + await handleAuthorize(res, session); + return; + } + + if (req.method === 'GET' && url.pathname === settings.callbackPath) { + await handleCallback(url, res, session); + return; + } + + if (req.method === 'POST' && url.pathname === '/api/refresh') { + await handleRefresh(res, session); + return; + } + + if (req.method === 'POST' && url.pathname === '/api/mcp-call') { + await handleMcpCall(req, res, session); + return; + } + + if (req.method === 'POST' && url.pathname === '/api/clear') { + clearSession(session); + sendJson(res, 200, { ok: true }); + return; + } + + sendJson(res, 404, { error: 'Not found' }); + } catch (error) { + const payload = { + error: error.message, + status_code: error.statusCode, + payload: error.payload, + }; + session.lastError = payload; + console.error(JSON.stringify({ event: 'oauth_test_client.error', ...payload })); + + if (req.headers.accept?.includes('text/html')) { + session.messages.push(error.message); + sendHtml(res, 500, page(session)); + return; + } + + sendJson(res, 500, payload); + } +} + +const server = createServer((req, res) => { + void route(req, res); +}); + +server.listen(settings.port, settings.host, () => { + const localUrl = `http://${settings.host}:${settings.port}`; + console.log(`MCP OAuth test client listening on ${localUrl}`); + console.log(`Browser URL: ${settings.baseUrl}`); + console.log(`Redirect URI: ${callbackUrl()}`); + console.log(`MCP resource: ${settings.resourceUrl}`); +}); diff --git a/packages/mcp/tests/api-handler.test.ts b/packages/mcp/tests/api-handler.test.ts index 9aa885fb..e9149032 100644 --- a/packages/mcp/tests/api-handler.test.ts +++ b/packages/mcp/tests/api-handler.test.ts @@ -99,8 +99,10 @@ describe('api/mcp handler lifecycle', () => { delete process.env.T49_API_TOKEN; delete process.env.T49_MCP_CLIENT_SECRET; delete process.env.T49_MCP_AUTHKIT_ENABLED; + delete process.env.T49_CONNECTED_CLIENTS_RESOLVE_SECRET; delete process.env.T49_MCP_RESOLVE_SECRET; delete process.env.T49_MCP_RESOURCE_URL; + delete process.env.WORKOS_MCP_RESOURCE; delete process.env.T49_API_BASE_URL; delete process.env.T49_MCP_ALLOWED_HOSTS; delete process.env.T49_MCP_ALLOWED_ORIGINS; @@ -239,9 +241,9 @@ describe('api/mcp handler lifecycle', () => { it('resolves WorkOS MCP bearer tokens into Terminal49 bearer account context', async () => { process.env.T49_MCP_AUTHKIT_ENABLED = 'true'; - process.env.T49_MCP_RESOLVE_SECRET = 'resolve-secret'; + process.env.T49_CONNECTED_CLIENTS_RESOLVE_SECRET = 'resolve-secret'; process.env.T49_API_BASE_URL = 'https://api.test/v2'; - process.env.T49_MCP_RESOURCE_URL = 'https://mcp.test/mcp'; + process.env.WORKOS_MCP_RESOURCE = 'https://mcp.test'; const fetchMock = vi.fn(async () => new Response( JSON.stringify({ @@ -269,11 +271,11 @@ describe('api/mcp handler lifecycle', () => { await handler(req as any, res as any); expect(fetchMock).toHaveBeenCalledWith( - 'https://api.test/v2/auth/mcp/connections/resolve', + 'https://api.test/v2/connected-clients/resolve', expect.objectContaining({ method: 'POST', headers: expect.objectContaining({ - 'X-T49-MCP-Resolve-Secret': 'resolve-secret', + 'X-T49-Connected-Clients-Resolve-Secret': 'resolve-secret', }), body: JSON.stringify({ access_token: 'workos-mcp-token' }), }), @@ -287,8 +289,8 @@ describe('api/mcp handler lifecycle', () => { it('returns a metadata challenge when WorkOS MCP resolve fails', async () => { process.env.T49_MCP_AUTHKIT_ENABLED = 'true'; - process.env.T49_MCP_RESOLVE_SECRET = 'resolve-secret'; - process.env.T49_MCP_RESOURCE_URL = 'https://mcp.test/mcp'; + process.env.T49_CONNECTED_CLIENTS_RESOLVE_SECRET = 'resolve-secret'; + process.env.WORKOS_MCP_RESOURCE = 'https://mcp.test'; vi.stubGlobal( 'fetch', vi.fn(async () => new Response(JSON.stringify({ error: 'not connected' }), { status: 401 })), @@ -306,6 +308,7 @@ describe('api/mcp handler lifecycle', () => { await handler(req as any, res as any); expect(res.statusCode).toBe(401); + expect(res.headers['WWW-Authenticate']).toContain('Bearer realm="mcp"'); expect(res.headers['WWW-Authenticate']).toContain( 'resource_metadata="https://mcp.test/.well-known/oauth-protected-resource"', ); diff --git a/sdks/typescript-sdk/src/client/interceptors.ts b/sdks/typescript-sdk/src/client/interceptors.ts index 8b0b1ee8..bce27f6b 100644 --- a/sdks/typescript-sdk/src/client/interceptors.ts +++ b/sdks/typescript-sdk/src/client/interceptors.ts @@ -10,9 +10,10 @@ export class AuthInterceptor { ) {} onRequest({ request }: Pick) { - const authHeader = this.apiToken.startsWith('Token ') || this.apiToken.startsWith('Bearer ') - ? this.apiToken - : `Token ${this.apiToken}`; + const authHeader = + this.apiToken.startsWith('Token ') || this.apiToken.startsWith('Bearer ') + ? this.apiToken + : `Token ${this.apiToken}`; request.headers.set('Authorization', authHeader); if (this.accountId) { request.headers.set('x-account-id', this.accountId); From d0e0827015206a724032d9e1209a71ce321ffa5f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 19 Jun 2026 18:00:04 +0000 Subject: [PATCH 03/19] chore: Auto-generate Postman collection from openapi.json [skip ci] --- Terminal49-API.postman_collection.json | 612 ++++++++++++------------- 1 file changed, 306 insertions(+), 306 deletions(-) diff --git a/Terminal49-API.postman_collection.json b/Terminal49-API.postman_collection.json index fc8018b3..79e7f12b 100644 --- a/Terminal49-API.postman_collection.json +++ b/Terminal49-API.postman_collection.json @@ -5,7 +5,7 @@ "description": "", "item": [ { - "id": "b7d1da84-86a8-498d-9571-94debd7dad75", + "id": "55fd5a15-3b49-4fe4-94df-a2215d427139", "name": "List containers", "request": { "name": "List containers", @@ -63,7 +63,7 @@ }, "response": [ { - "id": "361ed19a-7af3-4db0-b5bd-dc2a77629e08", + "id": "0a3798e9-211a-4c8f-9ea7-6b1066b818e0", "name": "OK", "originalRequest": { "url": { @@ -129,7 +129,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"bulk\",\n \"equipment_length\": 20,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"delivered\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"flat rack\",\n \"equipment_length\": 10,\n \"equipment_height\": null,\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"picked_up\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_full_out_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"cancelled_by_user\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"tank\",\n \"equipment_length\": 10,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"on_ship\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"dry\",\n \"equipment_length\": 10,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"on_rail\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"no_updates_at_line\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -140,7 +140,7 @@ } }, { - "id": "43e213a9-06ea-40ec-a606-3041720e8b47", + "id": "cdb4b748-532a-4ef1-941c-34e23c8fc20b", "name": "Edit a container", "request": { "name": "Edit a container", @@ -183,7 +183,7 @@ }, "response": [ { - "id": "9135e71c-dd9f-4079-9c96-08665dc56b5a", + "id": "c0b34439-c0cd-4adb-b31f-1906da2936d7", "name": "OK", "originalRequest": { "url": { @@ -234,7 +234,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"tank\",\n \"equipment_length\": 40,\n \"equipment_height\": null,\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"loaded\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": null,\n \"equipment_length\": 45,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"grounded\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -245,7 +245,7 @@ } }, { - "id": "824b8dd7-f555-45b3-ac25-52c29c321f25", + "id": "d9c97c32-fe1a-463c-bf57-5b4b537d8aad", "name": "Get a container", "request": { "name": "Get a container", @@ -297,7 +297,7 @@ }, "response": [ { - "id": "58db41d2-044d-4c61-aa5d-b7d961e3a2da", + "id": "bfb42062-b7da-47ed-879c-5dcb1c3010fa", "name": "OK", "originalRequest": { "url": { @@ -357,7 +357,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"flat rack\",\n \"equipment_length\": 45,\n \"equipment_height\": null,\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"empty_returned\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_full_out_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": null,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"dropped\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"booking_cancelled\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"no_updates_at_line\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -368,7 +368,7 @@ } }, { - "id": "dd57b7f6-1b2e-4f59-8de1-186247a14cdc", + "id": "199d96d0-7587-4973-a8e0-2da2c32a8521", "name": "Get a container's raw events", "request": { "name": "Get a container's raw events", @@ -411,7 +411,7 @@ }, "response": [ { - "id": "96606a53-0654-47d8-876f-a9fea22473b4", + "id": "20b7b2af-088b-44d8-9349-c67d87894235", "name": "OK", "originalRequest": { "url": { @@ -462,7 +462,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"full_out\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"metro_area\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"feeder_discharged\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"metro_area\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"arrived_at_destination\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\",\n \"attributes\": {\n \"event\": \"empty_out\",\n \"original_event\": \"\",\n \"timestamp\": \"\",\n \"estimated\": \"\",\n \"actual_on\": \"\",\n \"estimated_on\": \"\",\n \"actual_at\": \"\",\n \"estimated_at\": \"\",\n \"timezone\": \"\",\n \"created_at\": \"\",\n \"location_name\": \"\",\n \"location_locode\": \"\",\n \"vessel_name\": \"\",\n \"vessel_imo\": \"\",\n \"index\": \"\",\n \"voyage_number\": \"\"\n },\n \"relationships\": {\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"vessel\"\n }\n }\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -473,7 +473,7 @@ } }, { - "id": "31355b30-f292-43ca-bd7b-4b86fabc3686", + "id": "ed79b944-c244-41f2-9108-4612583da67e", "name": "Get a container's transport events", "request": { "name": "Get a container's transport events", @@ -526,7 +526,7 @@ }, "response": [ { - "id": "644014ac-831c-43ee-886b-116c21dc9013", + "id": "6127fca8-440c-4fb9-881a-96acf0b50b01", "name": "OK", "originalRequest": { "url": { @@ -587,7 +587,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.pickup_lfd_terminal.changed\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"terminal\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.vessel_loaded\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"ais\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"metro_area\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_full_out_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.transshipment_arrived\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"terminal\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"rail_terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\",\n \"attributes\": {\n \"event\": \"container.transport.estimated.arrived_at_inland_destination\",\n \"voyage_number\": \"\",\n \"timestamp\": \"\",\n \"timezone\": \"\",\n \"location_locode\": \"\",\n \"created_at\": \"\",\n \"data_source\": \"ais\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"location\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"port\"\n }\n },\n \"vessel\": {\n \"data\": {\n \"id\": \"\",\n \"name\": \"vessel\"\n }\n },\n \"terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"container\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container\"\n }\n }\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"all_containers_terminated\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"cancelled_by_user\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -598,7 +598,7 @@ } }, { - "id": "1b6cd9ba-1562-42e7-ae19-4f22b34f3a64", + "id": "e1b77bfd-64a4-41a4-aa01-902245bf99ea", "name": "Get container map GeoJSON", "request": { "name": "Get container map GeoJSON", @@ -641,7 +641,7 @@ }, "response": [ { - "id": "2ae799d5-5932-453e-80d8-bee068e525d0", + "id": "77fd4652-8df0-4cf4-a4cc-d37d11f7594c", "name": "OK", "originalRequest": { "url": { @@ -697,7 +697,7 @@ "_postman_previewlanguage": "json" }, { - "id": "a1e81770-2139-4c8f-a86e-a8f282ec0b7f", + "id": "b27c8928-c9d5-497f-9c55-5eef9ed73110", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -759,7 +759,7 @@ } }, { - "id": "04c04397-4411-4a24-817d-eb29403a8fba", + "id": "b12915bd-220f-4e74-bef4-a3d2c357ad67", "name": "Refresh container", "request": { "name": "Refresh container", @@ -802,7 +802,7 @@ }, "response": [ { - "id": "4b21a0d1-cc60-4dd9-8a95-fe29c9e642a1", + "id": "ec1cb6fd-6ae5-4e7e-9e47-ace0d6a22539", "name": "OK", "originalRequest": { "url": { @@ -858,7 +858,7 @@ "_postman_previewlanguage": "json" }, { - "id": "08666a60-217a-476a-ab6c-75af980fc9c1", + "id": "4c4c822f-95be-4119-8f55-855a8c45387b", "name": "Forbidden - This API endpoint is not enabled for your account. Please contact support@terminal49.com", "originalRequest": { "url": { @@ -914,7 +914,7 @@ "_postman_previewlanguage": "json" }, { - "id": "a00f9ec2-cf4b-4825-817b-cdfb31b5c6ab", + "id": "79350a0a-f5c7-42ed-a2c5-d9c5b83af703", "name": "Too Many Requests - You've hit the refresh limit. Please try again in a minute.", "originalRequest": { "url": { @@ -985,7 +985,7 @@ } }, { - "id": "ca682202-2ff2-4479-9d8a-936f327f8705", + "id": "fb9b0e28-0c4b-4d48-a618-7b094f14cb39", "name": "List container custom fields", "request": { "name": "List container custom fields", @@ -1025,7 +1025,7 @@ }, "response": [ { - "id": "b3baad4c-abf2-4ab8-8ff0-87f2bfa86d6b", + "id": "5b64bf6b-b546-45ad-b344-eddd711e2a0a", "name": "OK", "originalRequest": { "url": { @@ -1076,7 +1076,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"tracking_request\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"container\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"tracking_request\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"shipment\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1087,7 +1087,7 @@ } }, { - "id": "d96007f8-e8ec-4219-bb00-068ffa2d5da2", + "id": "bf27e6ef-f234-499c-9c95-0dbf8b21e2a1", "name": "Create a container custom field", "request": { "name": "Create a container custom field", @@ -1140,7 +1140,7 @@ }, "response": [ { - "id": "2f58f8c9-3c48-44a5-ac19-9a869fae2059", + "id": "1c57b5aa-ea6e-4dba-bea0-2ebfde9f33fd", "name": "Created", "originalRequest": { "url": { @@ -1215,7 +1215,7 @@ } }, { - "id": "9e7962a4-097a-44d6-a714-5290f822153c", + "id": "7a85e404-6317-40f4-8999-ef2aabc55e8d", "name": "Update a container custom field", "request": { "name": "Update a container custom field", @@ -1279,7 +1279,7 @@ }, "response": [ { - "id": "d4fea06e-3c31-4f26-a1a6-571ace4c6554", + "id": "7903f6a1-b505-427d-89fc-3feef4f46c92", "name": "OK", "originalRequest": { "url": { @@ -1365,7 +1365,7 @@ } }, { - "id": "11176a7f-6e54-42d8-805e-a4ac6424ef5c", + "id": "e0799bd5-8547-4650-98a6-3ed5426ae034", "name": "Delete a container custom field", "request": { "name": "Delete a container custom field", @@ -1410,7 +1410,7 @@ }, "response": [ { - "id": "ffda22e7-74e6-40a7-bb60-dde8399f5194", + "id": "4d8b84da-4c3c-4317-b25e-1d280d469045", "name": "No Content", "originalRequest": { "url": { @@ -1479,7 +1479,7 @@ "description": "", "item": [ { - "id": "6520257a-c2ea-462f-a865-90e64dd17f03", + "id": "19c896c6-d733-4f7b-a422-4825c7b95c4e", "name": "List custom field definitions", "request": { "name": "List custom field definitions", @@ -1552,7 +1552,7 @@ }, "response": [ { - "id": "4457dcf0-6303-4257-884c-34903625caeb", + "id": "ac0d82ea-f44a-402c-b5aa-e75f03bba06e", "name": "OK", "originalRequest": { "url": { @@ -1636,7 +1636,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"TrackingRequest\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"reference\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": \"string\"\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"Cargo\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"enum_multi\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": 6999\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"TrackingRequest\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"enum_multi\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": \"string\",\n \"key_1\": 7773,\n \"key_2\": false\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"Cargo\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"boolean\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": false\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1647,7 +1647,7 @@ } }, { - "id": "8ce4de6c-3db5-496a-b515-9b4b741ec6b5", + "id": "27b2f9cf-dea4-4b32-b587-d867116f37ef", "name": "Create a custom field definition", "request": { "name": "Create a custom field definition", @@ -1675,7 +1675,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"Shipment\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"short_text\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": 3197.0411476319873,\n \"key_1\": \"string\",\n \"key_2\": 6924.137964617325\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"Shipment\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"boolean\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": 1679\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1687,7 +1687,7 @@ }, "response": [ { - "id": "8820e9c5-1fac-4b5e-890b-3886df8475c4", + "id": "6362d602-d1b9-49ab-8d64-a335ac3fc12b", "name": "Created", "originalRequest": { "url": { @@ -1721,7 +1721,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"Shipment\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"short_text\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": 3197.0411476319873,\n \"key_1\": \"string\",\n \"key_2\": 6924.137964617325\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"Shipment\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"boolean\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": 1679\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1738,7 +1738,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"TrackingRequest\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"datetime\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": true\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"TrackingRequest\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"boolean\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": \"string\"\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1749,7 +1749,7 @@ } }, { - "id": "43392447-d8a2-458a-8d0b-b81471b6469b", + "id": "2f39cb9a-e508-443d-b1d8-94f50a9026e0", "name": "Get a custom field definition", "request": { "name": "Get a custom field definition", @@ -1788,7 +1788,7 @@ }, "response": [ { - "id": "9e5c8df0-aa75-47e7-851e-a9c625e3f788", + "id": "c3474e9b-faa0-4482-8247-312bf193bf84", "name": "OK", "originalRequest": { "url": { @@ -1838,7 +1838,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"TrackingRequest\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"datetime\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": true\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"TrackingRequest\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"boolean\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": \"string\"\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1849,7 +1849,7 @@ } }, { - "id": "6f3be5ad-3d77-4d1b-8a60-80486b35ae02", + "id": "be7e9977-ee0f-4462-b706-84028bd7ab40", "name": "Update a custom field definition", "request": { "name": "Update a custom field definition", @@ -1889,7 +1889,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"display_name\": \"\",\n \"description\": \"\",\n \"validation\": {\n \"key_0\": \"string\",\n \"key_1\": 3865.6981322726615\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"display_name\": \"\",\n \"description\": \"\",\n \"validation\": {\n \"key_0\": \"string\",\n \"key_1\": 645.0077047482416\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1901,7 +1901,7 @@ }, "response": [ { - "id": "2f6d64c3-3377-44f4-b069-3516b2aa27d9", + "id": "9070086a-1d7e-4f87-90a7-f9e494acbe6e", "name": "OK", "originalRequest": { "url": { @@ -1947,7 +1947,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"display_name\": \"\",\n \"description\": \"\",\n \"validation\": {\n \"key_0\": \"string\",\n \"key_1\": 3865.6981322726615\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"display_name\": \"\",\n \"description\": \"\",\n \"validation\": {\n \"key_0\": \"string\",\n \"key_1\": 645.0077047482416\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -1964,7 +1964,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"TrackingRequest\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"datetime\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": true\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"custom_field_definition\",\n \"attributes\": {\n \"entity_type\": \"TrackingRequest\",\n \"api_slug\": \"\",\n \"display_name\": \"\",\n \"data_type\": \"boolean\",\n \"description\": \"\",\n \"reference_type\": \"\",\n \"validation\": {\n \"key_0\": \"string\"\n },\n \"default_format\": \"\",\n \"default_value\": \"\"\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -1975,7 +1975,7 @@ } }, { - "id": "a3fb2393-eec3-4669-ba79-d420dd64421f", + "id": "c8d7819a-48a1-465c-aad1-b16730e72f3b", "name": "Delete a custom field definition", "request": { "name": "Delete a custom field definition", @@ -2008,7 +2008,7 @@ }, "response": [ { - "id": "b0514c2f-472b-44fc-aa25-d0363d900687", + "id": "473999e5-e89c-4405-88ba-da4a5a84534d", "name": "OK", "originalRequest": { "url": { @@ -2065,7 +2065,7 @@ "description": "", "item": [ { - "id": "a3c6d345-9189-48c9-8171-b1673a726aca", + "id": "23904822-147e-41d8-bcfc-1398fcb52853", "name": "List custom field options", "request": { "name": "List custom field options", @@ -2105,7 +2105,7 @@ }, "response": [ { - "id": "38d7423d-c185-4e58-afdd-d825c6eed45a", + "id": "8a1e4169-d671-421e-8930-7d733cef80ec", "name": "OK", "originalRequest": { "url": { @@ -2167,7 +2167,7 @@ } }, { - "id": "a2a9c24b-d4cf-42bf-9199-9142a04b8bbf", + "id": "ae7c6dbc-6fa6-4c91-a223-2f952bf59e20", "name": "Create a custom field option", "request": { "name": "Create a custom field option", @@ -2220,7 +2220,7 @@ }, "response": [ { - "id": "825426c5-97e6-4539-a549-f47b71455b41", + "id": "f78dc783-e595-4cbf-a23e-6756b5ce17a4", "name": "Created", "originalRequest": { "url": { @@ -2295,7 +2295,7 @@ } }, { - "id": "ca8a7416-9bcf-4eb3-809e-11182c56830b", + "id": "fbd195a8-77ef-4b1a-8b03-4d033f42e043", "name": "Get a custom field option", "request": { "name": "Get a custom field option", @@ -2346,7 +2346,7 @@ }, "response": [ { - "id": "29f0a0a2-18d3-4ca9-8676-15370621ecef", + "id": "211515a8-efc5-4503-bf96-192047470821", "name": "OK", "originalRequest": { "url": { @@ -2419,7 +2419,7 @@ } }, { - "id": "c28e057e-a1e4-4acf-919b-4bc8776a15a8", + "id": "d7d4cd5d-6609-408b-8f0b-bbb81fb98d36", "name": "Update a custom field option", "request": { "name": "Update a custom field option", @@ -2483,7 +2483,7 @@ }, "response": [ { - "id": "8883d9a8-c2ba-4837-a9c2-c1e722a6c424", + "id": "c478cd20-7b4f-4326-b9da-9eacb48f366a", "name": "OK", "originalRequest": { "url": { @@ -2569,7 +2569,7 @@ } }, { - "id": "e46eadce-54f4-4e51-9205-5340f091d952", + "id": "16666262-4835-403b-9cb4-c83ae4b82328", "name": "Delete a custom field option", "request": { "name": "Delete a custom field option", @@ -2614,7 +2614,7 @@ }, "response": [ { - "id": "1cc8aedd-4b12-49cb-a564-ec3f148c6ad1", + "id": "783fb01e-c6d7-4b9e-9074-a73b4e0d9283", "name": "OK", "originalRequest": { "url": { @@ -2683,7 +2683,7 @@ "description": "", "item": [ { - "id": "1a2852f2-43f6-4283-83c5-203081cf77f1", + "id": "2f1998bc-a147-405b-b37c-ff2f96f80294", "name": "List custom fields", "request": { "name": "List custom fields", @@ -2756,7 +2756,7 @@ }, "response": [ { - "id": "42fe92dd-1b15-4439-b334-571936fe3c6c", + "id": "399fdda3-7072-4736-aa06-44dc4fdcddde", "name": "OK", "originalRequest": { "url": { @@ -2840,7 +2840,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"tracking_request\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"container\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"tracking_request\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"shipment\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -2851,7 +2851,7 @@ } }, { - "id": "76946730-4f17-46ca-9a02-ea9f5b0b19a6", + "id": "ba8841cf-63c9-44fa-afdf-76eb81331177", "name": "Create a custom field", "request": { "name": "Create a custom field", @@ -2879,7 +2879,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"shipment\",\n \"id\": \"\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"container\",\n \"id\": \"\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -2891,7 +2891,7 @@ }, "response": [ { - "id": "afe641fc-0ed9-4891-af0f-ee9db03bd030", + "id": "e7549e37-627a-48b2-85af-fb132101e619", "name": "Created", "originalRequest": { "url": { @@ -2925,7 +2925,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"shipment\",\n \"id\": \"\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"container\",\n \"id\": \"\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -2953,7 +2953,7 @@ } }, { - "id": "92d2f43c-29de-4bd3-bc9a-4e97b519e882", + "id": "f87285a7-5b1a-4d42-a3c6-e556503aba8d", "name": "Get a custom field", "request": { "name": "Get a custom field", @@ -2992,7 +2992,7 @@ }, "response": [ { - "id": "7dd49c37-49ee-4799-a8a6-7bb6488e7aa8", + "id": "ff865f35-a8dc-42e2-b318-196d2e5590aa", "name": "OK", "originalRequest": { "url": { @@ -3053,7 +3053,7 @@ } }, { - "id": "8c068857-14c6-41bd-bbe1-3d4e0ecd9da4", + "id": "2e3b305f-f6ce-4d2b-9c5c-9f1334f92521", "name": "Update a custom field", "request": { "name": "Update a custom field", @@ -3105,7 +3105,7 @@ }, "response": [ { - "id": "ac403b07-957a-46e6-b747-cfca18e2e75f", + "id": "9e5b809e-45fc-43ff-82f1-89f52fbf5b6b", "name": "OK", "originalRequest": { "url": { @@ -3179,7 +3179,7 @@ } }, { - "id": "2c034544-e020-46c1-958d-e70a2e399a10", + "id": "7333b756-f1ac-4cf6-b769-05d31640b8d2", "name": "Delete a custom field", "request": { "name": "Delete a custom field", @@ -3212,7 +3212,7 @@ }, "response": [ { - "id": "c6354108-8475-456e-a045-2115a1891b52", + "id": "6adee407-657b-4378-bf9f-7be6f6b0abd8", "name": "OK", "originalRequest": { "url": { @@ -3269,7 +3269,7 @@ "description": "", "item": [ { - "id": "9f9c281c-f595-4236-8843-4748455cc33f", + "id": "fa1e14ec-bf7e-4aae-8561-3263a38ede4a", "name": "List shipments", "request": { "name": "List shipments", @@ -3354,7 +3354,7 @@ }, "response": [ { - "id": "6b8ef252-7a7f-4a11-9154-420507797164", + "id": "ff5bb014-db7c-4c65-8079-c8a0acd464ec", "name": "OK", "originalRequest": { "url": { @@ -3447,12 +3447,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"no_updates_at_line\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"all_containers_terminated\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": null,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"on_rail\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 10,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"delivered\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"booking_cancelled\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": null,\n \"equipment_length\": null,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"available\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 45,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"empty_returned\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "03861ea9-ceb2-456b-9228-c63203232bca", + "id": "9e2e743d-c32f-4457-91a4-7c0dcbe33666", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -3545,7 +3545,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3556,7 +3556,7 @@ } }, { - "id": "94de135a-567a-4d8c-9dbc-e95e33ed5c73", + "id": "355b0ba4-2872-41ec-9259-3139fe2028e7", "name": "Get a shipment", "request": { "name": "Get a shipment", @@ -3608,7 +3608,7 @@ }, "response": [ { - "id": "5cd22424-d91f-46d3-85f1-f5424a2839c0", + "id": "d6aaf170-00b4-4247-8e5a-a11a6afb1107", "name": "OK", "originalRequest": { "url": { @@ -3668,12 +3668,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"booking_cancelled\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"rail_terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"flat rack\",\n \"equipment_length\": 45,\n \"equipment_height\": \"high_cube\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"not_available\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"reefer\",\n \"equipment_length\": 10,\n \"equipment_height\": null,\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"demurrage\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"not_available\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 10,\n \"equipment_height\": \"standard\",\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"extended_dwell_time\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"total\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"new\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"equipment_type\": \"open top\",\n \"equipment_length\": 45,\n \"equipment_height\": null,\n \"weight_in_lbs\": \"\",\n \"created_at\": \"\",\n \"seal_number\": \"\",\n \"pickup_lfd\": \"\",\n \"pickup_appointment_at\": \"\",\n \"availability_known\": \"\",\n \"available_for_pickup\": \"\",\n \"pod_arrived_at\": \"\",\n \"pod_discharged_at\": \"\",\n \"pod_full_out_at\": \"\",\n \"terminal_checked_at\": \"\",\n \"pod_full_out_chassis_number\": \"\",\n \"location_at_pod_terminal\": \"\",\n \"final_destination_full_out_at\": \"\",\n \"empty_terminated_at\": \"\",\n \"holds_at_pod_terminal\": [\n {\n \"name\": \"\",\n \"status\": \"hold\",\n \"description\": \"\"\n },\n {\n \"name\": \"\",\n \"status\": \"pending\",\n \"description\": \"\"\n }\n ],\n \"fees_at_pod_terminal\": [\n {\n \"type\": \"other\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n },\n {\n \"type\": \"exam\",\n \"amount\": \"\",\n \"currency_code\": \"\"\n }\n ],\n \"pod_timezone\": \"\",\n \"final_destination_timezone\": \"\",\n \"empty_terminated_timezone\": \"\",\n \"pod_rail_carrier_scac\": \"\",\n \"ind_rail_carrier_scac\": \"\",\n \"pod_last_tracking_request_at\": \"\",\n \"shipment_last_tracking_request_at\": \"\",\n \"pod_rail_loaded_at\": \"\",\n \"pod_rail_departed_at\": \"\",\n \"ind_eta_at\": \"\",\n \"ind_ata_at\": \"\",\n \"ind_rail_unloaded_at\": \"\",\n \"ind_facility_lfd_on\": \"\",\n \"import_deadlines\": {\n \"pickup_lfd_terminal\": \"\",\n \"pickup_lfd_rail\": \"\",\n \"pickup_lfd_line\": \"\"\n },\n \"current_status\": \"grounded\"\n },\n \"relationships\": {\n \"shipment\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"pickup_facility\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"terminal\"\n }\n },\n \"transport_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n ]\n },\n \"raw_events\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n },\n {\n \"id\": \"\",\n \"type\": \"raw_event\"\n }\n ]\n }\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "d6672627-ca64-48ff-b5e9-82641ffeec24", + "id": "78fc3e59-b063-4f2c-8ec8-8aa803a6dbbe", "name": "Not Found", "originalRequest": { "url": { @@ -3733,12 +3733,12 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "bd4a079d-aacc-4329-bc37-fb6bf24dada0", + "id": "163772be-e6eb-4ff4-a50c-7670ee736417", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -3798,7 +3798,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3809,7 +3809,7 @@ } }, { - "id": "64dede03-56cc-45c3-a295-e9fb5f6bd7a3", + "id": "09220993-633a-4b34-8fee-c2223ba5b1d9", "name": "Edit a shipment", "request": { "name": "Edit a shipment", @@ -3864,7 +3864,7 @@ }, "response": [ { - "id": "f5e9eb0b-c2dc-4340-8d61-a77b1ed2c471", + "id": "b837aba2-8504-4535-bc67-63999a2c4bcb", "name": "OK", "originalRequest": { "url": { @@ -3927,7 +3927,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -3938,7 +3938,7 @@ } }, { - "id": "f91097e0-50fb-408b-beb4-849e9c8a610d", + "id": "7f2f3f78-35e6-4468-b5e1-84b51da02778", "name": "Stop tracking a shipment", "request": { "name": "Stop tracking a shipment", @@ -3981,7 +3981,7 @@ }, "response": [ { - "id": "b33b6dac-dbdf-4971-87d4-3df72556b77d", + "id": "330832c0-6d77-4ba3-b3d9-d171aeded6f9", "name": "OK", "originalRequest": { "url": { @@ -4032,7 +4032,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -4043,7 +4043,7 @@ } }, { - "id": "e32ede93-11c3-4f98-9f11-1404e53a78c8", + "id": "455c271d-6d13-46c5-9185-4495b5af0bc3", "name": "Resume tracking a shipment", "request": { "name": "Resume tracking a shipment", @@ -4086,7 +4086,7 @@ }, "response": [ { - "id": "e7659913-e732-4a4e-9ab5-653c6a4630c7", + "id": "9c733b90-8560-4196-9ee7-9034722d9f5b", "name": "OK", "originalRequest": { "url": { @@ -4137,7 +4137,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": \"past_arrival_window\"\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\",\n \"attributes\": {\n \"bill_of_lading_number\": \"\",\n \"normalized_number\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"created_at\": \"\",\n \"tags\": [\n \"\",\n \"\"\n ],\n \"port_of_lading_locode\": \"\",\n \"port_of_lading_name\": \"\",\n \"port_of_discharge_locode\": \"\",\n \"port_of_discharge_name\": \"\",\n \"destination_locode\": \"\",\n \"destination_name\": \"\",\n \"shipping_line_scac\": \"\",\n \"shipping_line_name\": \"\",\n \"shipping_line_short_name\": \"\",\n \"customer_name\": \"\",\n \"pod_vessel_name\": \"\",\n \"pod_vessel_imo\": \"\",\n \"pod_voyage_number\": \"\",\n \"pol_etd_at\": \"\",\n \"pol_atd_at\": \"\",\n \"pod_eta_at\": \"\",\n \"pod_original_eta_at\": \"\",\n \"pod_ata_at\": \"\",\n \"destination_eta_at\": \"\",\n \"destination_ata_at\": \"\",\n \"pol_timezone\": \"\",\n \"pod_timezone\": \"\",\n \"destination_timezone\": \"\",\n \"line_tracking_last_attempted_at\": \"\",\n \"line_tracking_last_succeeded_at\": \"\",\n \"line_tracking_stopped_at\": \"\",\n \"line_tracking_stopped_reason\": null\n },\n \"relationships\": {\n \"destination\": {\n \"data\": {\n \"type\": \"metro_area\",\n \"id\": \"\"\n }\n },\n \"port_of_lading\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"containers\": {\n \"data\": [\n {\n \"type\": \"container\",\n \"id\": \"\"\n },\n {\n \"type\": \"container\",\n \"id\": \"\"\n }\n ]\n },\n \"port_of_discharge\": {\n \"data\": {\n \"type\": \"port\",\n \"id\": \"\"\n }\n },\n \"pod_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"destination_terminal\": {\n \"data\": {\n \"type\": \"terminal\",\n \"id\": \"\"\n }\n },\n \"line_tracking_stopped_by_user\": {\n \"data\": {\n \"type\": \"user\",\n \"id\": \"\"\n }\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -4148,7 +4148,7 @@ } }, { - "id": "3ed84b89-2639-4988-a432-83e9873edd5a", + "id": "f81f065c-826b-4969-8fbf-4fd6963bb84a", "name": "List shipment custom fields", "request": { "name": "List shipment custom fields", @@ -4188,7 +4188,7 @@ }, "response": [ { - "id": "99e0c584-1d60-4e46-a529-3b807e76e1d2", + "id": "179cbdbb-c803-48c3-8b34-a9e6678dd46a", "name": "OK", "originalRequest": { "url": { @@ -4239,7 +4239,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"tracking_request\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"container\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"tracking_request\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"shipment\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -4250,7 +4250,7 @@ } }, { - "id": "ee904780-a7fe-4519-a4e7-cb499a6de33e", + "id": "3a72fb28-5ef2-4679-89d1-350ddbac596f", "name": "Create a shipment custom field", "request": { "name": "Create a shipment custom field", @@ -4303,7 +4303,7 @@ }, "response": [ { - "id": "8f2641fa-9548-4ed1-b9f9-4e55c64df18b", + "id": "a8d5f581-84b5-4baa-a1c3-5887db693a54", "name": "Created", "originalRequest": { "url": { @@ -4378,7 +4378,7 @@ } }, { - "id": "c1d85c5e-5ab4-4b0f-a288-a184f3c0f375", + "id": "df55597f-7387-4b21-9afa-3c4d8f769679", "name": "Update a shipment custom field", "request": { "name": "Update a shipment custom field", @@ -4442,7 +4442,7 @@ }, "response": [ { - "id": "2e3b87fc-c1d9-4720-b4cb-e5ddca8ac437", + "id": "8cdeef3d-accf-47ba-964c-558ea6621b86", "name": "OK", "originalRequest": { "url": { @@ -4528,7 +4528,7 @@ } }, { - "id": "3d8a4dac-9af9-49d8-8496-fe323b4706f2", + "id": "105caf6e-7ef5-4dea-8b67-7f6be05f082f", "name": "Delete a shipment custom field", "request": { "name": "Delete a shipment custom field", @@ -4573,7 +4573,7 @@ }, "response": [ { - "id": "d7053e65-c206-4155-9afe-3a65df6ee644", + "id": "6efcaca3-a1e5-41cc-a3e2-9af584973982", "name": "No Content", "originalRequest": { "url": { @@ -4652,7 +4652,7 @@ "description": "", "item": [ { - "id": "e353f994-dfc9-45a3-a354-52994953d0df", + "id": "e1c31927-4106-457d-9eab-623819b9f664", "name": "Create a tracking request", "request": { "name": "Create a tracking request", @@ -4683,7 +4683,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"booking_number\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -4711,7 +4711,7 @@ }, "response": [ { - "id": "7d0c21b2-0d32-4d44-a3f2-02f206e4bc11", + "id": "1a314312-7e7b-4842-b1c9-7225f7575341", "name": "Tracking Request Created", "originalRequest": { "url": { @@ -4745,7 +4745,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"booking_number\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -4762,12 +4762,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"created\",\n \"request_type\": \"container\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"expired\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"tracking_stopped\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"retries_exhausted\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "ed45d111-46c3-48aa-9ecd-e84575bc2f29", + "id": "ad3d8553-555b-42b0-a5af-0f0b9de2bf1e", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -4801,7 +4801,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"booking_number\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -4818,12 +4818,12 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "9bc7e548-1cb4-4075-be82-5590074bf7dd", + "id": "20b8b76a-bf40-4e83-8b32-26f2f360fe6b", "name": "Too Many Requests - You've hit the create tracking requests limit. Please try again in a minute.", "originalRequest": { "url": { @@ -4857,7 +4857,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"bill_of_lading\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_type\": \"booking_number\",\n \"request_number\": \"\",\n \"scac\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"shipment_tags\": [\n \"\",\n \"\"\n ]\n },\n \"relationships\": {\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -4894,7 +4894,7 @@ } }, { - "id": "ad57543c-5649-411b-80f3-d8350610c4e0", + "id": "df0c350b-ce24-4dc5-9fbd-0080bd99e267", "name": "List tracking requests", "request": { "name": "List tracking requests", @@ -4935,7 +4935,7 @@ "type": "text/plain" }, "key": "filter[status]", - "value": "created" + "value": "failed" }, { "disabled": false, @@ -5024,7 +5024,7 @@ }, "response": [ { - "id": "a16fa634-02e8-43db-8a5b-0ec37c11e6aa", + "id": "bb70371e-b71e-4485-9161-585e83b69e05", "name": "OK", "originalRequest": { "url": { @@ -5060,7 +5060,7 @@ "type": "text/plain" }, "key": "filter[status]", - "value": "created" + "value": "failed" }, { "disabled": false, @@ -5162,12 +5162,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"awaiting_manifest\",\n \"request_type\": \"container\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"shipping_line_unreachable\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"tracking_stopped\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"unrecognized_response\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"pending\",\n \"request_type\": \"booking_number\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"booking_cancelled\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"pending\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"unrecognized_response\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "776acb20-50bb-42f4-91b0-252afca8f894", + "id": "5706c605-4195-460c-9d67-5f406879f50e", "name": "Not Found", "originalRequest": { "url": { @@ -5203,7 +5203,7 @@ "type": "text/plain" }, "key": "filter[status]", - "value": "created" + "value": "failed" }, { "disabled": false, @@ -5305,7 +5305,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -5316,7 +5316,7 @@ } }, { - "id": "6dd2a870-e975-460b-9590-02e8dba9bff0", + "id": "9f475af8-3089-4aa1-83c4-0aa3ccc8662f", "name": "Infer Tracking Number", "request": { "name": "Infer Tracking Number", @@ -5376,7 +5376,7 @@ }, "response": [ { - "id": "ff14ee9e-c39a-4557-979d-1e553a6de0fe", + "id": "64c05662-1118-4f40-99c6-18d6913be6bd", "name": "Successfully inferred number type and shipping line", "originalRequest": { "url": { @@ -5428,12 +5428,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"\",\n \"attributes\": {\n \"number_type\": \"container\",\n \"validation\": {\n \"is_valid\": \"\",\n \"type\": \"shipment\",\n \"check_digit_passed\": \"\",\n \"parsed_number\": \"\",\n \"reason\": \"\"\n },\n \"shipping_line\": {\n \"decision\": \"auto_select\",\n \"selected\": {\n \"scac\": \"\",\n \"name\": \"\",\n \"confidence\": \"\"\n },\n \"candidates\": [\n {\n \"scac\": \"\",\n \"name\": \"\",\n \"confidence\": \"\"\n },\n {\n \"scac\": \"\",\n \"name\": \"\",\n \"confidence\": \"\"\n }\n ]\n }\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"\",\n \"attributes\": {\n \"number_type\": \"booking\",\n \"validation\": {\n \"is_valid\": \"\",\n \"type\": \"container\",\n \"check_digit_passed\": \"\",\n \"parsed_number\": \"\",\n \"reason\": \"\"\n },\n \"shipping_line\": {\n \"decision\": \"needs_confirmation\",\n \"selected\": {\n \"scac\": \"\",\n \"name\": \"\",\n \"confidence\": \"\"\n },\n \"candidates\": [\n {\n \"scac\": \"\",\n \"name\": \"\",\n \"confidence\": \"\"\n },\n {\n \"scac\": \"\",\n \"name\": \"\",\n \"confidence\": \"\"\n }\n ]\n }\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "48f5a05e-1af6-48fe-afc6-871dc6d06994", + "id": "4029daa0-aeb3-4694-9456-e54b215870f1", "name": "Unprocessable Entity - Invalid tracking number format", "originalRequest": { "url": { @@ -5490,7 +5490,7 @@ "_postman_previewlanguage": "json" }, { - "id": "62a5fb27-c83d-4df9-b6e1-7b9331052226", + "id": "2b424276-0594-4665-b6bb-e7a71b34a5f9", "name": "Too Many Requests - Rate limit exceeded", "originalRequest": { "url": { @@ -5562,7 +5562,7 @@ } }, { - "id": "96eb6a0a-2cb1-416f-801a-e360ebf17d2b", + "id": "e40e4dc7-24d8-4b5d-ad1c-f06c9365fa61", "name": "Get a single tracking request", "request": { "name": "Get a single tracking request", @@ -5614,7 +5614,7 @@ }, "response": [ { - "id": "7ed3b7bc-6933-412f-980d-f57c7c6fa4f8", + "id": "02fbc014-07bc-4755-9cd2-5a4efff004f9", "name": "OK", "originalRequest": { "url": { @@ -5674,12 +5674,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"created\",\n \"request_type\": \"container\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"expired\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"tracking_stopped\",\n \"request_type\": \"bill_of_lading\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"retries_exhausted\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "1278bf7c-f48d-45c1-92e6-d2c00c8bc9ca", + "id": "7d2961c6-6b1e-414e-961a-3d89fab5b59f", "name": "Not Found", "originalRequest": { "url": { @@ -5739,7 +5739,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -5750,7 +5750,7 @@ } }, { - "id": "e399cda5-b888-4186-8615-3b46d56d6198", + "id": "e5c0278d-645a-4779-a921-b0736502e93a", "name": "Edit a tracking request", "request": { "name": "Edit a tracking request", @@ -5805,7 +5805,7 @@ }, "response": [ { - "id": "bc8dcb14-43c9-4825-80d7-8cb19c373a6e", + "id": "ccd18872-162c-497c-92fd-80900944ce02", "name": "OK", "originalRequest": { "url": { @@ -5868,7 +5868,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"tracking_stopped\",\n \"request_type\": \"container\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": \"invalid_number\",\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\",\n \"attributes\": {\n \"request_number\": \"\",\n \"status\": \"awaiting_manifest\",\n \"request_type\": \"container\",\n \"scac\": \"\",\n \"created_at\": \"\",\n \"ref_numbers\": [\n \"\",\n \"\"\n ],\n \"tags\": [\n \"\",\n \"\"\n ],\n \"failed_reason\": null,\n \"updated_at\": \"\",\n \"is_retrying\": \"\",\n \"retry_count\": \"\"\n },\n \"relationships\": {\n \"tracked_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"party\"\n }\n }\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -5879,7 +5879,7 @@ } }, { - "id": "0d6d54d0-e91d-4c03-a5a5-4af70082dc76", + "id": "df615d7e-ab93-481a-b9fe-a36b98a144d1", "name": "List tracking request custom fields", "request": { "name": "List tracking request custom fields", @@ -5919,7 +5919,7 @@ }, "response": [ { - "id": "046081bc-33e3-4afd-962a-b65045183c80", + "id": "6d1b462b-dd4e-47cd-a834-cb405808354d", "name": "OK", "originalRequest": { "url": { @@ -5970,7 +5970,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"tracking_request\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"container\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"tracking_request\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"custom_field\",\n \"attributes\": {\n \"api_slug\": \"\",\n \"value\": \"\",\n \"display_value\": \"\"\n },\n \"relationships\": {\n \"entity\": {\n \"data\": {\n \"type\": \"shipment\",\n \"id\": \"\"\n }\n },\n \"definition\": {\n \"data\": {\n \"type\": \"custom_field_definition\",\n \"id\": \"\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -5981,7 +5981,7 @@ } }, { - "id": "57749ff2-f5fd-4cf8-a07c-21d784bd2afd", + "id": "a3cdd8f3-de4b-417f-beb8-5d39fef16fbd", "name": "Create a tracking request custom field", "request": { "name": "Create a tracking request custom field", @@ -6034,7 +6034,7 @@ }, "response": [ { - "id": "15dd229c-d199-4f16-a3a6-e81fed3e651c", + "id": "abb89769-538c-472e-af47-61de04797a31", "name": "Created", "originalRequest": { "url": { @@ -6109,7 +6109,7 @@ } }, { - "id": "31cb367d-6514-45e7-8495-e560f5c162e6", + "id": "01c40d1c-1727-4cce-8256-1b0448bcac8e", "name": "Update a tracking request custom field", "request": { "name": "Update a tracking request custom field", @@ -6173,7 +6173,7 @@ }, "response": [ { - "id": "e7c6860c-7c84-493f-9aea-8eb933952cc9", + "id": "795dfc8a-3b3a-488e-8372-ecbbcc4f505d", "name": "OK", "originalRequest": { "url": { @@ -6259,7 +6259,7 @@ } }, { - "id": "b23aaefe-b95e-48f2-83d6-eef351e3ee51", + "id": "8af6256c-179c-4cde-9f7b-664df94bd90f", "name": "Delete a tracking request custom field", "request": { "name": "Delete a tracking request custom field", @@ -6304,7 +6304,7 @@ }, "response": [ { - "id": "c8aa72ee-9aaa-4992-9f22-b6597c9144b2", + "id": "2458719c-997f-487e-beee-11a3d4c5936d", "name": "No Content", "originalRequest": { "url": { @@ -6373,7 +6373,7 @@ "description": "", "item": [ { - "id": "a60d0748-4342-4b97-af5c-ed5315838d59", + "id": "a1fc2856-bedf-4b97-9c58-62e4f79c7c9d", "name": "Get single webhook", "request": { "name": "Get single webhook", @@ -6415,7 +6415,7 @@ }, "response": [ { - "id": "0500e480-a878-4ab9-ab39-9ac7a14a064d", + "id": "dcfaf790-91d5-4929-b181-5e03e4ae92b0", "name": "OK", "originalRequest": { "url": { @@ -6465,7 +6465,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"document.extraction_failed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.estimated.arrived_at_inland_destination\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -6476,7 +6476,7 @@ } }, { - "id": "bcf1442e-46c1-4c8b-ab89-5f43c621b05e", + "id": "5b2d1acd-c549-474d-9956-453ac5523798", "name": "Edit a webhook", "request": { "name": "Edit a webhook", @@ -6519,7 +6519,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.transport.vessel_berthed\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.pickup_appointment.changed\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -6531,7 +6531,7 @@ }, "response": [ { - "id": "6ae3cc34-da2a-46bc-95db-ad5069ff43b9", + "id": "31dc08da-0620-49c8-a5ad-54a666c1ca42", "name": "OK", "originalRequest": { "url": { @@ -6577,7 +6577,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.transport.vessel_berthed\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"events\": [\n \"container.pickup_appointment.changed\"\n ],\n \"active\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -6594,7 +6594,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"document.extraction_failed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.estimated.arrived_at_inland_destination\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -6605,7 +6605,7 @@ } }, { - "id": "932bed3c-9fe0-4de3-a75c-0ed06ae610f2", + "id": "f487eef0-76fb-4dbd-a368-13f368259be8", "name": "Delete a webhook", "request": { "name": "Delete a webhook", @@ -6641,7 +6641,7 @@ }, "response": [ { - "id": "ee7d01b4-596f-480b-ae03-b6f39662447f", + "id": "311cde21-a8e7-4565-88e7-c21c0fc95e20", "name": "OK", "originalRequest": { "url": { @@ -6692,7 +6692,7 @@ } }, { - "id": "149e9e15-a687-4b18-bec3-ad5137f2b65a", + "id": "9933f696-068e-4ee5-b52f-f59ff1259f04", "name": "List webhooks", "request": { "name": "List webhooks", @@ -6741,7 +6741,7 @@ }, "response": [ { - "id": "7c74f4e5-6bed-4262-b796-a73048edca51", + "id": "e2b494f9-0563-4ee3-8f7f-6b1f8917cf56", "name": "OK", "originalRequest": { "url": { @@ -6798,7 +6798,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.pod_terminal_changed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"document.extracted\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ],\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.not_available\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.transshipment_arrived\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ],\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -6809,7 +6809,7 @@ } }, { - "id": "a913ded4-bf14-4e26-b5c0-83a494560cf9", + "id": "126092d2-38db-410c-803d-9a53dd496916", "name": "Create a webhook", "request": { "name": "Create a webhook", @@ -6840,7 +6840,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.vessel_berthed\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.rail_loaded\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -6852,7 +6852,7 @@ }, "response": [ { - "id": "ea3164f4-56f1-4c59-9ded-21dc3f3cfd5e", + "id": "2639300c-9e2c-43cc-98f4-c09274e3d9e7", "name": "Create a test webhook endpoint", "originalRequest": { "url": { @@ -6886,7 +6886,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.vessel_berthed\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", + "raw": "{\n \"data\": {\n \"attributes\": {\n \"url\": \"\",\n \"active\": \"\",\n \"events\": [\n \"container.transport.rail_loaded\"\n ],\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n },\n \"type\": \"webhook\"\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -6903,7 +6903,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"document.extraction_failed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.estimated.arrived_at_inland_destination\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -6914,7 +6914,7 @@ } }, { - "id": "0bf849e0-4de3-4c33-a594-3a0b3217b6f1", + "id": "bb7d1a48-3463-45a8-a66f-629a61886a92", "name": "List webhook events", "request": { "name": "List webhook events", @@ -6945,7 +6945,7 @@ }, "response": [ { - "id": "9c90a4f6-0c7b-49a7-854c-b7c0092e71b7", + "id": "0f85f3c2-6792-415e-9351-1b38ee5c5c4c", "name": "OK", "originalRequest": { "url": { @@ -6995,7 +6995,7 @@ } }, { - "id": "977dc05f-b547-404e-a5f7-a476d5dd97e1", + "id": "a28c8f15-8c0c-41e3-b457-455775c4bf79", "name": "List webhook IPs", "request": { "name": "List webhook IPs", @@ -7026,7 +7026,7 @@ }, "response": [ { - "id": "d3b0cac0-52b5-494c-8afb-c98acc997b74", + "id": "5db9568f-eece-4c40-bbce-3ed8c9c8a76d", "name": "OK", "originalRequest": { "url": { @@ -7076,7 +7076,7 @@ } }, { - "id": "b38bbec8-c91f-4097-91c7-d1a1c9dc70bf", + "id": "b15b49e4-923d-4452-9275-eb428059d26d", "name": "Trigger a webhook test delivery", "request": { "name": "Trigger a webhook test delivery", @@ -7120,7 +7120,7 @@ }, "response": [ { - "id": "b292dc19-fab6-435d-a21e-40313dc76dd3", + "id": "6f049d83-cdaa-42bc-948f-e54603249204", "name": "Webhook test delivery attempt result", "originalRequest": { "url": { @@ -7172,12 +7172,12 @@ "value": "application/json" } ], - "body": "{\n \"url\": \"\",\n \"succeeded\": \"\",\n \"error\": \"\",\n \"status_code\": \"\",\n \"request_headers\": {\n \"key_0\": \"string\",\n \"key_1\": \"string\",\n \"key_2\": 9772.844159441842,\n \"key_3\": \"string\"\n },\n \"request_body\": \"\",\n \"response_headers\": {\n \"key_0\": \"string\",\n \"key_1\": 2272\n },\n \"response_body\": \"\"\n}", + "body": "{\n \"url\": \"\",\n \"succeeded\": \"\",\n \"error\": \"\",\n \"status_code\": \"\",\n \"request_headers\": {\n \"key_0\": 2816,\n \"key_1\": 5201\n },\n \"request_body\": \"\",\n \"response_headers\": {\n \"key_0\": 5608.16492235654\n },\n \"response_body\": \"\"\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "86aef523-0f4d-44f9-b13a-40dabde98779", + "id": "66edd56e-f630-406d-a67d-80b5b2465bdd", "name": "Validation error", "originalRequest": { "url": { @@ -7246,7 +7246,7 @@ "description": "", "item": [ { - "id": "20f1fe8b-77bc-4fba-9e90-7adf9df7b01a", + "id": "fb867dba-8bb8-410b-ba55-ff9d6ea18c3e", "name": "Get a single webhook notification", "request": { "name": "Get a single webhook notification", @@ -7298,7 +7298,7 @@ }, "response": [ { - "id": "85fa8d4b-38a5-43fc-b0a0-e96486be4e91", + "id": "e11b42a9-e5b5-4f7a-885d-b69659b4982a", "name": "200", "originalRequest": { "url": { @@ -7358,7 +7358,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.pod_terminal_changed\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"estimated_event\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"document.extracted\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.pickup_appointment.changed\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.vessel_arrived\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"estimated_event\"\n }\n }\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"tracking_request.succeeded\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -7369,7 +7369,7 @@ } }, { - "id": "e04601c1-ca60-4c02-9651-b202b273aabc", + "id": "0b190f33-56c4-439c-b976-6c956a9e2f58", "name": "List webhook notifications", "request": { "name": "List webhook notifications", @@ -7427,7 +7427,7 @@ }, "response": [ { - "id": "b8668946-12f4-487a-bb8f-76846f336f16", + "id": "3f112b44-3457-4dbf-94b7-4cb8996060b8", "name": "OK", "originalRequest": { "url": { @@ -7493,7 +7493,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.available\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container_updated_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.estimated.arrived_at_inland_destination\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.arrived_at_inland_destination\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.transshipment_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"tracking_request.failed\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.vessel_berthed\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.transshipment_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -7504,7 +7504,7 @@ } }, { - "id": "aed7640e-a9cd-47a7-8e30-0200c32b094b", + "id": "a2884eb4-6cae-41c0-8454-41b102e00b83", "name": "Get webhook notification payload examples", "request": { "name": "Get webhook notification payload examples", @@ -7528,7 +7528,7 @@ "type": "text/plain" }, "key": "event", - "value": "container.transport.rail_arrived" + "value": "container.transport.not_available" } ], "variable": [] @@ -7545,7 +7545,7 @@ }, "response": [ { - "id": "7f30ec79-11db-46a3-a9e3-13615a56660e", + "id": "27429d72-40a3-485a-bbfd-63e81470cde8", "name": "OK", "originalRequest": { "url": { @@ -7564,7 +7564,7 @@ "type": "text/plain" }, "key": "event", - "value": "container.transport.rail_arrived" + "value": "container.transport.not_available" } ], "variable": [] @@ -7594,7 +7594,7 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.available\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"container_updated_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.estimated.arrived_at_inland_destination\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.arrived_at_inland_destination\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.transshipment_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"tracking_request.failed\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"transport_event\"\n }\n }\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook_notification\",\n \"attributes\": {\n \"event\": \"container.transport.vessel_berthed\",\n \"delivery_status\": \"pending\",\n \"created_at\": \"\"\n },\n \"relationships\": {\n \"webhook\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"webhook\"\n }\n },\n \"reference_object\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"tracking_request\"\n }\n }\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.transshipment_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n },\n {\n \"id\": \"\",\n \"type\": \"webhook\",\n \"attributes\": {\n \"url\": \"\",\n \"active\": true,\n \"events\": [\n \"container.transport.vessel_discharged\"\n ],\n \"secret\": \"\",\n \"headers\": [\n {\n \"name\": \"\",\n \"value\": \"\"\n },\n {\n \"name\": \"\",\n \"value\": \"\"\n }\n ]\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -7611,7 +7611,7 @@ "description": "", "item": [ { - "id": "265aee1b-c6c4-425c-81ea-75639af6dcb7", + "id": "cedd659b-630c-4140-84a0-3cf434d6fe14", "name": "Get a port using the locode or the id", "request": { "name": "Get a port using the locode or the id", @@ -7653,7 +7653,7 @@ }, "response": [ { - "id": "598c9454-0e43-4b11-9555-f19e428c313c", + "id": "0ec0f3cb-0e71-4505-a1c8-20a30f78582d", "name": "OK", "originalRequest": { "url": { @@ -7720,7 +7720,7 @@ "description": "", "item": [ { - "id": "66522920-0e39-4b07-975b-c53e2fff7511", + "id": "c61f66f8-5857-4701-b13b-702230d9dee5", "name": "Get a metro area using the un/locode or the id", "request": { "name": "Get a metro area using the un/locode or the id", @@ -7762,7 +7762,7 @@ }, "response": [ { - "id": "d15b784d-ec4f-4441-b72d-619cdd46e18d", + "id": "9f0bdd49-3687-42ea-a096-e0190b66030b", "name": "OK", "originalRequest": { "url": { @@ -7829,7 +7829,7 @@ "description": "", "item": [ { - "id": "3b0186ec-60b0-4067-93ea-b80f9aa8e7bf", + "id": "e550293a-d1f3-4fed-8692-15e784bfec2f", "name": "Get a terminal using the id", "request": { "name": "Get a terminal using the id", @@ -7871,7 +7871,7 @@ }, "response": [ { - "id": "a3f5c5a7-a2f7-4f8b-b64c-1dcf4f6f9a90", + "id": "5ce101c3-a4d7-404e-ab7e-c9932ab8efa0", "name": "OK", "originalRequest": { "url": { @@ -7938,7 +7938,7 @@ "description": "", "item": [ { - "id": "6d552516-76d9-46ae-b20f-9a99e7244287", + "id": "6fd9817c-f8c4-4e71-99c3-afdfaef246a3", "name": "Get container map GeoJSON", "request": { "name": "Get container map GeoJSON", @@ -7981,7 +7981,7 @@ }, "response": [ { - "id": "f8b305aa-a26b-471c-863c-a042227503ca", + "id": "c68781c3-708f-4527-aecf-1a9d74b91077", "name": "OK", "originalRequest": { "url": { @@ -8037,7 +8037,7 @@ "_postman_previewlanguage": "json" }, { - "id": "f053b92d-31a2-4243-b7ed-7cb1071980cb", + "id": "e112889f-0d2b-476e-b17f-fbd204e62f05", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -8099,7 +8099,7 @@ } }, { - "id": "be92229f-65b6-490b-aa67-dda3c8922695", + "id": "a5fc4031-d70a-4e6f-a6e6-21009c1013bb", "name": "Get vessel future positions", "request": { "name": "Get vessel future positions", @@ -8161,7 +8161,7 @@ }, "response": [ { - "id": "0f500273-891c-41ca-8328-30469612ecb1", + "id": "66234233-26e1-403d-9491-349cd61821aa", "name": "OK", "originalRequest": { "url": { @@ -8236,7 +8236,7 @@ "_postman_previewlanguage": "json" }, { - "id": "cd5c4764-77c3-46ab-a3d0-fead9cac178f", + "id": "7c69b67d-f1d4-406e-a2cc-ef6b9cc4dd01", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -8317,7 +8317,7 @@ } }, { - "id": "2a354a66-bdc3-4568-9bb7-000154bd6016", + "id": "e500a52c-2194-40b7-a1a3-31d222ec1b5c", "name": "Get vessel future positions from coordinates", "request": { "name": "Get vessel future positions from coordinates", @@ -8397,7 +8397,7 @@ }, "response": [ { - "id": "7822090d-e64e-4217-9190-14da6647ff91", + "id": "8a61ca93-8866-48e8-aaaf-e250bacf25df", "name": "OK", "originalRequest": { "url": { @@ -8490,7 +8490,7 @@ "_postman_previewlanguage": "json" }, { - "id": "8f75dc65-ba04-4c66-b61d-c026e4635bd8", + "id": "7c139c6d-0b39-421f-8c18-7a87b2366b98", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -8595,7 +8595,7 @@ "description": "", "item": [ { - "id": "5252c2f2-1f08-4bc9-83ca-e83bffca05d6", + "id": "ddd78852-e607-45ec-aef9-82bae8482bf9", "name": "List documents", "request": { "name": "List documents", @@ -8689,7 +8689,7 @@ }, "response": [ { - "id": "785e547c-7225-44de-86bc-629496f2aeb7", + "id": "ecf1e3ac-ccfd-40a6-a721-f3fea9d53f8b", "name": "OK", "originalRequest": { "url": { @@ -8791,12 +8791,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"document\",\n \"attributes\": {\n \"id\": \"\",\n \"name\": \"\",\n \"document_type\": \"\",\n \"document_type_manual\": \"\",\n \"classification_notes\": \"\",\n \"source\": \"email\",\n \"file_name\": \"\",\n \"file_content_type\": \"\",\n \"file_size_bytes\": \"\",\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"relationships\": {\n \"account\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\"\n }\n },\n \"user\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"user\"\n }\n },\n \"email_submission\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"email_submission\"\n }\n },\n \"last_document_representation\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_representation\"\n }\n },\n \"shipments\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n ]\n },\n \"cargos\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\"\n },\n {\n \"id\": \"\",\n \"type\": \"container\"\n }\n ]\n }\n },\n \"links\": {\n \"self\": \"\",\n \"download\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"document\",\n \"attributes\": {\n \"id\": \"\",\n \"name\": \"\",\n \"document_type\": \"\",\n \"document_type_manual\": \"\",\n \"classification_notes\": \"\",\n \"source\": \"upload\",\n \"file_name\": \"\",\n \"file_content_type\": \"\",\n \"file_size_bytes\": \"\",\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"relationships\": {\n \"account\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\"\n }\n },\n \"user\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"user\"\n }\n },\n \"email_submission\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"email_submission\"\n }\n },\n \"last_document_representation\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_representation\"\n }\n },\n \"shipments\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n ]\n },\n \"cargos\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\"\n },\n {\n \"id\": \"\",\n \"type\": \"container\"\n }\n ]\n }\n },\n \"links\": {\n \"self\": \"\",\n \"download\": \"\"\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", + "body": "{\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"document\",\n \"attributes\": {\n \"id\": \"\",\n \"name\": \"\",\n \"document_type\": \"\",\n \"document_type_manual\": \"\",\n \"classification_notes\": \"\",\n \"source\": \"email\",\n \"file_name\": \"\",\n \"file_content_type\": \"\",\n \"file_size_bytes\": \"\",\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"relationships\": {\n \"account\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\"\n }\n },\n \"user\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"user\"\n }\n },\n \"email_submission\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"email_submission\"\n }\n },\n \"last_document_representation\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_representation\"\n }\n },\n \"shipments\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n ]\n },\n \"cargos\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\"\n },\n {\n \"id\": \"\",\n \"type\": \"container\"\n }\n ]\n }\n },\n \"links\": {\n \"self\": \"\",\n \"download\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"document\",\n \"attributes\": {\n \"id\": \"\",\n \"name\": \"\",\n \"document_type\": \"\",\n \"document_type_manual\": \"\",\n \"classification_notes\": \"\",\n \"source\": \"split_document\",\n \"file_name\": \"\",\n \"file_content_type\": \"\",\n \"file_size_bytes\": \"\",\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"relationships\": {\n \"account\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\"\n }\n },\n \"user\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"user\"\n }\n },\n \"email_submission\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"email_submission\"\n }\n },\n \"last_document_representation\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_representation\"\n }\n },\n \"shipments\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n ]\n },\n \"cargos\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\"\n },\n {\n \"id\": \"\",\n \"type\": \"container\"\n }\n ]\n }\n },\n \"links\": {\n \"self\": \"\",\n \"download\": \"\"\n }\n }\n ],\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ],\n \"links\": {\n \"last\": \"\",\n \"next\": \"\",\n \"prev\": \"\",\n \"first\": \"\",\n \"self\": \"\"\n },\n \"meta\": {\n \"size\": \"\",\n \"total\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "ce21c94e-f2ce-4a07-be5b-d3e2296663f2", + "id": "2811103d-451a-4add-b0da-a0f1b26ab502", "name": "Bad Request", "originalRequest": { "url": { @@ -8898,12 +8898,12 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "b18a68b1-1257-4268-a038-6cf13ccba081", + "id": "c93f244b-85cf-4793-bd2a-3a9c6cffac2e", "name": "Unauthorized", "originalRequest": { "url": { @@ -9005,7 +9005,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -9016,7 +9016,7 @@ } }, { - "id": "9008885b-9c42-4e76-af07-585f1111b961", + "id": "54dcd4e2-fa54-49f3-a9dd-3f3c7c3a9743", "name": "Upload a document", "request": { "name": "Upload a document", @@ -9059,7 +9059,7 @@ }, "response": [ { - "id": "2fbb7670-4267-4bd7-ac51-d7243cb8e72b", + "id": "2ef9908f-ec73-4bd8-8515-4bff03831f0d", "name": "Created", "originalRequest": { "url": { @@ -9110,12 +9110,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"document\",\n \"attributes\": {\n \"id\": \"\",\n \"name\": \"\",\n \"document_type\": \"\",\n \"document_type_manual\": \"\",\n \"classification_notes\": \"\",\n \"source\": \"api\",\n \"file_name\": \"\",\n \"file_content_type\": \"\",\n \"file_size_bytes\": \"\",\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"relationships\": {\n \"account\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\"\n }\n },\n \"user\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"user\"\n }\n },\n \"email_submission\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"email_submission\"\n }\n },\n \"last_document_representation\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_representation\"\n }\n },\n \"shipments\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n ]\n },\n \"cargos\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\"\n },\n {\n \"id\": \"\",\n \"type\": \"container\"\n }\n ]\n }\n },\n \"links\": {\n \"self\": \"\",\n \"download\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ],\n \"links\": {\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"document\",\n \"attributes\": {\n \"id\": \"\",\n \"name\": \"\",\n \"document_type\": \"\",\n \"document_type_manual\": \"\",\n \"classification_notes\": \"\",\n \"source\": \"upload\",\n \"file_name\": \"\",\n \"file_content_type\": \"\",\n \"file_size_bytes\": \"\",\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"relationships\": {\n \"account\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\"\n }\n },\n \"user\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"user\"\n }\n },\n \"email_submission\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"email_submission\"\n }\n },\n \"last_document_representation\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_representation\"\n }\n },\n \"shipments\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n ]\n },\n \"cargos\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\"\n },\n {\n \"id\": \"\",\n \"type\": \"container\"\n }\n ]\n }\n },\n \"links\": {\n \"self\": \"\",\n \"download\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ],\n \"links\": {\n \"self\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "6d248bd3-41dc-4c7a-84ed-13aa03bf6d36", + "id": "1b6f885d-fdd0-42f2-82e1-41772e16d6f3", "name": "Duplicate document", "originalRequest": { "url": { @@ -9171,7 +9171,7 @@ "_postman_previewlanguage": "json" }, { - "id": "672fae9a-1923-432e-824d-ff13bb1d9ba1", + "id": "d036efeb-ca77-42aa-a8e6-b2889c38db2b", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -9222,7 +9222,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -9233,7 +9233,7 @@ } }, { - "id": "074f59df-2ae7-456f-98ba-2c84c8349110", + "id": "bae5547a-c4a9-4b5e-9915-afb8a14bb8b5", "name": "List document types", "request": { "name": "List document types", @@ -9264,7 +9264,7 @@ }, "response": [ { - "id": "48db72dd-b28c-47b4-aaa3-77fa164ffd07", + "id": "afed8028-276f-4153-b114-800db1a9a757", "name": "OK", "originalRequest": { "url": { @@ -9308,7 +9308,7 @@ "_postman_previewlanguage": "json" }, { - "id": "b2459abd-a853-4bf9-abe2-403a51943875", + "id": "532a887a-8275-4b04-85b9-3052c3b3e7f7", "name": "Unauthorized", "originalRequest": { "url": { @@ -9347,7 +9347,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -9358,7 +9358,7 @@ } }, { - "id": "6bff4e9f-5418-4627-8305-ed9ccf420624", + "id": "8733f341-cb54-4377-a531-23fd5efb5d23", "name": "Get a document", "request": { "name": "Get a document", @@ -9407,7 +9407,7 @@ }, "response": [ { - "id": "18120bdd-ba1a-45ec-afd5-d805d6541af5", + "id": "507bf76d-ba72-492b-8763-8a9fc8b376f3", "name": "OK", "originalRequest": { "url": { @@ -9467,12 +9467,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"document\",\n \"attributes\": {\n \"id\": \"\",\n \"name\": \"\",\n \"document_type\": \"\",\n \"document_type_manual\": \"\",\n \"classification_notes\": \"\",\n \"source\": \"api\",\n \"file_name\": \"\",\n \"file_content_type\": \"\",\n \"file_size_bytes\": \"\",\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"relationships\": {\n \"account\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\"\n }\n },\n \"user\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"user\"\n }\n },\n \"email_submission\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"email_submission\"\n }\n },\n \"last_document_representation\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_representation\"\n }\n },\n \"shipments\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n ]\n },\n \"cargos\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\"\n },\n {\n \"id\": \"\",\n \"type\": \"container\"\n }\n ]\n }\n },\n \"links\": {\n \"self\": \"\",\n \"download\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ],\n \"links\": {\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"document\",\n \"attributes\": {\n \"id\": \"\",\n \"name\": \"\",\n \"document_type\": \"\",\n \"document_type_manual\": \"\",\n \"classification_notes\": \"\",\n \"source\": \"upload\",\n \"file_name\": \"\",\n \"file_content_type\": \"\",\n \"file_size_bytes\": \"\",\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"relationships\": {\n \"account\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\"\n }\n },\n \"user\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"user\"\n }\n },\n \"email_submission\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"email_submission\"\n }\n },\n \"last_document_representation\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_representation\"\n }\n },\n \"shipments\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n ]\n },\n \"cargos\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\"\n },\n {\n \"id\": \"\",\n \"type\": \"container\"\n }\n ]\n }\n },\n \"links\": {\n \"self\": \"\",\n \"download\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ],\n \"links\": {\n \"self\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "4f3ad886-477e-4d39-8573-a9e9e66a5b3d", + "id": "5c25cc0d-c372-4b12-9b25-28845f90be48", "name": "Bad Request", "originalRequest": { "url": { @@ -9532,12 +9532,12 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "f4474fd4-6253-42e0-839b-3985ca3df965", + "id": "a335a36d-a6f5-4535-91d0-98007f4825dc", "name": "Not Found", "originalRequest": { "url": { @@ -9597,7 +9597,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -9608,7 +9608,7 @@ } }, { - "id": "d3a76e6e-6579-4bf2-adf1-3a870561c53d", + "id": "7954fc13-d0d5-4525-b376-ee6f399b820c", "name": "Edit a document", "request": { "name": "Edit a document", @@ -9651,7 +9651,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"document\",\n \"attributes\": {\n \"document_type_manual\": \"\",\n \"extracted_data_manual\": {\n \"key_0\": false,\n \"key_1\": 4838\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"document\",\n \"attributes\": {\n \"document_type_manual\": \"\",\n \"extracted_data_manual\": {\n \"key_0\": \"string\",\n \"key_1\": 2786.511240881493,\n \"key_2\": 2882.693867244948,\n \"key_3\": 5382.620330494894\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -9663,7 +9663,7 @@ }, "response": [ { - "id": "24f89a2c-6d9c-4a32-af58-f51894bf2dee", + "id": "0642f4e3-b18d-4e8b-b28a-9d37e57c6964", "name": "OK", "originalRequest": { "url": { @@ -9709,7 +9709,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"document\",\n \"attributes\": {\n \"document_type_manual\": \"\",\n \"extracted_data_manual\": {\n \"key_0\": false,\n \"key_1\": 4838\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"document\",\n \"attributes\": {\n \"document_type_manual\": \"\",\n \"extracted_data_manual\": {\n \"key_0\": \"string\",\n \"key_1\": 2786.511240881493,\n \"key_2\": 2882.693867244948,\n \"key_3\": 5382.620330494894\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -9726,12 +9726,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"document\",\n \"attributes\": {\n \"id\": \"\",\n \"name\": \"\",\n \"document_type\": \"\",\n \"document_type_manual\": \"\",\n \"classification_notes\": \"\",\n \"source\": \"api\",\n \"file_name\": \"\",\n \"file_content_type\": \"\",\n \"file_size_bytes\": \"\",\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"relationships\": {\n \"account\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\"\n }\n },\n \"user\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"user\"\n }\n },\n \"email_submission\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"email_submission\"\n }\n },\n \"last_document_representation\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_representation\"\n }\n },\n \"shipments\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n ]\n },\n \"cargos\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\"\n },\n {\n \"id\": \"\",\n \"type\": \"container\"\n }\n ]\n }\n },\n \"links\": {\n \"self\": \"\",\n \"download\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ],\n \"links\": {\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"document\",\n \"attributes\": {\n \"id\": \"\",\n \"name\": \"\",\n \"document_type\": \"\",\n \"document_type_manual\": \"\",\n \"classification_notes\": \"\",\n \"source\": \"upload\",\n \"file_name\": \"\",\n \"file_content_type\": \"\",\n \"file_size_bytes\": \"\",\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"relationships\": {\n \"account\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"account\"\n }\n },\n \"user\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"user\"\n }\n },\n \"email_submission\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"email_submission\"\n }\n },\n \"last_document_representation\": {\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_representation\"\n }\n },\n \"shipments\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n },\n {\n \"id\": \"\",\n \"type\": \"shipment\"\n }\n ]\n },\n \"cargos\": {\n \"data\": [\n {\n \"id\": \"\",\n \"type\": \"container\"\n },\n {\n \"id\": \"\",\n \"type\": \"container\"\n }\n ]\n }\n },\n \"links\": {\n \"self\": \"\",\n \"download\": \"\"\n }\n },\n \"included\": [\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n },\n {\n \"id\": \"\",\n \"type\": \"account\",\n \"attributes\": {\n \"company_name\": \"\"\n }\n }\n ],\n \"links\": {\n \"self\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "3929f213-601f-4213-a9c4-e668108e7816", + "id": "eaeea938-6935-4cf4-a4e1-949b496c3d47", "name": "Not Found", "originalRequest": { "url": { @@ -9777,7 +9777,7 @@ "method": "PATCH", "body": { "mode": "raw", - "raw": "{\n \"data\": {\n \"type\": \"document\",\n \"attributes\": {\n \"document_type_manual\": \"\",\n \"extracted_data_manual\": {\n \"key_0\": false,\n \"key_1\": 4838\n }\n }\n }\n}", + "raw": "{\n \"data\": {\n \"type\": \"document\",\n \"attributes\": {\n \"document_type_manual\": \"\",\n \"extracted_data_manual\": {\n \"key_0\": \"string\",\n \"key_1\": 2786.511240881493,\n \"key_2\": 2882.693867244948,\n \"key_3\": 5382.620330494894\n }\n }\n }\n}", "options": { "raw": { "headerFamily": "json", @@ -9794,7 +9794,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -9805,7 +9805,7 @@ } }, { - "id": "659517c4-a7dd-4102-b39e-18b3bce1c8cd", + "id": "ff61b84d-f716-49f3-b971-e745e62adfc2", "name": "Delete a document", "request": { "name": "Delete a document", @@ -9847,7 +9847,7 @@ }, "response": [ { - "id": "ddbdcd33-be71-47c7-acb7-5f39f494d2d6", + "id": "85a47545-e373-4715-aa45-ed8e674040a9", "name": "No Content", "originalRequest": { "url": { @@ -9892,7 +9892,7 @@ "_postman_previewlanguage": "text" }, { - "id": "3d318d03-1f40-47d4-984a-819fcfac17ea", + "id": "c0a7f2d4-4d6b-435c-8103-5ee9eab4a322", "name": "Not Found", "originalRequest": { "url": { @@ -9942,7 +9942,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -9953,7 +9953,7 @@ } }, { - "id": "81805dad-ed40-48dd-a1bf-ea43bad163d1", + "id": "140aa452-0de8-46b7-bb9c-be366f54fb99", "name": "Get a document download URL", "request": { "name": "Get a document download URL", @@ -9996,7 +9996,7 @@ }, "response": [ { - "id": "088c553c-81ba-4c0a-a47a-321e89db3f0d", + "id": "16d38b87-7418-42d3-9537-2e2f2d5d68b5", "name": "OK", "originalRequest": { "url": { @@ -10052,7 +10052,7 @@ "_postman_previewlanguage": "json" }, { - "id": "899187f7-63b2-4388-b060-6a07eafe8608", + "id": "403f97ae-10a6-4b79-bf44-f99ff876e7d1", "name": "Not Found", "originalRequest": { "url": { @@ -10103,12 +10103,12 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "80af5aa8-0550-481f-8d98-14468b6452af", + "id": "9a19a324-79f2-4f02-9e12-26308be89b70", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -10159,7 +10159,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -10170,7 +10170,7 @@ } }, { - "id": "9ee42508-06cb-4c5c-b606-88e2415a7f33", + "id": "1b420db7-4341-4c2d-8dc2-0a2110305a73", "name": "Re-extract a document", "request": { "name": "Re-extract a document", @@ -10213,7 +10213,7 @@ }, "response": [ { - "id": "954d82df-756e-4013-bd35-2cb83c45d14e", + "id": "53fa7cfc-f3c8-41c9-a578-fa463587675c", "name": "Accepted", "originalRequest": { "url": { @@ -10269,7 +10269,7 @@ "_postman_previewlanguage": "json" }, { - "id": "a962e4b7-058b-4095-8e7a-6f60e65605ab", + "id": "f9a1ba78-2b8b-4bd8-97f4-ffdc8ea3bc66", "name": "Not Found", "originalRequest": { "url": { @@ -10320,7 +10320,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -10331,7 +10331,7 @@ } }, { - "id": "f1dc26b9-ff6e-461c-8b50-5ae3627a8e0c", + "id": "67d82e14-d757-4fcd-a296-513670a4fb99", "name": "Re-classify a document", "request": { "name": "Re-classify a document", @@ -10374,7 +10374,7 @@ }, "response": [ { - "id": "d19a0639-6bef-4bc9-939e-50b860108deb", + "id": "b1a49151-cc1e-43a4-b24a-9a9a0425674f", "name": "Accepted", "originalRequest": { "url": { @@ -10430,7 +10430,7 @@ "_postman_previewlanguage": "json" }, { - "id": "99f023a3-357e-46e4-9367-5cdb9e419e13", + "id": "7d9673b7-a3cd-4e8b-8353-faa89844e15a", "name": "Not Found", "originalRequest": { "url": { @@ -10481,7 +10481,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -10492,7 +10492,7 @@ } }, { - "id": "9b9a3049-2397-44d4-9ddc-0092bba8d5a0", + "id": "a7668c6e-6f3a-4918-8ad0-934eb75b5f22", "name": "Re-link a document", "request": { "name": "Re-link a document", @@ -10535,7 +10535,7 @@ }, "response": [ { - "id": "11ce7c48-3fe4-4c6c-a0f8-4ccedf28de7b", + "id": "85002b48-1b01-4c67-afdc-027df28b7890", "name": "Accepted", "originalRequest": { "url": { @@ -10591,7 +10591,7 @@ "_postman_previewlanguage": "json" }, { - "id": "4843595c-21e5-423e-baa5-d1a0440a0aea", + "id": "b75d9ed6-ce66-4f05-b83b-1a33e75f35c6", "name": "Not Found", "originalRequest": { "url": { @@ -10642,7 +10642,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -10653,7 +10653,7 @@ } }, { - "id": "294072a0-86e6-4ac0-a084-c5e9bb3872bf", + "id": "64f47d48-4d21-45bc-83b7-225f8815ed67", "name": "Rotate a document", "request": { "name": "Rotate a document", @@ -10697,7 +10697,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"degrees\": 270\n}", + "raw": "{\n \"degrees\": 90\n}", "options": { "raw": { "headerFamily": "json", @@ -10709,7 +10709,7 @@ }, "response": [ { - "id": "c827e245-97c9-4ad3-b8c7-f45781022317", + "id": "94e33715-2732-4830-adfe-6bb09699248f", "name": "Accepted", "originalRequest": { "url": { @@ -10756,7 +10756,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"degrees\": 270\n}", + "raw": "{\n \"degrees\": 90\n}", "options": { "raw": { "headerFamily": "json", @@ -10778,7 +10778,7 @@ "_postman_previewlanguage": "json" }, { - "id": "efdc714f-13e7-48ac-bc79-5ca7939b735d", + "id": "9f5f5444-fe47-48ff-adbd-f2dd979be2fb", "name": "Not Found", "originalRequest": { "url": { @@ -10825,7 +10825,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"degrees\": 270\n}", + "raw": "{\n \"degrees\": 90\n}", "options": { "raw": { "headerFamily": "json", @@ -10842,12 +10842,12 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "6030cd6a-87e7-4cf7-a977-c97bf2f0843f", + "id": "afa11dc2-0fc3-4f2f-b41f-519434f95a54", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -10894,7 +10894,7 @@ "method": "POST", "body": { "mode": "raw", - "raw": "{\n \"degrees\": 270\n}", + "raw": "{\n \"degrees\": 90\n}", "options": { "raw": { "headerFamily": "json", @@ -10911,7 +10911,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -10928,7 +10928,7 @@ "description": "", "item": [ { - "id": "aacd6be4-8b4a-47ca-8bd3-6f5a1f63827e", + "id": "f9b897c8-e0ae-451b-9abb-0370e122675b", "name": "List email submissions", "request": { "name": "List email submissions", @@ -10986,7 +10986,7 @@ }, "response": [ { - "id": "64f08c13-dd6b-41dd-b45f-8cf3f3c215b7", + "id": "ac27c118-8c60-4b73-9c96-06e3197c0ec2", "name": "OK", "originalRequest": { "url": { @@ -11057,7 +11057,7 @@ "_postman_previewlanguage": "json" }, { - "id": "88c8cbd9-4841-4147-8af4-b31bd9c55606", + "id": "8b802843-b227-4898-99fb-9d8b0c435692", "name": "Bad Request", "originalRequest": { "url": { @@ -11123,12 +11123,12 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "f7cec02c-2cca-4016-9d1c-599b9b98be28", + "id": "57b80b99-ae46-4da3-8ac4-dbd20913a98a", "name": "Unauthorized", "originalRequest": { "url": { @@ -11194,7 +11194,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -11205,7 +11205,7 @@ } }, { - "id": "ddfbffdb-21f8-476b-bdd1-b00efcce3864", + "id": "efc10820-7e74-46a1-8bd7-1cb86bd51c98", "name": "Get an email submission", "request": { "name": "Get an email submission", @@ -11254,7 +11254,7 @@ }, "response": [ { - "id": "90d383bb-41a3-4ee7-a56e-797ca7d36170", + "id": "5279b191-66cb-4b7b-b2fd-38639f8fa075", "name": "OK", "originalRequest": { "url": { @@ -11319,7 +11319,7 @@ "_postman_previewlanguage": "json" }, { - "id": "b8305e21-a9c4-410f-8140-6248eed5b72d", + "id": "e07ac594-41a1-448c-8fd0-de151d340c35", "name": "Bad Request", "originalRequest": { "url": { @@ -11379,12 +11379,12 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "02833bf3-b328-469c-91aa-2eab397ea046", + "id": "a6924305-fc99-43b1-8def-a3c6d452fc0f", "name": "Not Found", "originalRequest": { "url": { @@ -11444,7 +11444,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -11461,7 +11461,7 @@ "description": "", "item": [ { - "id": "6e2f27b0-536c-4877-924a-f07ca3e0853d", + "id": "471e8482-7298-40a9-a767-89ef0e9408a1", "name": "Get a document schema", "request": { "name": "Get a document schema", @@ -11500,7 +11500,7 @@ }, "response": [ { - "id": "1b0b1229-0f76-40bd-a381-4fe414f71926", + "id": "9fed4e83-10b0-4d6b-81cf-dac348f4a9b4", "name": "OK", "originalRequest": { "url": { @@ -11550,12 +11550,12 @@ "value": "application/json" } ], - "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_schema\",\n \"attributes\": {\n \"document_type\": \"\",\n \"label\": \"\",\n \"schema_version\": \"\",\n \"full_version\": \"\",\n \"current\": \"\",\n \"draft\": \"\",\n \"active_at\": \"\",\n \"schema_format\": \"json_schema\",\n \"description\": \"\",\n \"schema_payload\": {\n \"key_0\": 1422\n },\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n}", + "body": "{\n \"data\": {\n \"id\": \"\",\n \"type\": \"document_schema\",\n \"attributes\": {\n \"document_type\": \"\",\n \"label\": \"\",\n \"schema_version\": \"\",\n \"full_version\": \"\",\n \"current\": \"\",\n \"draft\": \"\",\n \"active_at\": \"\",\n \"schema_format\": \"json_schema\",\n \"description\": \"\",\n \"schema_payload\": {\n \"key_0\": \"string\",\n \"key_1\": 2826.39449544839\n },\n \"created_at\": \"\",\n \"updated_at\": \"\"\n },\n \"links\": {\n \"self\": \"\"\n }\n },\n \"links\": {\n \"self\": \"\"\n }\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "d34c489b-d15e-4ea1-9a8a-8bffb39f66a3", + "id": "74e7b8cd-3cd1-4e53-bbd7-a68fb26c0828", "name": "Unauthorized", "originalRequest": { "url": { @@ -11605,12 +11605,12 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" }, { - "id": "faba1425-a12b-4da0-bc60-b045a57b1a33", + "id": "4bfd4cdc-094d-49d7-85b5-5f110e97a69d", "name": "Not Found", "originalRequest": { "url": { @@ -11660,7 +11660,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -11677,7 +11677,7 @@ "description": "", "item": [ { - "id": "74a8c336-9921-4dde-a7ed-1013180e798e", + "id": "99218489-9250-4ea1-897f-f32c3dd69112", "name": "Shipping Lines", "request": { "name": "Shipping Lines", @@ -11707,7 +11707,7 @@ }, "response": [ { - "id": "fa433a3a-be12-4917-8650-cdee6fcbd16a", + "id": "e1f51d12-9ade-4bef-9f5c-7052a053f7d5", "name": "OK", "originalRequest": { "url": { @@ -11756,7 +11756,7 @@ } }, { - "id": "c17f1229-37f6-4dba-8ca7-92e8526a7269", + "id": "b98225f9-8c45-46f0-8783-4b9dfac0f7a3", "name": "Get a single shipping line", "request": { "name": "Get a single shipping line", @@ -11798,7 +11798,7 @@ }, "response": [ { - "id": "206ceb96-f287-4177-b6b7-5f494fd185b7", + "id": "baba4abf-1091-4798-a50f-3ffec222393b", "name": "OK", "originalRequest": { "url": { @@ -11865,7 +11865,7 @@ "description": "", "item": [ { - "id": "4bb54883-c382-498f-aa51-7e24086b34fd", + "id": "c8bb82e0-191a-4bb6-974a-665084d07275", "name": "Get a vessel using the id", "request": { "name": "Get a vessel using the id", @@ -11926,7 +11926,7 @@ }, "response": [ { - "id": "2ad2af51-4eda-41e7-a518-40182f682f87", + "id": "f238e38b-b753-44b6-8024-030a810e5a5b", "name": "OK", "originalRequest": { "url": { @@ -12000,7 +12000,7 @@ "_postman_previewlanguage": "json" }, { - "id": "d2d6722c-6f0f-41aa-9dec-093cecde3da6", + "id": "b0af33dd-b391-4b06-bcc2-eaa06326b7dc", "name": "Forbidden - Feature not enabled", "originalRequest": { "url": { @@ -12080,7 +12080,7 @@ } }, { - "id": "362d1bf5-ba5e-4072-a07f-fb28804021a1", + "id": "59d81b6e-80e5-4c71-93df-66a6cf93c59c", "name": "Get a vessel using the imo", "request": { "name": "Get a vessel using the imo", @@ -12141,7 +12141,7 @@ }, "response": [ { - "id": "75726b78-ceaf-46d6-91eb-1fa81ee6143f", + "id": "d2619385-9116-439d-b4f4-aba937eb0494", "name": "OK", "originalRequest": { "url": { @@ -12215,7 +12215,7 @@ "_postman_previewlanguage": "json" }, { - "id": "5a2babe7-325c-4a98-a481-87d820260705", + "id": "24954151-4ccb-48eb-8ff6-5f4e0f628f20", "name": "Forbidden - Feature not enabled", "originalRequest": { "url": { @@ -12295,7 +12295,7 @@ } }, { - "id": "2f34dec5-458c-4def-bc81-c13bd3466b1c", + "id": "31e0c4c7-34a5-4098-814d-9ce0f8be5490", "name": "Get vessel future positions", "request": { "name": "Get vessel future positions", @@ -12357,7 +12357,7 @@ }, "response": [ { - "id": "8610e64b-bae7-4526-b646-e87a4338273e", + "id": "3ccb5312-d126-4784-acc9-2ce5f4b2308c", "name": "OK", "originalRequest": { "url": { @@ -12432,7 +12432,7 @@ "_postman_previewlanguage": "json" }, { - "id": "5986a110-fb9a-47da-aeb3-717acec10d2b", + "id": "16c1854d-189e-42e3-a79a-bc468e722025", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -12513,7 +12513,7 @@ } }, { - "id": "b38cd1d8-1032-40ae-b670-00fbdeb0449e", + "id": "9a53fd6a-2dcc-4944-8a05-4d60d015db1e", "name": "Get vessel future positions from coordinates", "request": { "name": "Get vessel future positions from coordinates", @@ -12593,7 +12593,7 @@ }, "response": [ { - "id": "3d150203-fd24-4161-b679-0255b7f4f15f", + "id": "7ca09c65-0ad0-464a-acad-824f5e4b8325", "name": "OK", "originalRequest": { "url": { @@ -12686,7 +12686,7 @@ "_postman_previewlanguage": "json" }, { - "id": "13fd64b8-a1e3-4669-910c-422d2134a423", + "id": "71323974-e2f4-4154-b1c9-2cc9ee5d5229", "name": "Forbidden - Routing data feature is not enabled for this account", "originalRequest": { "url": { @@ -12791,7 +12791,7 @@ "description": "", "item": [ { - "id": "0a770ac2-b3f9-43a7-8b80-2cd25f96598a", + "id": "1523fea5-43e7-4e8e-be9a-a6a9d3fee89e", "name": "list-parties", "request": { "name": "list-parties", @@ -12840,7 +12840,7 @@ }, "response": [ { - "id": "bcf9ed08-855e-4c6f-a9e7-83774fa39ce9", + "id": "d11322a7-2738-4737-8c8e-bebc2b244863", "name": "OK", "originalRequest": { "url": { @@ -12908,7 +12908,7 @@ } }, { - "id": "ece7efa0-ab7c-4512-a5af-910b9edfc4df", + "id": "476940c4-e5fe-4b2c-8e70-2f42c8fbdf47", "name": "post-party", "request": { "name": "post-party", @@ -12951,7 +12951,7 @@ }, "response": [ { - "id": "71031a6b-868a-46b7-9b61-4293011dbfdc", + "id": "dfb65e0b-d694-4ec7-a636-dcdf11e6fd7f", "name": "Party Created", "originalRequest": { "url": { @@ -13007,7 +13007,7 @@ "_postman_previewlanguage": "json" }, { - "id": "d717360e-e33d-4272-9fa2-049fd2b4028d", + "id": "9a47a695-c8eb-4600-86bc-b729a7c87112", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -13058,7 +13058,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -13069,7 +13069,7 @@ } }, { - "id": "49d4698d-1ce2-40f0-b511-eab03bf944a4", + "id": "e6725732-2f36-42e5-be3b-260fc2c67b93", "name": "get-parties-id", "request": { "name": "get-parties-id", @@ -13111,7 +13111,7 @@ }, "response": [ { - "id": "d05c477a-b84d-43ed-8633-62c858455239", + "id": "24ad750f-fd2f-4b39-b61a-6e0ad91becad", "name": "OK", "originalRequest": { "url": { @@ -13172,7 +13172,7 @@ } }, { - "id": "d985d348-a496-45c5-901c-5e93b2630f9f", + "id": "dfaadbd8-44f1-4194-bf5c-04cf4eaf7fdc", "name": "edit-party", "request": { "name": "edit-party", @@ -13227,7 +13227,7 @@ }, "response": [ { - "id": "c37d6f8e-1c54-46a1-8323-47971aa66986", + "id": "6dac20eb-309f-46ef-af93-5799116a8f85", "name": "OK", "originalRequest": { "url": { @@ -13295,7 +13295,7 @@ "_postman_previewlanguage": "json" }, { - "id": "aacc36a5-4dd0-409b-ac2e-cf132514c6d3", + "id": "70df33be-f978-48ab-ae96-a5241cabb00e", "name": "Unprocessable Entity", "originalRequest": { "url": { @@ -13358,7 +13358,7 @@ "value": "application/json" } ], - "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 8561.450642145574,\n \"key_1\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": false\n }\n }\n ]\n}", + "body": "{\n \"errors\": [\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": \"string\"\n }\n },\n {\n \"title\": \"\",\n \"detail\": \"\",\n \"source\": {\n \"pointer\": \"\",\n \"parameter\": \"\"\n },\n \"code\": \"\",\n \"status\": \"\",\n \"meta\": {\n \"key_0\": 961.5354134908882\n }\n }\n ]\n}", "cookie": [], "_postman_previewlanguage": "json" } @@ -13399,7 +13399,7 @@ } ], "info": { - "_postman_id": "eebc4468-c3da-4fca-bff5-573e2df65c4b", + "_postman_id": "abf6f263-fa75-4ee5-a164-d76df0ae8145", "name": "Terminal49 API Reference", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "description": { From d978a1afeb4e517e9dd72851691dd3b777d36087 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 11:03:04 -0700 Subject: [PATCH 04/19] Regenerate SDK auth docs --- .../reference/client/interceptors/classes/AuthInterceptor.mdx | 3 ++- .../sdk/reference/client/interfaces/Terminal49ClientConfig.mdx | 3 ++- .../reference/client/transport/interfaces/TransportConfig.mdx | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/sdk/reference/client/interceptors/classes/AuthInterceptor.mdx b/docs/sdk/reference/client/interceptors/classes/AuthInterceptor.mdx index 73b04bae..77669746 100644 --- a/docs/sdk/reference/client/interceptors/classes/AuthInterceptor.mdx +++ b/docs/sdk/reference/client/interceptors/classes/AuthInterceptor.mdx @@ -9,13 +9,14 @@ description: "AuthInterceptor reference for the Terminal49 TypeScript SDK, attac ### Constructor -> **new AuthInterceptor**(`apiToken`): `AuthInterceptor` +> **new AuthInterceptor**(`apiToken`, `accountId?`): `AuthInterceptor` #### Parameters | Parameter | Type | | ------ | ------ | | `apiToken` | `string` | +| `accountId?` | `string` | #### Returns diff --git a/docs/sdk/reference/client/interfaces/Terminal49ClientConfig.mdx b/docs/sdk/reference/client/interfaces/Terminal49ClientConfig.mdx index a5f63ced..1f24ed03 100644 --- a/docs/sdk/reference/client/interfaces/Terminal49ClientConfig.mdx +++ b/docs/sdk/reference/client/interfaces/Terminal49ClientConfig.mdx @@ -11,8 +11,9 @@ Configuration for [Terminal49Client](/sdk/reference/client/classes/Terminal49Cli | Property | Type | Description | | ------ | ------ | ------ | +| `accountId?` | `string` | Account id to send as `x-account-id` for user-scoped bearer tokens. | | `apiBaseUrl?` | `string` | API base URL. Defaults to `https://api.terminal49.com/v2`. | -| `apiToken` | `string` | Terminal49 API token. Pass either the raw token or a value prefixed with `Token `. | +| `apiToken` | `string` | Terminal49 API token. Pass either the raw token or a value prefixed with `Token ` or `Bearer `. | | `defaultFormat?` | [`ResponseFormat`](/sdk/reference/types/options/type-aliases/ResponseFormat) | Default response format for methods that support mapped responses. Defaults to `raw`. | | `fetchImpl?` | (`input`, `init?`) => `Promise`\<`Response`\> | Optional fetch implementation, useful for tests or custom runtimes. | | `maxRetries?` | `number` | Number of retry attempts for rate-limit and server errors. Defaults to `2`. | diff --git a/docs/sdk/reference/client/transport/interfaces/TransportConfig.mdx b/docs/sdk/reference/client/transport/interfaces/TransportConfig.mdx index b49c6295..4299024e 100644 --- a/docs/sdk/reference/client/transport/interfaces/TransportConfig.mdx +++ b/docs/sdk/reference/client/transport/interfaces/TransportConfig.mdx @@ -9,6 +9,7 @@ description: "TransportConfig interface in the Terminal49 TypeScript SDK, config | Property | Type | | ------ | ------ | +| `accountId?` | `string` | | `apiToken` | `string` | | `baseUrl` | `string` | | `fetchImpl?` | (`input`, `init?`) => `Promise`\<`Response`\> | From 32ee4820ff3946bccc2757055d71909d9481f1bb Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 12:53:28 -0700 Subject: [PATCH 05/19] fix(mcp): make WorkOS auth gateway spec-compliant (RFC 9728/8414/6750) Unify the OAuth resource identifier behind one resolver (packages/mcp/src/resource.ts) so the Protected Resource Metadata `resource` and the WWW-Authenticate `resource_metadata` URL can never diverge across dev/preview/staging/prod (RFC 9728). Drop the authorization-server metadata proxy, which re-served WorkOS's issuer from the resource origin in violation of RFC 8414 section 3.3. Clients discover the AS directly via the PRM's authorization_servers. Use registered RFC 6750 error codes: a bare Bearer challenge when no credentials are presented, error="invalid_token" when a token is rejected. Keep client-facing auth errors generic; detail stays in logs. - api/oauth-protected-resource.ts, api/mcp.ts: resolve via shared module - remove api/oauth-authorization-server.ts and its vercel.json wiring - add resolver + PRM endpoint tests (resource.test.ts, oauth-metadata.test.ts) Co-Authored-By: Claude Opus 4.8 (1M context) --- api/mcp.ts | 57 +++---- api/oauth-authorization-server.ts | 41 ----- api/oauth-protected-resource.ts | 34 ++--- packages/mcp/src/resource.ts | 87 +++++++++++ packages/mcp/tests/oauth-metadata.test.ts | 174 ++++++++++++++++++++++ packages/mcp/tests/resource.test.ts | 114 ++++++++++++++ vercel.json | 7 - 7 files changed, 409 insertions(+), 105 deletions(-) delete mode 100644 api/oauth-authorization-server.ts create mode 100644 packages/mcp/src/resource.ts create mode 100644 packages/mcp/tests/oauth-metadata.test.ts create mode 100644 packages/mcp/tests/resource.test.ts diff --git a/api/mcp.ts b/api/mcp.ts index 3a6572a8..330d15f5 100644 --- a/api/mcp.ts +++ b/api/mcp.ts @@ -13,6 +13,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import * as Sentry from '@sentry/node'; import { createTerminal49McpServer } from '../packages/mcp/src/server.js'; import { captureMcpException } from '../packages/mcp/src/sentry.js'; +import { protectedResourceMetadataUrl } from '../packages/mcp/src/resource.js'; type RequestLike = { method?: string; @@ -80,45 +81,29 @@ type ConnectedClientResolutionResponse = { error?: string; }; -const DEFAULT_MCP_RESOURCE_URL = 'https://mcp.terminal49.com'; +type UnauthorizedReason = 'missing_credentials' | 'invalid_token'; -function mcpResourceUrl(): string { - return process.env.WORKOS_MCP_RESOURCE?.trim() || - process.env.T49_MCP_RESOURCE_URL?.trim() || - DEFAULT_MCP_RESOURCE_URL; -} +function wwwAuthenticateHeader(req: RequestLike, reason: UnauthorizedReason): string { + const parts = ['Bearer realm="mcp"']; -function oauthProtectedResourceMetadataUrl(): string { - const configured = process.env.T49_MCP_RESOURCE_METADATA_URL?.trim(); - if (configured) { - return configured; + // RFC 6750 §3.1: include an error code only when a token was actually + // presented and rejected; omit it when the client sent no credentials. + if (reason === 'invalid_token') { + parts.push('error="invalid_token"'); + parts.push('error_description="The access token is invalid or expired"'); } - const resource = mcpResourceUrl(); - - try { - const url = new URL(resource); - return `${url.origin}/.well-known/oauth-protected-resource`; - } catch { - return `${resource.replace(/\/+$/, '')}/.well-known/oauth-protected-resource`; - } -} - -function wwwAuthenticateHeader(): string { - const metadataUrl = oauthProtectedResourceMetadataUrl(); - const parts = [ - 'Bearer realm="mcp"', - 'error="unauthorized"', - 'error_description="Authorization needed"', - ]; - - parts.push(`resource_metadata="${metadataUrl}"`); + parts.push(`resource_metadata="${protectedResourceMetadataUrl(req)}"`); return parts.join(', '); } -function setUnauthorizedChallenge(res: ResponseLike): void { - res.setHeader('WWW-Authenticate', wwwAuthenticateHeader()); +function setUnauthorizedChallenge( + res: ResponseLike, + req: RequestLike, + reason: UnauthorizedReason, +): void { + res.setHeader('WWW-Authenticate', wwwAuthenticateHeader(req, reason)); } function authKitMcpEnabled(): boolean { @@ -378,7 +363,7 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom if (!callerToken) { setCorsHeaders(res); - setUnauthorizedChallenge(res); + setUnauthorizedChallenge(res, req, 'missing_credentials'); res.status(401).json({ error: 'Unauthorized', message: @@ -406,10 +391,12 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom } catch (error) { const err = error as Error; setCorsHeaders(res); - setUnauthorizedChallenge(res); + setUnauthorizedChallenge(res, req, 'invalid_token'); + // Return a generic challenge to the client; keep the detailed reason in + // the server log (correlated by request_id) to avoid leaking internals. res.status(401).json({ error: 'Unauthorized', - message: err.message, + message: 'Invalid or expired token.', }); logLifecycle('mcp.request.complete', requestId, { reason: 'connected_client_resolve_failed', @@ -430,7 +417,7 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom if (!isMatchingClientSecret(callerToken, configuredClientSecret)) { setCorsHeaders(res); - setUnauthorizedChallenge(res); + setUnauthorizedChallenge(res, req, 'invalid_token'); res.status(401).json({ error: 'Unauthorized', message: 'Invalid client credentials.', diff --git a/api/oauth-authorization-server.ts b/api/oauth-authorization-server.ts deleted file mode 100644 index 3f0f3fb0..00000000 --- a/api/oauth-authorization-server.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { IncomingMessage, ServerResponse } from 'node:http'; - -type RequestLike = { - method?: string; -} & IncomingMessage; - -type ResponseLike = { - status(code: number): ResponseLike; - json(payload: unknown): void; - setHeader(name: string, value: string): void; - end(): void; -} & ServerResponse; - -export default async function handler(req: RequestLike, res: ResponseLike): Promise { - res.setHeader('Access-Control-Allow-Origin', '*'); - res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS'); - res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); - - if (req.method === 'OPTIONS') { - res.status(200).end(); - return; - } - - if (req.method !== 'GET') { - res.status(405).json({ error: 'Method not allowed' }); - return; - } - - const authorizationServer = process.env.WORKOS_AUTHORIZATION_SERVER_URL?.trim() || - process.env.WORKOS_ISSUER?.trim(); - - if (!authorizationServer) { - res.status(500).json({ error: 'WORKOS_AUTHORIZATION_SERVER_URL or WORKOS_ISSUER must be set.' }); - return; - } - - const response = await fetch(`${authorizationServer.replace(/\/+$/, '')}/.well-known/oauth-authorization-server`); - const payload = await response.json(); - - res.status(response.status).json(payload); -} diff --git a/api/oauth-protected-resource.ts b/api/oauth-protected-resource.ts index eefc3275..093fc44d 100644 --- a/api/oauth-protected-resource.ts +++ b/api/oauth-protected-resource.ts @@ -1,4 +1,5 @@ import type { IncomingMessage, ServerResponse } from 'node:http'; +import { resolveMcpResource } from '../packages/mcp/src/resource.js'; type RequestLike = { method?: string; @@ -11,27 +12,6 @@ type ResponseLike = { end(): void; } & ServerResponse; -const DEFAULT_MCP_RESOURCE_URL = 'https://mcp.terminal49.com'; - -function resourceUrl(req: RequestLike): string { - const configured = process.env.WORKOS_MCP_RESOURCE?.trim() || process.env.T49_MCP_RESOURCE_URL?.trim(); - if (configured) { - return configured.replace(/\/+$/, ''); - } - - const host = req.headers.host; - if (!host) { - return DEFAULT_MCP_RESOURCE_URL; - } - - const protocol = host?.startsWith('localhost') || host?.startsWith('127.0.0.1') ? 'http' : 'https'; - if (protocol === 'http') { - return `${protocol}://${host}`; - } - - return DEFAULT_MCP_RESOURCE_URL; -} - export default function handler(req: RequestLike, res: ResponseLike): void { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS'); @@ -55,9 +35,19 @@ export default function handler(req: RequestLike, res: ResponseLike): void { return; } + // RFC 9728 recommends advertising supported scopes. Driven by env so the + // value stays in sync with what the WorkOS authorization server actually + // issues; omitted entirely when unset to avoid advertising scopes the AS + // would reject. + const scopesSupported = (process.env.T49_MCP_SCOPES_SUPPORTED ?? '') + .split(',') + .map((scope) => scope.trim()) + .filter((scope) => scope.length > 0); + res.status(200).json({ - resource: resourceUrl(req), + resource: resolveMcpResource(req), authorization_servers: [authorizationServer.replace(/\/+$/, '')], bearer_methods_supported: ['header'], + ...(scopesSupported.length > 0 ? { scopes_supported: scopesSupported } : {}), }); } diff --git a/packages/mcp/src/resource.ts b/packages/mcp/src/resource.ts new file mode 100644 index 00000000..e964a8d4 --- /dev/null +++ b/packages/mcp/src/resource.ts @@ -0,0 +1,87 @@ +/** + * Single source of truth for the MCP server's OAuth "resource" identifier. + * + * RFC 9728 requires the `resource` advertised in Protected Resource Metadata to + * be the canonical URI the client actually connects to, and the same value the + * `WWW-Authenticate: ... resource_metadata=` challenge points at. Computing it + * in more than one place is how those drift apart (and how token-audience + * validation starts failing intermittently per host). So both the PRM endpoint + * and the 401 challenge in api/mcp.ts resolve through here. + * + * Resolution order, designed to be correct across every environment: + * 1. Explicit config (WORKOS_MCP_RESOURCE / T49_MCP_RESOURCE_URL) — set this + * in staging and production to pin the canonical audience the backend + * validates against. Host header is then ignored. + * 2. The actual request origin (scheme + host) — covers local dev + * (http://localhost:3000) and Vercel preview deploys (the preview domain) + * with zero config, and guarantees the PRM resource equals the origin that + * served it. + * 3. DEFAULT_MCP_RESOURCE_URL — last resort when there is no Host header. + * + * Security note: deriving from the Host header means a spoofed Host could change + * the advertised resource. That is bounded by T49_MCP_ALLOWED_HOSTS (validated + * before any handler logic runs) and is moot whenever step 1 applies, which is + * why staging/production should always set an explicit resource. + */ + +export const DEFAULT_MCP_RESOURCE_URL = 'https://mcp.terminal49.com'; + +type HeaderValue = string | string[] | undefined; + +export type ResourceRequestLike = { + headers: { host?: HeaderValue }; +}; + +const LOCAL_HOSTNAMES = new Set(['localhost', '127.0.0.1', '::1']); + +function firstHeaderValue(value: HeaderValue): string | undefined { + return Array.isArray(value) ? value[0] : value; +} + +function stripTrailingSlashes(value: string): string { + return value.replace(/\/+$/, ''); +} + +function configuredResource(): string | undefined { + const configured = + process.env.WORKOS_MCP_RESOURCE?.trim() || process.env.T49_MCP_RESOURCE_URL?.trim(); + return configured ? stripTrailingSlashes(configured) : undefined; +} + +/** + * Resolve the canonical resource URI for a given request. + */ +export function resolveMcpResource(req: ResourceRequestLike): string { + const configured = configuredResource(); + if (configured) { + return configured; + } + + const host = firstHeaderValue(req.headers.host)?.trim(); + if (!host) { + return DEFAULT_MCP_RESOURCE_URL; + } + + const hostname = host.split(':')[0]; + const scheme = LOCAL_HOSTNAMES.has(hostname) ? 'http' : 'https'; + return `${scheme}://${host}`; +} + +/** + * Resolve the Protected Resource Metadata (RFC 9728) URL for a given request. + * Always derived from the same resource value as {@link resolveMcpResource} so + * the PRM document and the WWW-Authenticate challenge stay in lockstep. + */ +export function protectedResourceMetadataUrl(req: ResourceRequestLike): string { + const explicit = process.env.T49_MCP_RESOURCE_METADATA_URL?.trim(); + if (explicit) { + return explicit; + } + + const resource = resolveMcpResource(req); + try { + return `${new URL(resource).origin}/.well-known/oauth-protected-resource`; + } catch { + return `${stripTrailingSlashes(resource)}/.well-known/oauth-protected-resource`; + } +} diff --git a/packages/mcp/tests/oauth-metadata.test.ts b/packages/mcp/tests/oauth-metadata.test.ts new file mode 100644 index 00000000..4ffa3b90 --- /dev/null +++ b/packages/mcp/tests/oauth-metadata.test.ts @@ -0,0 +1,174 @@ +import { EventEmitter } from 'node:events'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; + +import protectedResourceHandler from '../../../api/oauth-protected-resource.ts'; + +/** + * Mirrors the MockResponse used in api-handler.test.ts so these tests exercise + * the real handler code path (status/json/end/setHeader) without an HTTP server. + * Exhaustive resource-resolution scenarios live in resource.test.ts; this suite + * covers the PRM document shape and the endpoint's method/error handling. + */ +class MockResponse extends EventEmitter { + headersSent = false; + statusCode = 200; + payload: unknown = undefined; + jsonCalled = false; + endCalled = false; + headers: Record = {}; + + status(code: number): this { + this.statusCode = code; + return this; + } + + json(payload: unknown): void { + this.payload = payload; + this.jsonCalled = true; + this.headersSent = true; + this.emit('finish'); + } + + setHeader(name: string, value: string): void { + this.headers[name] = value; + } + + end(): void { + this.endCalled = true; + this.headersSent = true; + this.emit('finish'); + } +} + +function createRequest( + method: string, + headers: Record = {}, +): Record { + return { + method, + headers: { host: 'mcp.test', ...headers }, + }; +} + +const OAUTH_ENV_KEYS = [ + 'WORKOS_AUTHORIZATION_SERVER_URL', + 'WORKOS_ISSUER', + 'WORKOS_MCP_RESOURCE', + 'T49_MCP_RESOURCE_URL', + 'T49_MCP_RESOURCE_METADATA_URL', + 'T49_MCP_SCOPES_SUPPORTED', +] as const; + +function clearOauthEnv(): void { + for (const key of OAUTH_ENV_KEYS) { + delete process.env[key]; + } +} + +function payloadOf(res: MockResponse): Record { + return res.payload as Record; +} + +describe('api/oauth-protected-resource (RFC 9728 PRM)', () => { + beforeEach(clearOauthEnv); + afterEach(clearOauthEnv); + + it('returns the protected resource metadata document for a GET', () => { + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test/'; + const res = new MockResponse(); + + // No resource env set, so `resource` is derived from the request host. + protectedResourceHandler(createRequest('GET') as never, res as never); + + expect(res.statusCode).toBe(200); + expect(res.payload).toEqual({ + resource: 'https://mcp.test', + // Trailing slash on the authorization server is normalized away. + authorization_servers: ['https://auth.workos.test'], + bearer_methods_supported: ['header'], + }); + }); + + it('advertises an explicitly configured resource over the request host', () => { + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test'; + process.env.WORKOS_MCP_RESOURCE = 'https://mcp.terminal49.com'; + const res = new MockResponse(); + + protectedResourceHandler(createRequest('GET', { host: 'preview.vercel.app' }) as never, res as never); + + expect(payloadOf(res).resource).toBe('https://mcp.terminal49.com'); + }); + + it('omits scopes_supported when T49_MCP_SCOPES_SUPPORTED is unset', () => { + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test'; + const res = new MockResponse(); + + protectedResourceHandler(createRequest('GET') as never, res as never); + + expect(res.statusCode).toBe(200); + expect(res.payload).not.toHaveProperty('scopes_supported'); + }); + + it('advertises scopes_supported from env, trimmed and de-blanked', () => { + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test'; + process.env.T49_MCP_SCOPES_SUPPORTED = ' mcp:tools , , mcp:resources '; + const res = new MockResponse(); + + protectedResourceHandler(createRequest('GET') as never, res as never); + + expect(res.statusCode).toBe(200); + expect(payloadOf(res).scopes_supported).toEqual(['mcp:tools', 'mcp:resources']); + }); + + it('omits scopes_supported when the env value is only separators/whitespace', () => { + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test'; + process.env.T49_MCP_SCOPES_SUPPORTED = ' , , '; + const res = new MockResponse(); + + protectedResourceHandler(createRequest('GET') as never, res as never); + + expect(res.payload).not.toHaveProperty('scopes_supported'); + }); + + it('falls back to WORKOS_ISSUER when no explicit authorization server is set', () => { + process.env.WORKOS_ISSUER = 'https://issuer.workos.test/'; + const res = new MockResponse(); + + protectedResourceHandler(createRequest('GET') as never, res as never); + + expect(res.statusCode).toBe(200); + expect(payloadOf(res).authorization_servers).toEqual(['https://issuer.workos.test']); + }); + + it('returns 500 when no authorization server is configured', () => { + const res = new MockResponse(); + + protectedResourceHandler(createRequest('GET') as never, res as never); + + expect(res.statusCode).toBe(500); + expect(payloadOf(res).error).toContain('WORKOS_AUTHORIZATION_SERVER_URL'); + }); + + it('answers CORS preflight with 200, the right methods, and no body', () => { + const res = new MockResponse(); + + protectedResourceHandler(createRequest('OPTIONS') as never, res as never); + + expect(res.statusCode).toBe(200); + expect(res.endCalled).toBe(true); + expect(res.jsonCalled).toBe(false); + expect(res.headers['Access-Control-Allow-Origin']).toBe('*'); + expect(res.headers['Access-Control-Allow-Methods']).toBe('GET, OPTIONS'); + }); + + it('rejects non-GET methods with 405 and CORS headers', () => { + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test'; + const res = new MockResponse(); + + protectedResourceHandler(createRequest('POST') as never, res as never); + + expect(res.statusCode).toBe(405); + expect(payloadOf(res).error).toBe('Method not allowed'); + expect(res.headers['Access-Control-Allow-Origin']).toBe('*'); + }); +}); diff --git a/packages/mcp/tests/resource.test.ts b/packages/mcp/tests/resource.test.ts new file mode 100644 index 00000000..6aedf37f --- /dev/null +++ b/packages/mcp/tests/resource.test.ts @@ -0,0 +1,114 @@ +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; + +import { + DEFAULT_MCP_RESOURCE_URL, + protectedResourceMetadataUrl, + resolveMcpResource, +} from '../src/resource.ts'; + +const RESOURCE_ENV_KEYS = [ + 'WORKOS_MCP_RESOURCE', + 'T49_MCP_RESOURCE_URL', + 'T49_MCP_RESOURCE_METADATA_URL', +] as const; + +function clearResourceEnv(): void { + for (const key of RESOURCE_ENV_KEYS) { + delete process.env[key]; + } +} + +function req(host?: string | string[]): { headers: { host?: string | string[] } } { + return { headers: host === undefined ? {} : { host } }; +} + +describe('resolveMcpResource', () => { + beforeEach(clearResourceEnv); + afterEach(clearResourceEnv); + + describe('explicit configuration (staging / production)', () => { + it('uses WORKOS_MCP_RESOURCE and ignores the Host header', () => { + process.env.WORKOS_MCP_RESOURCE = 'https://mcp.terminal49.com'; + expect(resolveMcpResource(req('attacker.example.com'))).toBe('https://mcp.terminal49.com'); + }); + + it('falls back to T49_MCP_RESOURCE_URL when WORKOS_MCP_RESOURCE is unset', () => { + process.env.T49_MCP_RESOURCE_URL = 'https://mcp.staging.terminal49.com'; + expect(resolveMcpResource(req('whatever.host'))).toBe('https://mcp.staging.terminal49.com'); + }); + + it('prefers WORKOS_MCP_RESOURCE over T49_MCP_RESOURCE_URL', () => { + process.env.WORKOS_MCP_RESOURCE = 'https://primary.example.com'; + process.env.T49_MCP_RESOURCE_URL = 'https://secondary.example.com'; + expect(resolveMcpResource(req())).toBe('https://primary.example.com'); + }); + + it('strips trailing slashes from configured values', () => { + process.env.WORKOS_MCP_RESOURCE = 'https://mcp.test///'; + expect(resolveMcpResource(req('mcp.test'))).toBe('https://mcp.test'); + }); + }); + + describe('request-origin derivation (dev / preview, no config)', () => { + it('derives https://{host} for a normal production-style host', () => { + expect(resolveMcpResource(req('mcp.terminal49.com'))).toBe('https://mcp.terminal49.com'); + }); + + it('derives https://{host} for a Vercel preview host', () => { + expect(resolveMcpResource(req('t49-mcp-git-feature.vercel.app'))).toBe( + 'https://t49-mcp-git-feature.vercel.app', + ); + }); + + it('uses http for localhost', () => { + expect(resolveMcpResource(req('localhost:3000'))).toBe('http://localhost:3000'); + }); + + it('uses http for 127.0.0.1', () => { + expect(resolveMcpResource(req('127.0.0.1:8080'))).toBe('http://127.0.0.1:8080'); + }); + + it('reads the first value when Host is an array', () => { + expect(resolveMcpResource(req(['mcp.test', 'second.host']))).toBe('https://mcp.test'); + }); + + it('falls back to the default when there is no Host header', () => { + expect(resolveMcpResource(req())).toBe(DEFAULT_MCP_RESOURCE_URL); + }); + }); +}); + +describe('protectedResourceMetadataUrl', () => { + beforeEach(clearResourceEnv); + afterEach(clearResourceEnv); + + it('honors an explicit T49_MCP_RESOURCE_METADATA_URL override', () => { + process.env.T49_MCP_RESOURCE_METADATA_URL = + 'https://custom.example.com/.well-known/oauth-protected-resource'; + expect(protectedResourceMetadataUrl(req('mcp.test'))).toBe( + 'https://custom.example.com/.well-known/oauth-protected-resource', + ); + }); + + it('derives the metadata URL from the configured resource origin', () => { + process.env.WORKOS_MCP_RESOURCE = 'https://mcp.terminal49.com'; + expect(protectedResourceMetadataUrl(req('ignored.host'))).toBe( + 'https://mcp.terminal49.com/.well-known/oauth-protected-resource', + ); + }); + + it('derives from the request origin (preserving port) when unconfigured', () => { + expect(protectedResourceMetadataUrl(req('localhost:3000'))).toBe( + 'http://localhost:3000/.well-known/oauth-protected-resource', + ); + }); + + it('stays in lockstep with resolveMcpResource for the same request (RFC 9728)', () => { + // The whole point of one shared resolver: the PRM `resource` origin and the + // WWW-Authenticate `resource_metadata` host must always agree. + const r = req('t49-mcp-git-feature.vercel.app'); + const resourceOrigin = new URL(resolveMcpResource(r)).origin; + const metadataOrigin = new URL(protectedResourceMetadataUrl(r)).origin; + expect(metadataOrigin).toBe(resourceOrigin); + }); +}); diff --git a/vercel.json b/vercel.json index 8000aea7..5a300cc6 100644 --- a/vercel.json +++ b/vercel.json @@ -9,9 +9,6 @@ }, "api/oauth-protected-resource.ts": { "maxDuration": 10 - }, - "api/oauth-authorization-server.ts": { - "maxDuration": 10 } }, "rewrites": [ @@ -19,10 +16,6 @@ "source": "/.well-known/oauth-protected-resource", "destination": "/api/oauth-protected-resource" }, - { - "source": "/.well-known/oauth-authorization-server", - "destination": "/api/oauth-authorization-server" - }, { "source": "/mcp", "destination": "/api/mcp" From 4a640504595e64dc9785f8c5ab57d920d28e8ad8 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 12:53:41 -0700 Subject: [PATCH 06/19] chore: migrate lint/format from Biome to oxlint + oxfmt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consolidate the toolchain across @terminal49/mcp and @terminal49/sdk: replace Biome (and leftover dead ESLint configs) with oxlint for linting and oxfmt for formatting. Preserve each package's prior CI gate — MCP is lint-only, SDK is lint + format-check. Formatter config is migrated from Biome so single-quote style is preserved and the SDK's generated code stays excluded. Regenerate the root and SDK lockfiles (Biome out, oxlint/oxfmt in) and drop packages/mcp/package-lock.json: it is referenced by nothing (CI and Vercel install from the root workspace lockfile), was already stale, and cannot be regenerated standalone because @terminal49/sdk is a workspace package. Fix the two no-useless-fallback-in-spread warnings oxlint surfaced. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 4 +- package-lock.json | 1124 ++++-- packages/mcp/.eslintrc.json | 22 - packages/mcp/.oxfmtrc.json | 17 + packages/mcp/.oxlintrc.json | 4 + packages/mcp/biome.json | 34 - packages/mcp/eslint.config.js | 31 - packages/mcp/package-lock.json | 3125 ----------------- packages/mcp/package.json | 7 +- .../mcp/src/tools/list-tracking-requests.ts | 2 +- sdks/typescript-sdk/.eslintrc.json | 16 - sdks/typescript-sdk/.oxfmtrc.json | 18 + sdks/typescript-sdk/.oxlintrc.json | 4 + sdks/typescript-sdk/README.md | 2 +- sdks/typescript-sdk/biome.json | 25 - sdks/typescript-sdk/eslint.config.js | 17 - sdks/typescript-sdk/package-lock.json | 1137 ++++-- sdks/typescript-sdk/package.json | 6 +- sdks/typescript-sdk/src/test/mock-fetch.ts | 2 +- 19 files changed, 1783 insertions(+), 3814 deletions(-) delete mode 100644 packages/mcp/.eslintrc.json create mode 100644 packages/mcp/.oxfmtrc.json create mode 100644 packages/mcp/.oxlintrc.json delete mode 100644 packages/mcp/biome.json delete mode 100644 packages/mcp/eslint.config.js delete mode 100644 packages/mcp/package-lock.json delete mode 100644 sdks/typescript-sdk/.eslintrc.json create mode 100644 sdks/typescript-sdk/.oxfmtrc.json create mode 100644 sdks/typescript-sdk/.oxlintrc.json delete mode 100644 sdks/typescript-sdk/biome.json delete mode 100644 sdks/typescript-sdk/eslint.config.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 00f70ad1..91083468 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: test -z "$(git status --porcelain -- docs/sdk/reference)" - name: Test SDK run: npm test -- --run - - name: Lint SDK (Biome) + - name: Lint SDK (oxlint + oxfmt) run: npm run lint mcp: @@ -58,5 +58,5 @@ jobs: run: npm run build --workspace @terminal49/mcp - name: Test MCP run: npm run test --workspace @terminal49/mcp -- --run --coverage - - name: Lint MCP (Biome) + - name: Lint MCP (oxlint + oxfmt) run: npm run lint --workspace @terminal49/mcp diff --git a/package-lock.json b/package-lock.json index ba77f650..6b6ea7b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -196,169 +196,6 @@ "node": ">=18" } }, - "node_modules/@biomejs/biome": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.15.tgz", - "integrity": "sha512-u+jlPBAU2B45LDkjjNNYpc1PvqrM/co4loNommS9/sl9oSxsAQKsNZejYuUztvToB5oXi1tN/e62iNd6ESiY3g==", - "dev": true, - "license": "MIT OR Apache-2.0", - "bin": { - "biome": "bin/biome" - }, - "engines": { - "node": ">=14.21.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/biome" - }, - "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.3.15", - "@biomejs/cli-darwin-x64": "2.3.15", - "@biomejs/cli-linux-arm64": "2.3.15", - "@biomejs/cli-linux-arm64-musl": "2.3.15", - "@biomejs/cli-linux-x64": "2.3.15", - "@biomejs/cli-linux-x64-musl": "2.3.15", - "@biomejs/cli-win32-arm64": "2.3.15", - "@biomejs/cli-win32-x64": "2.3.15" - } - }, - "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.15.tgz", - "integrity": "sha512-SDCdrJ4COim1r8SNHg19oqT50JfkI/xGZHSyC6mGzMfKrpNe/217Eq6y98XhNTc0vGWDjznSDNXdUc6Kg24jbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.15.tgz", - "integrity": "sha512-RkyeSosBtn3C3Un8zQnl9upX0Qbq4E3QmBa0qjpOh1MebRbHhNlRC16jk8HdTe/9ym5zlfnpbb8cKXzW+vlTxw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.15.tgz", - "integrity": "sha512-FN83KxrdVWANOn5tDmW6UBC0grojchbGmcEz6JkRs2YY6DY63sTZhwkQ56x6YtKhDVV1Unz7FJexy8o7KwuIhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.15.tgz", - "integrity": "sha512-SSSIj2yMkFdSkXqASzIBdjySBXOe65RJlhKEDlri7MN19RC4cpez+C0kEwPrhXOTgJbwQR9QH1F4+VnHkC35pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.15.tgz", - "integrity": "sha512-T8n9p8aiIKOrAD7SwC7opiBM1LYGrE5G3OQRXWgbeo/merBk8m+uxJ1nOXMPzfYyFLfPlKF92QS06KN1UW+Zbg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.15.tgz", - "integrity": "sha512-dbjPzTh+ijmmNwojFYbQNMFp332019ZDioBYAMMJj5Ux9d8MkM+u+J68SBJGVwVeSHMYj+T9504CoxEzQxrdNw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.15.tgz", - "integrity": "sha512-puMuenu/2brQdgqtQ7geNwQlNVxiABKEZJhMRX6AGWcmrMO8EObMXniFQywy2b81qmC+q+SDvlOpspNwz0WiOA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-x64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.15.tgz", - "integrity": "sha512-kDZr/hgg+igo5Emi0LcjlgfkoGZtgIpJKhnvKTRmMBv6FF/3SDyEV4khBwqNebZIyMZTzvpca9sQNSXJ39pI2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, "node_modules/@canvas/image-data": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.1.0.tgz", @@ -3361,138 +3198,784 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@openapi-contrib/openapi-schema-to-json-schema": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.2.0.tgz", + "integrity": "sha512-Gj6C0JwCr8arj0sYuslWXUBSP/KnUlEGnPW4qxlXvAl543oaNQgMgIgkQUA6vs5BCCvwTEiL8m/wdWzfl4UvSw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.214.0.tgz", + "integrity": "sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.214.0.tgz", + "integrity": "sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.214.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", + "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.41.1.tgz", + "integrity": "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.55.0.tgz", + "integrity": "sha512-+rFDOqQe5LOWgxrAJaZgLRudr6GQm0wGI6gtu7vVkrdLGjNMUSGbAlaCr8j7F2H2Er97vYQCU8WDb30onqMM1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.55.0.tgz", + "integrity": "sha512-ctulLq8s3x8Zmvw6+iccB09TIKERAklRSmbJ10gk8mlAn05qZxoyo52dj3Hi9IJcmDSwF54fQaTVh2CbL6PInw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.55.0.tgz", + "integrity": "sha512-xDQczLH9pw/RBk1h/GH0qcGMm8hQtmtVHBNLSH3lk1gEIR09hZ4L+mJQl4VqiVAvPK9VG9PYrWWuSQLt7xTbiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.55.0.tgz", + "integrity": "sha512-JaNoFCkF2CJdGgpPSMbuO9HVyXyoNGIhMHPvp6NYAjeVKw9XEYc0HcUWJLPQa3Q69WV5wMa9m5jPMJPtbLtcRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.55.0.tgz", + "integrity": "sha512-DNbszhpg6S2MIzax5azdHFTTBIVkR5xr8yyRZuA4yoDAwOkzIp3tmldgKZM2+VlT+hJIG0xUksA+elISzMEAfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.55.0.tgz", + "integrity": "sha512-2snoaoRfFFyGnbOcKUK36rREBYxe/Xgz3uHbiA5zbCB/s6R4DQj4mHqYAaWWhgizCUSDxV8cE9zAZ0XleNpKGw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.55.0.tgz", + "integrity": "sha512-q1aktHF/WRpSK81BX1dE/9vWrS2jGw1Nax2kb4DBLGAewubCLcoNyp4Zl/NSMgbv3vUS46Z33wIQkBVYOP3PYg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.55.0.tgz", + "integrity": "sha512-VD0y36aENezl/3tsclA/4G53Cc7iV+7Uoh7gz4yvcOTaEYBtJpQsE6PKDGTtUtOvGS4kv51ybfXY/nWZejO5IA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.55.0.tgz", + "integrity": "sha512-r8xlKJFcsRmn0H5jZrdORae6RX9jDBrZVvOoxF+bCQtampQJClv80aZEHsv+NsLsp2KCE5ql79O7DpPVzYWpXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.55.0.tgz", + "integrity": "sha512-GRKv/HXHcwIVld/WU61rF0g0R16hl5EJ+ScKdpjevT57lnLnagj/U2YUbXf2mT+2Pg1uCzWC+mvGicPV3CDdLQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.55.0.tgz", + "integrity": "sha512-rdv57enTiPtpSYRMKfAiEbQb0Puw5t9N7isVinDoo5qeLDScro2gznmZqSgSWbVZRzLisTeCTW8Qwgw0bOHv3A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.55.0.tgz", + "integrity": "sha512-7v1nNrlD43VY6+sYQ6efYyb3lE6QY182304PD/768ZxTjOmFd/3dQa3u/nGBUAXYdGSWOQc5N3PnS0QzUXyEIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.55.0.tgz", + "integrity": "sha512-f4lJLUSPOgScjFl9LiflKCTocyNRwE25JmTMbN4XQdDjoZzEHjqf3wA3VESF1/csg7i8m7+EQLbrZyYDqe10UQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.55.0.tgz", + "integrity": "sha512-MihqiPziJNoWy4MqNSV+jVA1g+07iQDjZiR0vaCaDoPgFEiJpCMsxamktzLV07cEeQsSJ04vQaU4CzCQwIvtDA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.55.0.tgz", + "integrity": "sha512-Yqghym7KYAVjP9MmSrNZiDeerMuoejNjo0r3ox5H3GDKk8eAfl8VyJm9i+pWCLDCTnAbcTUMMN2ZKjUYXH1v3g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.55.0.tgz", + "integrity": "sha512-s5SDvVVSbyQl1V5UU3Yl12M+XLUQ3rl5SglNqgAA2K4PXUtQhyNSS00wivONPEnNo5W01rCou8WkDNyvI/RGHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.55.0.tgz", + "integrity": "sha512-7p9FB5R32tw2KyyNX3wpQrR2WHwEHvMEiBlGXxeTCaRMCVNx3UtFMAUbaQ/pRNWIrEUZmYhJ6tcUH52uPTRYjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.55.0.tgz", + "integrity": "sha512-ZYqj3fDnOT1IaVGMP5kpmkQl4F3tQIm2ZyAxvqkJYmI0xgWWak4ss4XYwv3VDfM+TWXeC9K4uQ/wW5jm/5XABA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.55.0.tgz", + "integrity": "sha512-eEYT5tivGnGbPHuOHuQpi6CGLObhh0re/5jcNQHihD2GRYkTM85dyi5a19zjP8Q00t1uqAx+/QGLUGdHeqzWyg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.70.0.tgz", + "integrity": "sha512-zFh0P4cswmRvw6nkyb89dr18rRanuaCPAsEXsFDoQY8WdaquI8Pt4NWFjaMJg6L23cy5NeN8J9cBnREbWzZhaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.70.0.tgz", + "integrity": "sha512-qI8o4HZjeGiBrWv+pJv4lH0Yi2Gl/JSp/EumBUApezJprIKa5PS4nU0lQsQngtky8k+SplQIOjv6hwu0SSxeyg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.70.0.tgz", + "integrity": "sha512-8KjgVVHI5F9nVwHCRwwA78Ty7zNKP4Wd9OeN5PSv3iu/F/u1RVXoOCgLhWqust6HmwQG6xc8c+RCyaWENy24+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.70.0.tgz", + "integrity": "sha512-WVydssv5PSUBXFJTdNBWlmGkbNmvPGaFt/2SUT/EZRB6bq6bEOHmMlbnupZD5jmlEvi9+mZJHi8TCw15lyfSfQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.70.0.tgz", + "integrity": "sha512-hJucmUf8OlinHNb1R7fI4Fw6WsAstOz7i8nmkWQfiHoZXtbufNm+MxiDTIMk1ggh2Ro4vLzgQ+bKvRY54MZoRA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.70.0.tgz", + "integrity": "sha512-1BnS7wbCYDSXwWzJJ+mc3NURoha6m6m6RT5c6vgAY3oz7C3OVXP+S0awo2mRq97arrJkVvO3qRQfyAHL+76xtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.70.0.tgz", + "integrity": "sha512-yKy/UdbR55+M2yEcuiV5DCNC/gdQAjr/GioUy50QwBzSrKm8ueWADqyRLS9Xk+qjNeCYGg6A8FvUBds56ttfqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.70.0.tgz", + "integrity": "sha512-0A5XJ4alvmqFUFP/4oYSyaO+qLto/HrKEWTSaegiVl+HOufFngK2BjYw9x4RbwBt/du5QG6l5q1zeWiJYYG5yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.70.0.tgz", + "integrity": "sha512-JiylyurlB0CLSedNtx1gzv3FvfWPF1h/2Y3BJszPLNt5XQFlBsH5ke0Jle3iJb3uqu5m2e7A/DwzpuCAHdiU+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.70.0.tgz", + "integrity": "sha512-J8VPG7I3/HmgaU4u8pNU2kFx2+0U+vPLS1dXFxXOaR/2TQ0f8AC7DRz0SRGRI1bfphnX2hVYTTtLuhL4nYKL+Q==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.70.0.tgz", + "integrity": "sha512-N2+4lV2KLN+oXTIIIwmWDhwkrnvqf5oX7Hw0zPjk+RuIVgiBQSOlJWF7uQoFx2siEYX0ZQ5cfSbEAHm+J3t7Wg==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@openapi-contrib/openapi-schema-to-json-schema": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.2.0.tgz", - "integrity": "sha512-Gj6C0JwCr8arj0sYuslWXUBSP/KnUlEGnPW4qxlXvAl543oaNQgMgIgkQUA6vs5BCCvwTEiL8m/wdWzfl4UvSw==", + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.70.0.tgz", + "integrity": "sha512-1e2L7cFCvx9QDzq6NPP+0tABKb5z6nWHyddWTNKprEsjO9xNrAtPowuCGpjNXxkTdsMiZ4jc8YQ5SstZd4XK6g==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", - "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", - "license": "Apache-2.0", + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.70.0.tgz", + "integrity": "sha512-Kwu/l/8GcYibCWA9m9N5pRXMIKVSsL/YbgpLzYkqDhWTiqdRfnNJ/+nqIKRKQiFbHWsdlHEhzMwruJK+qcEruA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.214.0.tgz", - "integrity": "sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.70.0.tgz", + "integrity": "sha512-tap04CsHYOl0nSAQJfPNIuBxqEPB2HnhQqwaOXLg1jnp2XfRo8Fa814dA4QC4zpvTWXCjAAaCY1W5LOORkEQuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@opentelemetry/core": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", - "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.70.0.tgz", + "integrity": "sha512-hzJa/WgvtJpbBD9rgfy0qe+MjbxOXNUT0bfR1S6EQQzfTtBFA9xg5q8KSwRrQ2QfSS+TaP4j+4mVPQrfNc6UNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.214.0.tgz", - "integrity": "sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.214.0", - "import-in-the-middle": "^3.0.0", - "require-in-the-middle": "^8.0.0" - }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.70.0.tgz", + "integrity": "sha512-xbsaNSNzVSnaJACCUYr1HQMyY/Q/Q1LkePmHG3UvZPvGCYGNxrsZp9OmtA6ick8xH47ltRRbRrPCM1YXYcyC+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@opentelemetry/resources": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", - "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.7.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.70.0.tgz", + "integrity": "sha512-icAEsUI7JbW1TMRdEXV83mVAInhRVQYuuAlPpxdGwJ95chNdnCzjloRW8GglT0WvzOEZSio6fnYSk2DJ2Hv7LQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", - "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.7.1", - "@opentelemetry/resources": "2.7.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.70.0.tgz", + "integrity": "sha512-FHMSWbVsPVs/f+Jcl04ws4JJ2wUnauyTzlpxWRG/lSO/8GpX08Fo2gQZqdA6CrRFI+zvkxl+N/KwJGWfUwYVZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.41.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.41.1.tgz", - "integrity": "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==", - "license": "Apache-2.0", + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.70.0.tgz", + "integrity": "sha512-ptOlKwCz7n4AKs5VweMqG6DAg677FmKOK+vBkkL9DMNgFATIQ+upqUYBTOEwRQyRAx1ncGlPlXleV2hIcm3z4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=14" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@posthog/core": { @@ -11963,6 +12446,107 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oxfmt": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.55.0.tgz", + "integrity": "sha512-jSj2wCTakwgPMxkfiVZX0jf+nX+Nz6xlyAZjqNE0qXTFdCBPYlP6JAN+ODjmealw7DXBjOzYbdsqwBMAZnPZ6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinypool": "2.1.0" + }, + "bin": { + "oxfmt": "bin/oxfmt" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxfmt/binding-android-arm-eabi": "0.55.0", + "@oxfmt/binding-android-arm64": "0.55.0", + "@oxfmt/binding-darwin-arm64": "0.55.0", + "@oxfmt/binding-darwin-x64": "0.55.0", + "@oxfmt/binding-freebsd-x64": "0.55.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.55.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.55.0", + "@oxfmt/binding-linux-arm64-gnu": "0.55.0", + "@oxfmt/binding-linux-arm64-musl": "0.55.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.55.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.55.0", + "@oxfmt/binding-linux-riscv64-musl": "0.55.0", + "@oxfmt/binding-linux-s390x-gnu": "0.55.0", + "@oxfmt/binding-linux-x64-gnu": "0.55.0", + "@oxfmt/binding-linux-x64-musl": "0.55.0", + "@oxfmt/binding-openharmony-arm64": "0.55.0", + "@oxfmt/binding-win32-arm64-msvc": "0.55.0", + "@oxfmt/binding-win32-ia32-msvc": "0.55.0", + "@oxfmt/binding-win32-x64-msvc": "0.55.0" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/oxlint": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.70.0.tgz", + "integrity": "sha512-D6JgHtzkhRwvEC+A0Nw5AEc5bk8x5i1pHzvZIEf/a0C4hOzmAACNGtkDGPyFaxxX3ZVGxCPeig3P3rMM8XU3/g==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.70.0", + "@oxlint/binding-android-arm64": "1.70.0", + "@oxlint/binding-darwin-arm64": "1.70.0", + "@oxlint/binding-darwin-x64": "1.70.0", + "@oxlint/binding-freebsd-x64": "1.70.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.70.0", + "@oxlint/binding-linux-arm-musleabihf": "1.70.0", + "@oxlint/binding-linux-arm64-gnu": "1.70.0", + "@oxlint/binding-linux-arm64-musl": "1.70.0", + "@oxlint/binding-linux-ppc64-gnu": "1.70.0", + "@oxlint/binding-linux-riscv64-gnu": "1.70.0", + "@oxlint/binding-linux-riscv64-musl": "1.70.0", + "@oxlint/binding-linux-s390x-gnu": "1.70.0", + "@oxlint/binding-linux-x64-gnu": "1.70.0", + "@oxlint/binding-linux-x64-musl": "1.70.0", + "@oxlint/binding-openharmony-arm64": "1.70.0", + "@oxlint/binding-win32-arm64-msvc": "1.70.0", + "@oxlint/binding-win32-ia32-msvc": "1.70.0", + "@oxlint/binding-win32-x64-msvc": "1.70.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.22.1", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, "node_modules/p-any": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-any/-/p-any-4.0.0.tgz", @@ -14686,6 +15270,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinypool": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.1.0.tgz", + "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, "node_modules/tinyrainbow": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", @@ -16063,8 +16657,9 @@ "zod": "^4.3.6" }, "devDependencies": { - "@biomejs/biome": "^2.3.15", "@types/node": "^24.10.13", + "oxfmt": "^0.55.0", + "oxlint": "^1.70.0", "tsx": "^4.20.6", "typescript": "^5.6.3", "vitest": "^4.0.13" @@ -16084,11 +16679,12 @@ "openapi-fetch": "^0.15.2" }, "devDependencies": { - "@biomejs/biome": "^2.3.15", "@types/node": "^24.10.13", "@vitest/coverage-v8": "^4.0.18", "dotenv": "^17.3.1", "openapi-typescript": "^7.13.0", + "oxfmt": "^0.55.0", + "oxlint": "^1.70.0", "typedoc": "^0.28.19", "typedoc-plugin-markdown": "^4.11.0", "typescript": "^5.6.3", diff --git a/packages/mcp/.eslintrc.json b/packages/mcp/.eslintrc.json deleted file mode 100644 index efdef32f..00000000 --- a/packages/mcp/.eslintrc.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2022, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "plugins": ["@typescript-eslint"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended" - ], - "rules": { - "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }], - "no-console": "off" - }, - "env": { - "node": true, - "es2022": true - } -} diff --git a/packages/mcp/.oxfmtrc.json b/packages/mcp/.oxfmtrc.json new file mode 100644 index 00000000..ad4c34a5 --- /dev/null +++ b/packages/mcp/.oxfmtrc.json @@ -0,0 +1,17 @@ +{ + "useTabs": false, + "tabWidth": 2, + "printWidth": 80, + "singleQuote": true, + "jsxSingleQuote": false, + "quoteProps": "as-needed", + "trailingComma": "all", + "semi": true, + "arrowParens": "always", + "bracketSameLine": false, + "bracketSpacing": true, + "ignorePatterns": [ + "dist/**", + "node_modules/**" + ] +} diff --git a/packages/mcp/.oxlintrc.json b/packages/mcp/.oxlintrc.json new file mode 100644 index 00000000..2108c646 --- /dev/null +++ b/packages/mcp/.oxlintrc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json", + "ignorePatterns": ["dist/**", "node_modules/**"] +} diff --git a/packages/mcp/biome.json b/packages/mcp/biome.json deleted file mode 100644 index 5c353334..00000000 --- a/packages/mcp/biome.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.15/schema.json", - "files": { - "includes": ["**", "!dist/**", "!node_modules/**"] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 2 - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "complexity": { - "recommended": false - }, - "correctness": { - "noSwitchDeclarations": "off" - }, - "style": { - "recommended": false - }, - "suspicious": { - "noExplicitAny": "off" - } - } - }, - "javascript": { - "formatter": { - "quoteStyle": "single" - } - } -} diff --git a/packages/mcp/eslint.config.js b/packages/mcp/eslint.config.js deleted file mode 100644 index 2cbbae26..00000000 --- a/packages/mcp/eslint.config.js +++ /dev/null @@ -1,31 +0,0 @@ -import eslint from '@eslint/js'; -import tseslint from 'typescript-eslint'; - -export default tseslint.config( - eslint.configs.recommended, - ...tseslint.configs.recommendedTypeChecked, - { - files: ['**/*.ts'], - languageOptions: { - parserOptions: { - project: './tsconfig.json', - tsconfigRootDir: import.meta.dirname, - }, - }, - rules: { - // Relax strictness for SDK response shapes (lots of `any` from generated types) - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - '@typescript-eslint/no-unsafe-argument': 'off', - '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/require-await': 'off', - '@typescript-eslint/no-floating-promises': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-unnecessary-type-assertion': 'off', - '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], - 'no-case-declarations': 'off', - 'no-unused-vars': 'off', - }, - } -); diff --git a/packages/mcp/package-lock.json b/packages/mcp/package-lock.json deleted file mode 100644 index b0abb438..00000000 --- a/packages/mcp/package-lock.json +++ /dev/null @@ -1,3125 +0,0 @@ -{ - "name": "@terminal49/mcp", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@terminal49/mcp", - "version": "0.1.0", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.29.0", - "@sentry/node": "^10.55.0", - "@terminal49/sdk": "0.2.0", - "zod": "^4.3.6" - }, - "devDependencies": { - "@biomejs/biome": "^2.3.15", - "@types/node": "^24.10.13", - "tsx": "^4.20.6", - "typescript": "^5.6.3", - "vitest": "^4.0.13" - }, - "engines": { - "node": "24.x" - } - }, - "node_modules/@biomejs/biome": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.14.tgz", - "integrity": "sha512-TmAvxOEgrpLypzVGJ8FulIZnlyA9TxrO1hyqYrCz9r+bwma9xXxuLA5IuYnj55XQneFx460KjRbx6SWGLkg3bQ==", - "dev": true, - "license": "MIT OR Apache-2.0", - "bin": { - "biome": "bin/biome" - }, - "engines": { - "node": ">=14.21.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/biome" - }, - "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.14", - "@biomejs/cli-darwin-x64": "2.4.14", - "@biomejs/cli-linux-arm64": "2.4.14", - "@biomejs/cli-linux-arm64-musl": "2.4.14", - "@biomejs/cli-linux-x64": "2.4.14", - "@biomejs/cli-linux-x64-musl": "2.4.14", - "@biomejs/cli-win32-arm64": "2.4.14", - "@biomejs/cli-win32-x64": "2.4.14" - } - }, - "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.14.tgz", - "integrity": "sha512-XvgoE9XOawUOQPdmvs4J7wPhi/DLwSCGks3AlPJDmh34O0awRTqCED1HRcRDdpf1Zrp4us4MGOOdIxNpbqNF5Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.14.tgz", - "integrity": "sha512-jE7hKBCFhOx3uUh+ZkWBfOHxAcILPfhFplNkuID/eZeSTLHzfZzoZxW8fbqY9xXRnPi7jGNAf1iPVR+0yWsM/Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.14.tgz", - "integrity": "sha512-2TELhZnW5RSLL063l9rc5xLpA0ZIw0Ccwy/0q384rvNAgFw3yI76bd59547yxowdQr5MNPET/xDLrLuvgSeeWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.14.tgz", - "integrity": "sha512-/z+6gqAqqUQTHazwStxSXKHg9b8UvqBmDFRp+c4wYbq2KXhELQDon9EoC9RpmQ8JWkqQx/lIUy/cs+MhzDZp6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.14.tgz", - "integrity": "sha512-zHrlQZDBDUz4OLAraYpWKcnLS6HOewBFWYOzY91d1ZjdqZwibOyb6BEu6WuWLugyo0P3riCmsbV9UqV1cSXwQg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.14.tgz", - "integrity": "sha512-R6BWgJdQOwW9ulJatuTVrQkjnODjqHZkKNOqb1sz++3Noe5LYd0i3PchnOBUCYAPHoPWHhjJqbdZlHEu0hpjdA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.14.tgz", - "integrity": "sha512-M3EH5hqOI/F/FUA2u4xcLoUgmxd218mvuj/6JL7Hv2toQvr2/AdOvKSpGkoRuWFCtQPVa+ZqkEV3Q5xBA9+XSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.14.tgz", - "integrity": "sha512-WL0EG5qE+EAKomGXbf2g6VnSKJhTL3tXC0QRzWRwA5VpjxNYa6H4P7ZWfymbGE4IhZZQi1KXQ2R0YjwInmz2fA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@hono/node-server": { - "version": "1.19.14", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", - "license": "MIT", - "dependencies": { - "@hono/node-server": "^1.19.9", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.2.1", - "express-rate-limit": "^8.2.1", - "hono": "^4.11.4", - "jose": "^6.1.3", - "json-schema-typed": "^8.0.2", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.25 || ^4.0", - "zod-to-json-schema": "^3.25.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@cfworker/json-schema": "^4.1.1", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "@cfworker/json-schema": { - "optional": true - }, - "zod": { - "optional": false - } - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", - "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.214.0.tgz", - "integrity": "sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", - "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.214.0.tgz", - "integrity": "sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.214.0", - "import-in-the-middle": "^3.0.0", - "require-in-the-middle": "^8.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", - "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.7.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", - "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.7.1", - "@opentelemetry/resources": "2.7.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.41.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.41.1.tgz", - "integrity": "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", - "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", - "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", - "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", - "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", - "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", - "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", - "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", - "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", - "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", - "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", - "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", - "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", - "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", - "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", - "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", - "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", - "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", - "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", - "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", - "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", - "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", - "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", - "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", - "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", - "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sentry/core": { - "version": "10.55.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.55.0.tgz", - "integrity": "sha512-XUyoNtDSYCvgJnoNzlh+YeAXfIPhCRIXbhWqqM3GQ3AFtZICi85lkyfsrwXEl9wzlPGYnU+Eg8F4tOfScx+FcQ==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@sentry/node": { - "version": "10.55.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.55.0.tgz", - "integrity": "sha512-+fB/ByoHVWPLGgoafYciiMatTNyX1FHj1bsqZBN+Pw3McbuEU1nwCPLt9zuyZZiWlQtXKsyuACS4ZhXnID5l8A==", - "license": "MIT", - "dependencies": { - "@opentelemetry/api": "^1.9.1", - "@opentelemetry/core": "^2.6.1", - "@opentelemetry/instrumentation": "^0.214.0", - "@opentelemetry/sdk-trace-base": "^2.6.1", - "@opentelemetry/semantic-conventions": "^1.40.0", - "@sentry/core": "10.55.0", - "@sentry/node-core": "10.55.0", - "@sentry/opentelemetry": "10.55.0", - "import-in-the-middle": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@sentry/node-core": { - "version": "10.55.0", - "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.55.0.tgz", - "integrity": "sha512-M8XMMIk9Y0PGZoEt37Oe5dQCdqDdJlBcwLXidpz/s5k4QtJvCO/BbtcivcuKI2htw5FwxJkSrHUzRvT36tlDpg==", - "license": "MIT", - "dependencies": { - "@sentry/core": "10.55.0", - "@sentry/opentelemetry": "10.55.0", - "import-in-the-middle": "^3.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/core": "^1.30.1 || ^2.1.0", - "@opentelemetry/exporter-trace-otlp-http": ">=0.57.0 <1", - "@opentelemetry/instrumentation": ">=0.57.1 <1", - "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", - "@opentelemetry/semantic-conventions": "^1.39.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@opentelemetry/core": { - "optional": true - }, - "@opentelemetry/exporter-trace-otlp-http": { - "optional": true - }, - "@opentelemetry/instrumentation": { - "optional": true - }, - "@opentelemetry/sdk-trace-base": { - "optional": true - }, - "@opentelemetry/semantic-conventions": { - "optional": true - } - } - }, - "node_modules/@sentry/opentelemetry": { - "version": "10.55.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.55.0.tgz", - "integrity": "sha512-0+YrNmVNrttki4rWP4DW+UTt5MziepwDLNBde39tgc3cGCcy5fLSdDfhb4JfTaE5TXt4kd5XrkgvS/sDgm3RZg==", - "license": "MIT", - "dependencies": { - "@sentry/core": "10.55.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/core": "^1.30.1 || ^2.1.0", - "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", - "@opentelemetry/semantic-conventions": "^1.39.0" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@terminal49/sdk": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@terminal49/sdk/-/sdk-0.2.0.tgz", - "integrity": "sha512-VZWyXx0k669PvolNo9qs64m3PZ4m88dR8+bxU4T9kFEce5q8ytXjPLo9jWeRqSfl5pPK4EtbXhTnXbHENnV16w==", - "dependencies": { - "jsona": "^1.12.1", - "openapi-fetch": "^0.15.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", - "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@vitest/expect": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.18", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.18", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-rate-limit": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", - "license": "MIT", - "dependencies": { - "ip-address": "^10.2.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", - "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hono": { - "version": "4.12.18", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.18.tgz", - "integrity": "sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==", - "license": "MIT", - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/import-in-the-middle": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.0.1.tgz", - "integrity": "sha512-pYkiyXVL2Mf3pozdlDGV6NAObxQx13Ae8knZk1UJRJ6uRW/ZRmTGHlQYtrsSl7ubuE5F8CD1z+s1n4RHNuTtuA==", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/jose": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "license": "BSD-2-Clause" - }, - "node_modules/jsona": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/jsona/-/jsona-1.12.1.tgz", - "integrity": "sha512-44WL4ZdsKx//mCDPUFQtbK7mnVdHXcVzbBy7Pzy0LAgXyfpN5+q8Hum7cLUX4wTnRsClHb4eId1hePZYchwczg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.1" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/module-details-from-path": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", - "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/openapi-fetch": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.15.2.tgz", - "integrity": "sha512-rdYTzUmSsJevmNqg7fwUVGuKc2Gfb9h6ph74EVPkPfIGJaZTfqdIbJahtbJ3qg1LKinln30hqZniLnKpH0RJBg==", - "license": "MIT", - "dependencies": { - "openapi-typescript-helpers": "^0.0.15" - } - }, - "node_modules/openapi-typescript-helpers": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz", - "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==", - "license": "MIT" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-to-regexp": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", - "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", - "license": "MIT", - "engines": { - "node": ">=16.20.0" - } - }, - "node_modules/postcss": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-in-the-middle": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", - "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3" - }, - "engines": { - "node": ">=9.3.0 || >=8.10.0 <9.0.0" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/rollup": { - "version": "4.60.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", - "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.4", - "@rollup/rollup-android-arm64": "4.60.4", - "@rollup/rollup-darwin-arm64": "4.60.4", - "@rollup/rollup-darwin-x64": "4.60.4", - "@rollup/rollup-freebsd-arm64": "4.60.4", - "@rollup/rollup-freebsd-x64": "4.60.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", - "@rollup/rollup-linux-arm-musleabihf": "4.60.4", - "@rollup/rollup-linux-arm64-gnu": "4.60.4", - "@rollup/rollup-linux-arm64-musl": "4.60.4", - "@rollup/rollup-linux-loong64-gnu": "4.60.4", - "@rollup/rollup-linux-loong64-musl": "4.60.4", - "@rollup/rollup-linux-ppc64-gnu": "4.60.4", - "@rollup/rollup-linux-ppc64-musl": "4.60.4", - "@rollup/rollup-linux-riscv64-gnu": "4.60.4", - "@rollup/rollup-linux-riscv64-musl": "4.60.4", - "@rollup/rollup-linux-s390x-gnu": "4.60.4", - "@rollup/rollup-linux-x64-gnu": "4.60.4", - "@rollup/rollup-linux-x64-musl": "4.60.4", - "@rollup/rollup-openbsd-x64": "4.60.4", - "@rollup/rollup-openharmony-arm64": "4.60.4", - "@rollup/rollup-win32-arm64-msvc": "4.60.4", - "@rollup/rollup-win32-ia32-msvc": "4.60.4", - "@rollup/rollup-win32-x64-gnu": "4.60.4", - "@rollup/rollup-win32-x64-msvc": "4.60.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", - "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.18", - "@vitest/mocker": "4.0.18", - "@vitest/pretty-format": "4.0.18", - "@vitest/runner": "4.0.18", - "@vitest/snapshot": "4.0.18", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.18", - "@vitest/browser-preview": "4.0.18", - "@vitest/browser-webdriverio": "4.0.18", - "@vitest/ui": "4.0.18", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.25 || ^4" - } - } - } -} diff --git a/packages/mcp/package.json b/packages/mcp/package.json index 9fbd3ad9..a26a282c 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -8,7 +8,9 @@ "build": "tsc", "test": "vitest", "test:coverage": "vitest --run --coverage", - "lint": "biome lint src", + "lint": "oxlint src", + "format": "oxfmt --write src", + "format:check": "oxfmt --check src", "type-check": "tsc --noEmit", "mcp:stdio": "tsx src/index.ts", "sdk:setup": "node ./scripts/sdk-setup.mjs" @@ -27,8 +29,9 @@ "zod": "^4.3.6" }, "devDependencies": { - "@biomejs/biome": "^2.3.15", "@types/node": "^24.10.13", + "oxfmt": "^0.55.0", + "oxlint": "^1.70.0", "tsx": "^4.20.6", "typescript": "^5.6.3", "vitest": "^4.0.13" diff --git a/packages/mcp/src/tools/list-tracking-requests.ts b/packages/mcp/src/tools/list-tracking-requests.ts index e0e3928e..19ea9dd1 100644 --- a/packages/mcp/src/tools/list-tracking-requests.ts +++ b/packages/mcp/src/tools/list-tracking-requests.ts @@ -31,7 +31,7 @@ export async function executeListTrackingRequests( try { const filters = { - ...(args.filters || {}), + ...args.filters, ...(args.status ? { 'filter[status]': args.status } : {}), ...(args.request_type ? { 'filter[request_type]': args.request_type } : {}), }; diff --git a/sdks/typescript-sdk/.eslintrc.json b/sdks/typescript-sdk/.eslintrc.json deleted file mode 100644 index dc21f54b..00000000 --- a/sdks/typescript-sdk/.eslintrc.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "root": true, - "env": { - "node": true, - "es2022": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": "./tsconfig.json" - }, - "plugins": ["@typescript-eslint"], - "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], - "rules": { - "@typescript-eslint/no-explicit-any": "off" - } -} diff --git a/sdks/typescript-sdk/.oxfmtrc.json b/sdks/typescript-sdk/.oxfmtrc.json new file mode 100644 index 00000000..e430d42c --- /dev/null +++ b/sdks/typescript-sdk/.oxfmtrc.json @@ -0,0 +1,18 @@ +{ + "useTabs": false, + "tabWidth": 2, + "printWidth": 80, + "singleQuote": true, + "jsxSingleQuote": false, + "quoteProps": "as-needed", + "trailingComma": "all", + "semi": true, + "arrowParens": "always", + "bracketSameLine": false, + "bracketSpacing": true, + "ignorePatterns": [ + "dist/**", + "node_modules/**", + "src/generated/**" + ] +} diff --git a/sdks/typescript-sdk/.oxlintrc.json b/sdks/typescript-sdk/.oxlintrc.json new file mode 100644 index 00000000..10be0315 --- /dev/null +++ b/sdks/typescript-sdk/.oxlintrc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json", + "ignorePatterns": ["dist/**", "node_modules/**", "src/generated/**"] +} diff --git a/sdks/typescript-sdk/README.md b/sdks/typescript-sdk/README.md index d5d1a3e7..c49ee4aa 100644 --- a/sdks/typescript-sdk/README.md +++ b/sdks/typescript-sdk/README.md @@ -77,7 +77,7 @@ npm run type-check # Tests npm test -# Lint (Biome) +# Lint (oxlint + oxfmt) npm run lint # Build diff --git a/sdks/typescript-sdk/biome.json b/sdks/typescript-sdk/biome.json deleted file mode 100644 index 122637a2..00000000 --- a/sdks/typescript-sdk/biome.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.15/schema.json", - "files": { - "includes": ["**", "!dist/**", "!node_modules/**", "!src/generated/**"] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 2 - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "suspicious": { - "noExplicitAny": "off" - } - } - }, - "javascript": { - "formatter": { - "quoteStyle": "single" - } - } -} diff --git a/sdks/typescript-sdk/eslint.config.js b/sdks/typescript-sdk/eslint.config.js deleted file mode 100644 index 9c3c1ee9..00000000 --- a/sdks/typescript-sdk/eslint.config.js +++ /dev/null @@ -1,17 +0,0 @@ -import eslint from '@eslint/js'; -import tseslint from 'typescript-eslint'; - -export default tseslint.config( - eslint.configs.recommended, - ...tseslint.configs.recommended, - { - languageOptions: { - parserOptions: { - project: './tsconfig.json', - }, - }, - rules: { - '@typescript-eslint/no-explicit-any': 'off', - }, - } -); diff --git a/sdks/typescript-sdk/package-lock.json b/sdks/typescript-sdk/package-lock.json index db9b8e36..0841715d 100644 --- a/sdks/typescript-sdk/package-lock.json +++ b/sdks/typescript-sdk/package-lock.json @@ -12,11 +12,12 @@ "openapi-fetch": "^0.15.2" }, "devDependencies": { - "@biomejs/biome": "^2.3.15", "@types/node": "^24.10.13", "@vitest/coverage-v8": "^4.0.18", "dotenv": "^17.3.1", "openapi-typescript": "^7.13.0", + "oxfmt": "^0.55.0", + "oxlint": "^1.70.0", "typedoc": "^0.28.19", "typedoc-plugin-markdown": "^4.11.0", "typescript": "^5.6.3", @@ -101,207 +102,299 @@ "node": ">=18" } }, - "node_modules/@biomejs/biome": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.14.tgz", - "integrity": "sha512-TmAvxOEgrpLypzVGJ8FulIZnlyA9TxrO1hyqYrCz9r+bwma9xXxuLA5IuYnj55XQneFx460KjRbx6SWGLkg3bQ==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT OR Apache-2.0", - "bin": { - "biome": "bin/biome" - }, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=14.21.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/biome" - }, - "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.14", - "@biomejs/cli-darwin-x64": "2.4.14", - "@biomejs/cli-linux-arm64": "2.4.14", - "@biomejs/cli-linux-arm64-musl": "2.4.14", - "@biomejs/cli-linux-x64": "2.4.14", - "@biomejs/cli-linux-x64-musl": "2.4.14", - "@biomejs/cli-win32-arm64": "2.4.14", - "@biomejs/cli-win32-x64": "2.4.14" + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.14.tgz", - "integrity": "sha512-XvgoE9XOawUOQPdmvs4J7wPhi/DLwSCGks3AlPJDmh34O0awRTqCED1HRcRDdpf1Zrp4us4MGOOdIxNpbqNF5Q==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT OR Apache-2.0", + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=14.21.3" + "node": ">=18" } }, - "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.14.tgz", - "integrity": "sha512-jE7hKBCFhOx3uUh+ZkWBfOHxAcILPfhFplNkuID/eZeSTLHzfZzoZxW8fbqY9xXRnPi7jGNAf1iPVR+0yWsM/Q==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT OR Apache-2.0", + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=14.21.3" + "node": ">=18" } }, - "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.14.tgz", - "integrity": "sha512-2TELhZnW5RSLL063l9rc5xLpA0ZIw0Ccwy/0q384rvNAgFw3yI76bd59547yxowdQr5MNPET/xDLrLuvgSeeWQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT OR Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.21.3" + "node": ">=18" } }, - "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.14.tgz", - "integrity": "sha512-/z+6gqAqqUQTHazwStxSXKHg9b8UvqBmDFRp+c4wYbq2KXhELQDon9EoC9RpmQ8JWkqQx/lIUy/cs+MhzDZp6A==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT OR Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.21.3" + "node": ">=18" } }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.14.tgz", - "integrity": "sha512-zHrlQZDBDUz4OLAraYpWKcnLS6HOewBFWYOzY91d1ZjdqZwibOyb6BEu6WuWLugyo0P3riCmsbV9UqV1cSXwQg==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", "cpu": [ - "x64" + "loong64" ], "dev": true, - "license": "MIT OR Apache-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.21.3" + "node": ">=18" } }, - "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.14.tgz", - "integrity": "sha512-R6BWgJdQOwW9ulJatuTVrQkjnODjqHZkKNOqb1sz++3Noe5LYd0i3PchnOBUCYAPHoPWHhjJqbdZlHEu0hpjdA==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", "cpu": [ - "x64" + "mips64el" ], "dev": true, - "license": "MIT OR Apache-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.21.3" + "node": ">=18" } }, - "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.14.tgz", - "integrity": "sha512-M3EH5hqOI/F/FUA2u4xcLoUgmxd218mvuj/6JL7Hv2toQvr2/AdOvKSpGkoRuWFCtQPVa+ZqkEV3Q5xBA9+XSA==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, - "license": "MIT OR Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">=14.21.3" + "node": ">=18" } }, - "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.14.tgz", - "integrity": "sha512-WL0EG5qE+EAKomGXbf2g6VnSKJhTL3tXC0QRzWRwA5VpjxNYa6H4P7ZWfymbGE4IhZZQi1KXQ2R0YjwInmz2fA==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", "cpu": [ - "x64" + "riscv64" ], "dev": true, - "license": "MIT OR Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">=14.21.3" + "node": ">=18" } }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/linux-s390x": { "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", "cpu": [ - "ppc64" + "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { + "node_modules/@esbuild/linux-x64": { "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm64": { + "node_modules/@esbuild/netbsd-arm64": { "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", "cpu": [ "arm64" ], @@ -309,16 +402,16 @@ "license": "MIT", "optional": true, "os": [ - "android" + "netbsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-x64": { + "node_modules/@esbuild/netbsd-x64": { "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", "cpu": [ "x64" ], @@ -326,16 +419,16 @@ "license": "MIT", "optional": true, "os": [ - "android" + "netbsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/darwin-arm64": { + "node_modules/@esbuild/openbsd-arm64": { "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", "cpu": [ "arm64" ], @@ -343,16 +436,16 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "openbsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/darwin-x64": { + "node_modules/@esbuild/openbsd-x64": { "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", "cpu": [ "x64" ], @@ -360,16 +453,16 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "openbsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/freebsd-arm64": { + "node_modules/@esbuild/openharmony-arm64": { "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", "cpu": [ "arm64" ], @@ -377,50 +470,483 @@ "license": "MIT", "optional": true, "os": [ - "freebsd" + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@gerrit0/mini-shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz", + "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-oniguruma": "^3.23.0", + "@shikijs/langs": "^3.23.0", + "@shikijs/themes": "^3.23.0", + "@shikijs/types": "^3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.55.0.tgz", + "integrity": "sha512-+rFDOqQe5LOWgxrAJaZgLRudr6GQm0wGI6gtu7vVkrdLGjNMUSGbAlaCr8j7F2H2Er97vYQCU8WDb30onqMM1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.55.0.tgz", + "integrity": "sha512-ctulLq8s3x8Zmvw6+iccB09TIKERAklRSmbJ10gk8mlAn05qZxoyo52dj3Hi9IJcmDSwF54fQaTVh2CbL6PInw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.55.0.tgz", + "integrity": "sha512-xDQczLH9pw/RBk1h/GH0qcGMm8hQtmtVHBNLSH3lk1gEIR09hZ4L+mJQl4VqiVAvPK9VG9PYrWWuSQLt7xTbiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.55.0.tgz", + "integrity": "sha512-JaNoFCkF2CJdGgpPSMbuO9HVyXyoNGIhMHPvp6NYAjeVKw9XEYc0HcUWJLPQa3Q69WV5wMa9m5jPMJPtbLtcRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.55.0.tgz", + "integrity": "sha512-DNbszhpg6S2MIzax5azdHFTTBIVkR5xr8yyRZuA4yoDAwOkzIp3tmldgKZM2+VlT+hJIG0xUksA+elISzMEAfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.55.0.tgz", + "integrity": "sha512-2snoaoRfFFyGnbOcKUK36rREBYxe/Xgz3uHbiA5zbCB/s6R4DQj4mHqYAaWWhgizCUSDxV8cE9zAZ0XleNpKGw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.55.0.tgz", + "integrity": "sha512-q1aktHF/WRpSK81BX1dE/9vWrS2jGw1Nax2kb4DBLGAewubCLcoNyp4Zl/NSMgbv3vUS46Z33wIQkBVYOP3PYg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.55.0.tgz", + "integrity": "sha512-VD0y36aENezl/3tsclA/4G53Cc7iV+7Uoh7gz4yvcOTaEYBtJpQsE6PKDGTtUtOvGS4kv51ybfXY/nWZejO5IA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.55.0.tgz", + "integrity": "sha512-r8xlKJFcsRmn0H5jZrdORae6RX9jDBrZVvOoxF+bCQtampQJClv80aZEHsv+NsLsp2KCE5ql79O7DpPVzYWpXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.55.0.tgz", + "integrity": "sha512-GRKv/HXHcwIVld/WU61rF0g0R16hl5EJ+ScKdpjevT57lnLnagj/U2YUbXf2mT+2Pg1uCzWC+mvGicPV3CDdLQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.55.0.tgz", + "integrity": "sha512-rdv57enTiPtpSYRMKfAiEbQb0Puw5t9N7isVinDoo5qeLDScro2gznmZqSgSWbVZRzLisTeCTW8Qwgw0bOHv3A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.55.0.tgz", + "integrity": "sha512-7v1nNrlD43VY6+sYQ6efYyb3lE6QY182304PD/768ZxTjOmFd/3dQa3u/nGBUAXYdGSWOQc5N3PnS0QzUXyEIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.55.0.tgz", + "integrity": "sha512-f4lJLUSPOgScjFl9LiflKCTocyNRwE25JmTMbN4XQdDjoZzEHjqf3wA3VESF1/csg7i8m7+EQLbrZyYDqe10UQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.55.0.tgz", + "integrity": "sha512-MihqiPziJNoWy4MqNSV+jVA1g+07iQDjZiR0vaCaDoPgFEiJpCMsxamktzLV07cEeQsSJ04vQaU4CzCQwIvtDA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.55.0.tgz", + "integrity": "sha512-Yqghym7KYAVjP9MmSrNZiDeerMuoejNjo0r3ox5H3GDKk8eAfl8VyJm9i+pWCLDCTnAbcTUMMN2ZKjUYXH1v3g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.55.0.tgz", + "integrity": "sha512-s5SDvVVSbyQl1V5UU3Yl12M+XLUQ3rl5SglNqgAA2K4PXUtQhyNSS00wivONPEnNo5W01rCou8WkDNyvI/RGHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.55.0.tgz", + "integrity": "sha512-7p9FB5R32tw2KyyNX3wpQrR2WHwEHvMEiBlGXxeTCaRMCVNx3UtFMAUbaQ/pRNWIrEUZmYhJ6tcUH52uPTRYjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.55.0.tgz", + "integrity": "sha512-ZYqj3fDnOT1IaVGMP5kpmkQl4F3tQIm2ZyAxvqkJYmI0xgWWak4ss4XYwv3VDfM+TWXeC9K4uQ/wW5jm/5XABA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.55.0.tgz", + "integrity": "sha512-eEYT5tivGnGbPHuOHuQpi6CGLObhh0re/5jcNQHihD2GRYkTM85dyi5a19zjP8Q00t1uqAx+/QGLUGdHeqzWyg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.70.0.tgz", + "integrity": "sha512-zFh0P4cswmRvw6nkyb89dr18rRanuaCPAsEXsFDoQY8WdaquI8Pt4NWFjaMJg6L23cy5NeN8J9cBnREbWzZhaw==", "cpu": [ - "x64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" + "android" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.70.0.tgz", + "integrity": "sha512-qI8o4HZjeGiBrWv+pJv4lH0Yi2Gl/JSp/EumBUApezJprIKa5PS4nU0lQsQngtky8k+SplQIOjv6hwu0SSxeyg==", "cpu": [ - "arm" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.70.0.tgz", + "integrity": "sha512-8KjgVVHI5F9nVwHCRwwA78Ty7zNKP4Wd9OeN5PSv3iu/F/u1RVXoOCgLhWqust6HmwQG6xc8c+RCyaWENy24+w==", "cpu": [ "arm64" ], @@ -428,52 +954,52 @@ "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.70.0.tgz", + "integrity": "sha512-WVydssv5PSUBXFJTdNBWlmGkbNmvPGaFt/2SUT/EZRB6bq6bEOHmMlbnupZD5jmlEvi9+mZJHi8TCw15lyfSfQ==", "cpu": [ - "ia32" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.70.0.tgz", + "integrity": "sha512-hJucmUf8OlinHNb1R7fI4Fw6WsAstOz7i8nmkWQfiHoZXtbufNm+MxiDTIMk1ggh2Ro4vLzgQ+bKvRY54MZoRA==", "cpu": [ - "loong64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.70.0.tgz", + "integrity": "sha512-1BnS7wbCYDSXwWzJJ+mc3NURoha6m6m6RT5c6vgAY3oz7C3OVXP+S0awo2mRq97arrJkVvO3qRQfyAHL+76xtQ==", "cpu": [ - "mips64el" + "arm" ], "dev": true, "license": "MIT", @@ -482,15 +1008,15 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.70.0.tgz", + "integrity": "sha512-yKy/UdbR55+M2yEcuiV5DCNC/gdQAjr/GioUy50QwBzSrKm8ueWADqyRLS9Xk+qjNeCYGg6A8FvUBds56ttfqg==", "cpu": [ - "ppc64" + "arm" ], "dev": true, "license": "MIT", @@ -499,15 +1025,15 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.70.0.tgz", + "integrity": "sha512-0A5XJ4alvmqFUFP/4oYSyaO+qLto/HrKEWTSaegiVl+HOufFngK2BjYw9x4RbwBt/du5QG6l5q1zeWiJYYG5yg==", "cpu": [ - "riscv64" + "arm64" ], "dev": true, "license": "MIT", @@ -516,15 +1042,15 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.70.0.tgz", + "integrity": "sha512-JiylyurlB0CLSedNtx1gzv3FvfWPF1h/2Y3BJszPLNt5XQFlBsH5ke0Jle3iJb3uqu5m2e7A/DwzpuCAHdiU+A==", "cpu": [ - "s390x" + "arm64" ], "dev": true, "license": "MIT", @@ -533,15 +1059,15 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.70.0.tgz", + "integrity": "sha512-J8VPG7I3/HmgaU4u8pNU2kFx2+0U+vPLS1dXFxXOaR/2TQ0f8AC7DRz0SRGRI1bfphnX2hVYTTtLuhL4nYKL+Q==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "license": "MIT", @@ -550,64 +1076,64 @@ "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.70.0.tgz", + "integrity": "sha512-N2+4lV2KLN+oXTIIIwmWDhwkrnvqf5oX7Hw0zPjk+RuIVgiBQSOlJWF7uQoFx2siEYX0ZQ5cfSbEAHm+J3t7Wg==", "cpu": [ - "arm64" + "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.70.0.tgz", + "integrity": "sha512-1e2L7cFCvx9QDzq6NPP+0tABKb5z6nWHyddWTNKprEsjO9xNrAtPowuCGpjNXxkTdsMiZ4jc8YQ5SstZd4XK6g==", "cpu": [ - "x64" + "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.70.0.tgz", + "integrity": "sha512-Kwu/l/8GcYibCWA9m9N5pRXMIKVSsL/YbgpLzYkqDhWTiqdRfnNJ/+nqIKRKQiFbHWsdlHEhzMwruJK+qcEruA==", "cpu": [ - "arm64" + "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.70.0.tgz", + "integrity": "sha512-tap04CsHYOl0nSAQJfPNIuBxqEPB2HnhQqwaOXLg1jnp2XfRo8Fa814dA4QC4zpvTWXCjAAaCY1W5LOORkEQuQ==", "cpu": [ "x64" ], @@ -615,50 +1141,50 @@ "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.70.0.tgz", + "integrity": "sha512-hzJa/WgvtJpbBD9rgfy0qe+MjbxOXNUT0bfR1S6EQQzfTtBFA9xg5q8KSwRrQ2QfSS+TaP4j+4mVPQrfNc6UNg==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "openharmony" + "linux" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.70.0.tgz", + "integrity": "sha512-xbsaNSNzVSnaJACCUYr1HQMyY/Q/Q1LkePmHG3UvZPvGCYGNxrsZp9OmtA6ick8xH47ltRRbRrPCM1YXYcyC+A==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "sunos" + "openharmony" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.70.0.tgz", + "integrity": "sha512-icAEsUI7JbW1TMRdEXV83mVAInhRVQYuuAlPpxdGwJ95chNdnCzjloRW8GglT0WvzOEZSio6fnYSk2DJ2Hv7LQ==", "cpu": [ "arm64" ], @@ -669,13 +1195,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.70.0.tgz", + "integrity": "sha512-FHMSWbVsPVs/f+Jcl04ws4JJ2wUnauyTzlpxWRG/lSO/8GpX08Fo2gQZqdA6CrRFI+zvkxl+N/KwJGWfUwYVZA==", "cpu": [ "ia32" ], @@ -686,13 +1212,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.70.0.tgz", + "integrity": "sha512-ptOlKwCz7n4AKs5VweMqG6DAg677FmKOK+vBkkL9DMNgFATIQ+upqUYBTOEwRQyRAx1ncGlPlXleV2hIcm3z4g==", "cpu": [ "x64" ], @@ -703,49 +1229,7 @@ "win32" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@gerrit0/mini-shiki": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz", - "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/engine-oniguruma": "^3.23.0", - "@shikijs/langs": "^3.23.0", - "@shikijs/themes": "^3.23.0", - "@shikijs/types": "^3.23.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@redocly/ajv": { @@ -1958,6 +2442,107 @@ "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==", "license": "MIT" }, + "node_modules/oxfmt": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.55.0.tgz", + "integrity": "sha512-jSj2wCTakwgPMxkfiVZX0jf+nX+Nz6xlyAZjqNE0qXTFdCBPYlP6JAN+ODjmealw7DXBjOzYbdsqwBMAZnPZ6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinypool": "2.1.0" + }, + "bin": { + "oxfmt": "bin/oxfmt" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxfmt/binding-android-arm-eabi": "0.55.0", + "@oxfmt/binding-android-arm64": "0.55.0", + "@oxfmt/binding-darwin-arm64": "0.55.0", + "@oxfmt/binding-darwin-x64": "0.55.0", + "@oxfmt/binding-freebsd-x64": "0.55.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.55.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.55.0", + "@oxfmt/binding-linux-arm64-gnu": "0.55.0", + "@oxfmt/binding-linux-arm64-musl": "0.55.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.55.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.55.0", + "@oxfmt/binding-linux-riscv64-musl": "0.55.0", + "@oxfmt/binding-linux-s390x-gnu": "0.55.0", + "@oxfmt/binding-linux-x64-gnu": "0.55.0", + "@oxfmt/binding-linux-x64-musl": "0.55.0", + "@oxfmt/binding-openharmony-arm64": "0.55.0", + "@oxfmt/binding-win32-arm64-msvc": "0.55.0", + "@oxfmt/binding-win32-ia32-msvc": "0.55.0", + "@oxfmt/binding-win32-x64-msvc": "0.55.0" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/oxlint": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.70.0.tgz", + "integrity": "sha512-D6JgHtzkhRwvEC+A0Nw5AEc5bk8x5i1pHzvZIEf/a0C4hOzmAACNGtkDGPyFaxxX3ZVGxCPeig3P3rMM8XU3/g==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.70.0", + "@oxlint/binding-android-arm64": "1.70.0", + "@oxlint/binding-darwin-arm64": "1.70.0", + "@oxlint/binding-darwin-x64": "1.70.0", + "@oxlint/binding-freebsd-x64": "1.70.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.70.0", + "@oxlint/binding-linux-arm-musleabihf": "1.70.0", + "@oxlint/binding-linux-arm64-gnu": "1.70.0", + "@oxlint/binding-linux-arm64-musl": "1.70.0", + "@oxlint/binding-linux-ppc64-gnu": "1.70.0", + "@oxlint/binding-linux-riscv64-gnu": "1.70.0", + "@oxlint/binding-linux-riscv64-musl": "1.70.0", + "@oxlint/binding-linux-s390x-gnu": "1.70.0", + "@oxlint/binding-linux-x64-gnu": "1.70.0", + "@oxlint/binding-linux-x64-musl": "1.70.0", + "@oxlint/binding-openharmony-arm64": "1.70.0", + "@oxlint/binding-win32-arm64-msvc": "1.70.0", + "@oxlint/binding-win32-ia32-msvc": "1.70.0", + "@oxlint/binding-win32-x64-msvc": "1.70.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.22.1", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, "node_modules/parse-json": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", @@ -2198,6 +2783,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinypool": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.1.0.tgz", + "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, "node_modules/tinyrainbow": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", diff --git a/sdks/typescript-sdk/package.json b/sdks/typescript-sdk/package.json index ea3b3483..385d49d3 100644 --- a/sdks/typescript-sdk/package.json +++ b/sdks/typescript-sdk/package.json @@ -33,7 +33,8 @@ "smoke": "node -r dotenv/config dist/scripts/smoke.js", "smoke:lists": "node -r dotenv/config dist/scripts/list-smoke.js", "prepublishOnly": "npm run build", - "lint": "biome check src" + "lint": "oxlint src && oxfmt --check src", + "format": "oxfmt --write src" }, "files": [ "dist/**/*" @@ -46,9 +47,10 @@ "openapi-fetch": "^0.15.2" }, "devDependencies": { - "@biomejs/biome": "^2.3.15", "@types/node": "^24.10.13", "@vitest/coverage-v8": "^4.0.18", + "oxfmt": "^0.55.0", + "oxlint": "^1.70.0", "dotenv": "^17.3.1", "openapi-typescript": "^7.13.0", "typedoc": "^0.28.19", diff --git a/sdks/typescript-sdk/src/test/mock-fetch.ts b/sdks/typescript-sdk/src/test/mock-fetch.ts index 75db2b00..c0869c49 100644 --- a/sdks/typescript-sdk/src/test/mock-fetch.ts +++ b/sdks/typescript-sdk/src/test/mock-fetch.ts @@ -5,7 +5,7 @@ export function jsonResponse( ): Response { return new Response(JSON.stringify(body), { status, - headers: { 'Content-Type': 'application/json', ...(headers || {}) }, + headers: { 'Content-Type': 'application/json', ...headers }, }); } From 6905311e1b40bbfdf8ba098941be7eebae008764 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 12:53:52 -0700 Subject: [PATCH 07/19] docs: correct agent instructions to cover the MCP gateway and SDK AGENTS.md (and its CLAUDE.md/claude.md symlinks) described this as a docs-only repo, but it also hosts the deployed MCP server + OAuth gateway (api/, packages/mcp/) and the TypeScript SDK (sdks/typescript-sdk/). Document the real project structure, the npm-workspaces build/test/lint commands (oxlint + oxfmt, vitest, tsc), the generated files not to hand-edit, and MCP auth-gateway guidance (delegated audience validation, the single resource resolver, don't weaken the discovery endpoints). Point agent.md at AGENTS.md for code work. Co-Authored-By: Claude Opus 4.8 (1M context) --- AGENTS.md | 84 ++++++++++++++++++++++++++++++++++++++++++------------- agent.md | 6 ++-- 2 files changed, 69 insertions(+), 21 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 59e72638..61e17fc6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,44 +1,90 @@ -# Documentation Agent Instructions +# Terminal49 API Repository — Agent Instructions -> **This is a public repository.** Do not commit API keys, internal URLs, customer data, or any proprietary information. Use placeholders in all examples. +> **This is a public repository.** Do not commit API keys, secrets, internal URLs, customer data, or any proprietary information. Use placeholders in all examples (e.g. `Token YOUR_API_KEY`). -These instructions guide automated changes for the Terminal49 docs in this repository. +This repo is **not docs-only**. It contains three things that ship independently: -**For detailed writing standards, voice, terminology, and content guidelines, see [WRITING_GUIDE.md](WRITING_GUIDE.md).** +1. **Documentation** (`docs/`) — the Mintlify site and the OpenAPI source of truth. +2. **The Terminal49 MCP server + OAuth gateway** (`api/`, `packages/mcp/`) — deployed to **mcp.terminal49.com** on Vercel. +3. **The Terminal49 TypeScript SDK** (`sdks/typescript-sdk/`) — published to npm as `@terminal49/sdk`. + +It is an **npm workspaces monorepo** (`packages/*`, `sdks/*`), Node 24. The root `package-lock.json` is the authoritative lockfile; `npm ci` (root) and Vercel both install from it. + +> `CLAUDE.md` / `claude.md` are symlinks to this file. Edit `AGENTS.md` to change agent instructions. + +For detailed docs writing standards, voice, and terminology, see [WRITING_GUIDE.md](WRITING_GUIDE.md) and [agent.md](agent.md). + +--- ## Project Structure +### Documentation (`docs/`) - `docs/` holds the Mintlify site content and configuration. -- `docs/api-docs/`, `docs/datasync/`, `docs/sdk/`, `docs/mcp/`, and `docs/updates/` contain MDX pages grouped by product area. +- `docs/api-docs/`, `docs/datasync/`, `docs/sdk/`, `docs/mcp/`, `docs/updates/` contain MDX pages grouped by product area. - `docs/docs.json` defines navigation, branding, and tabs. - `docs/openapi.json` is the source of truth for API reference content. - `docs/images/` and `assets/images/` store images used by MDX pages. -- `Terminal49-API.postman_collection.json` is generated from the OpenAPI spec — do not edit manually. + +### MCP gateway (`api/`) — Vercel serverless functions +- `api/mcp.ts` — the MCP endpoint (Streamable HTTP transport, stateless). Handles caller auth: WorkOS AuthKit token resolution, env-token + client-secret mode, and pass-through. +- `api/oauth-protected-resource.ts` — RFC 9728 Protected Resource Metadata (`/.well-known/oauth-protected-resource`). +- `vercel.json` — routes (`/mcp`, `/.well-known/*`), function config, install/build commands. This is what deploys to mcp.terminal49.com. +- These import the server from `packages/mcp/src/`. + +### MCP server (`packages/mcp/`) — `@terminal49/mcp` +- `src/server.ts` — `createTerminal49McpServer()`, built on `@modelcontextprotocol/sdk` (`McpServer`, `registerTool`/`registerResource`). Used by both the stdio entry (`src/index.ts`) and the `api/` HTTP gateway. +- `src/resource.ts` — **single source of truth** for the OAuth `resource` identifier. Both the PRM endpoint and the `WWW-Authenticate` challenge resolve through it so they can never diverge (RFC 9728). Do not reintroduce per-file resource derivation. +- `src/tools/`, `src/resources/` — MCP tools and resources. +- `tests/`, `src/**/*.test.ts` — vitest. + +### TypeScript SDK (`sdks/typescript-sdk/`) — `@terminal49/sdk` +- `src/` — the client (JSON:API, openapi-fetch). `src/generated/**` is generated — **do not hand-edit**. + +--- ## Scope -- Primary docs live in `docs/` (MDX pages, `docs/docs.json`, and `docs/openapi.json`). -- Do not edit generated files unless explicitly asked (e.g., `Terminal49-API.postman_collection.json`). +- **Docs** live in `docs/` (MDX, `docs/docs.json`, `docs/openapi.json`). +- **Code** in `api/`, `packages/mcp/`, and `sdks/typescript-sdk/` is editable, but it is **deployed, public-facing infrastructure** — run the tests and lint before considering a change done. +- **Do not hand-edit generated files** unless explicitly asked: + - `Terminal49-API.postman_collection.json` (from `docs/openapi.json`) + - `sdks/typescript-sdk/src/generated/**` (from `docs/openapi.json` via `openapi-typescript`) + - `docs/sdk/reference/**` (generated SDK docs; CI checks they are up to date) + +--- ## Build and Development Commands -- Preview docs locally: `cd docs && mintlify dev` -- Generate Postman collection: `openapi2postmanv2 -s docs/openapi.json -o Terminal49-API.postman_collection.json -p -O folderStrategy=Tags` +### Docs +- Preview locally: `cd docs && mintlify dev` - Lint the OpenAPI spec: `spectral lint --ruleset .spectral.mjs docs/openapi.json` +- Regenerate Postman: `openapi2postmanv2 -s docs/openapi.json -o Terminal49-API.postman_collection.json -p -O folderStrategy=Tags` + +### Code (npm workspaces) +- Install: `npm ci` (root) +- Test: `npm run test --workspace @terminal49/mcp -- --run` · `npm run test --workspace @terminal49/sdk -- --run` (vitest) +- Typecheck / build: `npm run build --workspace @terminal49/mcp` · `--workspace @terminal49/sdk` (tsc). `api/` is typechecked by the root config: `npx tsc --noEmit -p tsconfig.json`. +- **Lint/format: oxlint + oxfmt** (migrated off Biome). `npm run lint --workspace `; auto-format with `npm run format --workspace ` (oxfmt). Config: `.oxlintrc.json` + `.oxfmtrc.json` per package. The SDK lint also runs `oxfmt --check`; MCP is lint-only. +- CI (`.github/workflows/ci.yml`) runs build + test + lint for both packages. + +--- + +## MCP Auth Gateway notes -## When Updating API Reference +- The gateway is an OAuth 2.1 **Resource Server**; **WorkOS** is the Authorization Server. Follow the MCP authorization spec (RFC 9728 / 8414 / 8707 / 6750). +- Token validation is delegated to the Terminal49 backend (`/connected-clients/resolve`); the backend must enforce the token audience. The gateway must not weaken the `WWW-Authenticate` challenge, the PRM document, or the resource resolver without checking the spec. +- Config is via env (`WORKOS_*`, `T49_MCP_*`). Never log tokens; return generic auth errors to clients and keep detail in server logs. -- If you change API behavior or schemas, update `docs/openapi.json` first. -- Regenerate the Postman collection with: - `openapi2postmanv2 -s docs/openapi.json -o Terminal49-API.postman_collection.json -p -O folderStrategy=Tags` +--- ## Commit and Pull Request Guidelines -- Commit history favors conventional prefixes such as `docs:` and `chore:`. -- Do not manually edit `Terminal49-API.postman_collection.json`; update `docs/openapi.json` and regenerate. -- PRs should include a short summary, linked issue/ticket if available, and screenshots for doc UI changes. +- Commit history favors conventional prefixes: `docs:`, `chore:`, `feat:`, `fix:`. +- Keep docs changes, gateway/SDK code changes, and tooling changes in **separate commits** so reviews stay focused. +- Do not manually edit generated files; update the source and regenerate. +- PRs: short summary, linked issue/ticket if available, screenshots for doc UI changes. ## Security -- Never commit real API keys; use placeholders like `Token YOUR_API_KEY` in examples. -- Postman deployment uses repository secrets; keep local credentials in your environment only. +- Never commit real API keys or secrets; use placeholders like `Token YOUR_API_KEY`. +- The MCP gateway is public-facing — treat auth, the resource resolver, and the discovery endpoints as security-sensitive. Keep local credentials in your environment only. diff --git a/agent.md b/agent.md index 06ca49c3..e5c4038b 100644 --- a/agent.md +++ b/agent.md @@ -1,9 +1,11 @@ # Documentation agent instructions -These instructions guide automated changes for the Terminal49 docs in this repository. +These instructions guide automated changes for the Terminal49 **docs** in this repository. + +> This repo also hosts deployed code — the MCP server + OAuth gateway (`api/`, `packages/mcp/`) and the TypeScript SDK (`sdks/typescript-sdk/`). For that code, its structure, and build/test/lint commands, see [AGENTS.md](AGENTS.md). This guide covers docs content only. ## Scope -- Primary docs live in `docs/` (MDX pages, `docs/docs.json`, and `docs/openapi.json`). +- This guide applies to **docs** in `docs/` (MDX pages, `docs/docs.json`, and `docs/openapi.json`). - Do not edit generated files unless explicitly asked (e.g., `Terminal49-API.postman_collection.json`). ## Audience focus From a2c8a9ca5afefa2ede26d4ec8c05220b6a1f7594 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 13:00:33 -0700 Subject: [PATCH 08/19] fix(ci): run SDK lint only on Node 24 (oxlint/oxfmt need Node 20+) oxlint and oxfmt ship native bindings that require Node 20+, so the `Lint SDK` step failed on the Node 18 matrix leg with a missing-binding error. Linting is static and runtime-independent, so gate it to Node 24 (matching how the docs-generation steps are gated). Build and test still run across the full 18/20/22/24 matrix for consumer compatibility. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 91083468..65188623 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,10 @@ jobs: test -z "$(git status --porcelain -- docs/sdk/reference)" - name: Test SDK run: npm test -- --run + # oxlint/oxfmt require Node 20+; lint is static so it only needs one + # modern runtime. Build/test still cover the full matrix for consumers. - name: Lint SDK (oxlint + oxfmt) + if: matrix.node-version == 24 run: npm run lint mcp: From 3b1977ee96b04536204bfc967302a92f60720055 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 13:22:09 -0700 Subject: [PATCH 09/19] fix(mcp): map connected-client resolver outages to retryable 5xx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When AuthKit is enabled, every failure from the connected-clients resolve endpoint was returned to the client as 401, so a Terminal49/API outage (5xx, 429, network error) told MCP clients their token was invalid — making them discard a valid token and loop through re-authentication instead of retrying a transient failure. Categorize resolve failures: only a token the resolver actively rejects (401/403) is a 401 invalid_token; a missing resolve secret is a 500 misconfiguration; everything else (upstream 5xx/429, network, malformed response) is a 502 the client can retry. Detail stays in the server log; client messages remain generic. (Addresses Codex review P2 on PR #240.) Co-Authored-By: Claude Opus 4.8 (1M context) --- api/mcp.ts | 88 ++++++++++++++++++++------ packages/mcp/tests/api-handler.test.ts | 43 +++++++++++++ 2 files changed, 112 insertions(+), 19 deletions(-) diff --git a/api/mcp.ts b/api/mcp.ts index 330d15f5..760f6966 100644 --- a/api/mcp.ts +++ b/api/mcp.ts @@ -115,6 +115,18 @@ function resolveEndpointUrl(): string { return `${apiBaseUrl.replace(/\/+$/, '')}/connected-clients/resolve`; } +type ResolveFailureKind = 'config' | 'invalid_token' | 'upstream'; + +class ConnectedClientResolveError extends Error { + readonly kind: ResolveFailureKind; + + constructor(message: string, kind: ResolveFailureKind) { + super(message); + this.name = 'ConnectedClientResolveError'; + this.kind = kind; + } +} + async function resolveConnectedClientToken( token: string, requestId: string, @@ -122,20 +134,29 @@ async function resolveConnectedClientToken( const resolveSecret = process.env.T49_CONNECTED_CLIENTS_RESOLVE_SECRET?.trim() || process.env.T49_MCP_RESOLVE_SECRET?.trim(); if (!resolveSecret) { - throw new Error( + throw new ConnectedClientResolveError( 'T49_CONNECTED_CLIENTS_RESOLVE_SECRET must be set when AuthKit MCP auth is enabled.', + 'config', ); } - const response = await fetch(resolveEndpointUrl(), { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-T49-Connected-Clients-Resolve-Secret': resolveSecret, - 'X-Request-Id': requestId, - }, - body: JSON.stringify({ access_token: token }), - }); + let response: Response; + try { + response = await fetch(resolveEndpointUrl(), { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-T49-Connected-Clients-Resolve-Secret': resolveSecret, + 'X-Request-Id': requestId, + }, + body: JSON.stringify({ access_token: token }), + }); + } catch (error) { + throw new ConnectedClientResolveError( + `Terminal49 connected client resolve request failed: ${(error as Error).message}`, + 'upstream', + ); + } let payload: ConnectedClientResolutionResponse = {}; try { @@ -145,13 +166,25 @@ async function resolveConnectedClientToken( } if (!response.ok) { - throw new Error(payload.error || `Terminal49 connected client resolve failed with ${response.status}`); + // Only a token the resolver actively rejects (401/403) is a client auth + // failure. A 5xx / 429 / network error means the resolver is unavailable — + // surface that as retryable so clients don't discard a valid token and loop + // through re-authentication during a Terminal49 outage. + const kind: ResolveFailureKind = + response.status === 401 || response.status === 403 ? 'invalid_token' : 'upstream'; + throw new ConnectedClientResolveError( + payload.error || `Terminal49 connected client resolve failed with ${response.status}`, + kind, + ); } const accessToken = payload.data?.attributes?.access_token; const accountId = payload.data?.attributes?.account_id; if (!accessToken || !accountId) { - throw new Error('Terminal49 connected client resolve response is missing access_token or account_id.'); + throw new ConnectedClientResolveError( + 'Terminal49 connected client resolve response is missing access_token or account_id.', + 'upstream', + ); } return { apiToken: `Bearer ${accessToken}`, accountId }; @@ -390,18 +423,35 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom }; } catch (error) { const err = error as Error; + const kind: ResolveFailureKind = + err instanceof ConnectedClientResolveError ? err.kind : 'upstream'; setCorsHeaders(res); - setUnauthorizedChallenge(res, req, 'invalid_token'); - // Return a generic challenge to the client; keep the detailed reason in - // the server log (correlated by request_id) to avoid leaking internals. - res.status(401).json({ - error: 'Unauthorized', - message: 'Invalid or expired token.', - }); + // Keep the detailed reason in the server log (correlated by request_id); + // return a generic, category-appropriate response so internals never leak. logLifecycle('mcp.request.complete', requestId, { reason: 'connected_client_resolve_failed', + kind, message: err.message, }); + if (kind === 'invalid_token') { + setUnauthorizedChallenge(res, req, 'invalid_token'); + res.status(401).json({ + error: 'Unauthorized', + message: 'Invalid or expired token.', + }); + } else if (kind === 'config') { + res.status(500).json({ + error: 'Server misconfiguration', + message: 'Authorization is not configured correctly.', + }); + } else { + // Upstream/transient: do NOT send a 401 challenge — that tells clients + // their token is bad and triggers re-auth loops. 502 invites a retry. + res.status(502).json({ + error: 'Bad Gateway', + message: 'Authorization service is temporarily unavailable. Please retry.', + }); + } return; } } else if (configuredApiToken) { diff --git a/packages/mcp/tests/api-handler.test.ts b/packages/mcp/tests/api-handler.test.ts index e9149032..1026bd1b 100644 --- a/packages/mcp/tests/api-handler.test.ts +++ b/packages/mcp/tests/api-handler.test.ts @@ -315,6 +315,49 @@ describe('api/mcp handler lifecycle', () => { expect(mockState.servers).toHaveLength(0); }); + it('returns 502 (not 401) when the WorkOS resolve endpoint is unavailable', async () => { + process.env.T49_MCP_AUTHKIT_ENABLED = 'true'; + process.env.T49_CONNECTED_CLIENTS_RESOLVE_SECRET = 'resolve-secret'; + process.env.WORKOS_MCP_RESOURCE = 'https://mcp.test'; + vi.stubGlobal( + 'fetch', + vi.fn(async () => new Response(JSON.stringify({ error: 'upstream down' }), { status: 503 })), + ); + + const { default: handler } = await import('../../../api/mcp.ts'); + const req = createRequest({ + headers: { host: 'localhost', authorization: 'Bearer workos-mcp-token' }, + }); + const res = new MockResponse(); + + await handler(req as any, res as any); + + // A resolver outage must not be reported as an invalid token, or clients + // discard a valid token and loop through re-auth instead of retrying. + expect(res.statusCode).toBe(502); + expect(res.headers['WWW-Authenticate']).toBeUndefined(); + expect(mockState.servers).toHaveLength(0); + }); + + it('returns 500 when AuthKit is enabled but the resolve secret is missing', async () => { + process.env.T49_MCP_AUTHKIT_ENABLED = 'true'; + // No T49_CONNECTED_CLIENTS_RESOLVE_SECRET set — a server misconfiguration. + const fetchMock = vi.fn(); + vi.stubGlobal('fetch', fetchMock); + + const { default: handler } = await import('../../../api/mcp.ts'); + const req = createRequest({ + headers: { host: 'localhost', authorization: 'Bearer workos-mcp-token' }, + }); + const res = new MockResponse(); + + await handler(req as any, res as any); + + expect(res.statusCode).toBe(500); + expect(fetchMock).not.toHaveBeenCalled(); + expect(mockState.servers).toHaveLength(0); + }); + it('returns 401 when Authorization token does not match T49_MCP_CLIENT_SECRET', async () => { process.env.T49_API_TOKEN = 'env-token-value'; process.env.T49_MCP_CLIENT_SECRET = 'expected-client-secret'; From 58dd5d0b0e057d80d1fdff70d39e527a1101fda3 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 13:22:10 -0700 Subject: [PATCH 10/19] docs(mcp): use Token scheme for API keys, reserve Bearer for OAuth The MCP quickstart told clients to send API keys as `Authorization: Bearer `. Once WorkOS OAuth is enabled the gateway treats every Bearer value as a WorkOS access token, so Bearer API-key clients would break. Switch the examples and the auth note to the `Token` scheme for API keys and document that `Bearer` is reserved for WorkOS OAuth. (Addresses Codex review P1 on PR #240.) Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/mcp/home.mdx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/mcp/home.mdx b/docs/mcp/home.mdx index ee6a6e32..3bfcc718 100644 --- a/docs/mcp/home.mdx +++ b/docs/mcp/home.mdx @@ -34,7 +34,7 @@ Use the Terminal49 MCP server to let Claude or Cursor answer questions with live "terminal49": { "url": "https://mcp.terminal49.com/mcp", "headers": { - "Authorization": "Bearer " + "Authorization": "Token " } } } @@ -49,7 +49,7 @@ Use the Terminal49 MCP server to let Claude or Cursor answer questions with live "terminal49": { "url": "https://mcp.terminal49.com/mcp", "headers": { - "Authorization": "Bearer " + "Authorization": "Token " } } } @@ -83,7 +83,8 @@ For the full walkthrough (including local stdio dev, deployment, and SDK example **Authentication**: - API token only (OAuth not required for this release) -- Header: `Authorization: Bearer ` or `Authorization: Token ` +- Header: `Authorization: Token `. Use the `Token` scheme for API keys. +- The `Bearer` scheme is reserved for WorkOS OAuth access tokens. Once OAuth is enabled, `Bearer` accepts only WorkOS tokens, so authenticate API keys with `Token`. - Or set `T49_API_TOKEN` environment variable when self-hosting From f2051aab60627412d86804cff122baa9eb304254 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 13:53:41 -0700 Subject: [PATCH 11/19] feat(mcp): add AS-metadata discovery redirect for non-PRM clients MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-add /.well-known/oauth-authorization-server as a 302 redirect to the WorkOS issuer's metadata (not the verbatim proxy that was previously removed). The client follows the redirect and fetches the document from the issuer's own origin, so its `issuer` matches the fetch origin per RFC 8414 section 3.3 — avoiding the mismatch a verbatim proxy creates. This is a compatibility shim for clients that probe the resource origin instead of following RFC 9728 PRM discovery; ChatGPT and Claude use PRM and never hit it. Wire the route in vercel.json and add redirect/CORS/method tests. Co-Authored-By: Claude Opus 4.8 (1M context) --- api/oauth-authorization-server.ts | 54 ++++++++++++++++++++ packages/mcp/tests/oauth-metadata.test.ts | 62 +++++++++++++++++++++++ vercel.json | 7 +++ 3 files changed, 123 insertions(+) create mode 100644 api/oauth-authorization-server.ts diff --git a/api/oauth-authorization-server.ts b/api/oauth-authorization-server.ts new file mode 100644 index 00000000..7057f2dd --- /dev/null +++ b/api/oauth-authorization-server.ts @@ -0,0 +1,54 @@ +import type { IncomingMessage, ServerResponse } from 'node:http'; + +type RequestLike = { + method?: string; +} & IncomingMessage; + +type ResponseLike = { + status(code: number): ResponseLike; + json(payload: unknown): void; + setHeader(name: string, value: string): void; + end(): void; +} & ServerResponse; + +/** + * Compatibility shim for OAuth clients that probe the resource origin for + * Authorization Server Metadata (RFC 8414) instead of following RFC 9728 + * Protected Resource Metadata discovery. PRM-aware clients (ChatGPT, Claude) + * never reach this route — they read `authorization_servers` from the PRM + * document and fetch AS metadata straight from the WorkOS issuer. + * + * This 302-redirects to the WorkOS issuer's metadata rather than proxying it + * verbatim. The client then fetches the document from the issuer's own origin, + * so the document's `issuer` value matches the fetch origin (RFC 8414 §3.3). A + * verbatim proxy would serve WorkOS's issuer from this origin, and a strict + * client would reject that mismatch — which is why the verbatim proxy was + * removed in favor of this redirect. + */ +export default function handler(req: RequestLike, res: ResponseLike): void { + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + + if (req.method === 'OPTIONS') { + res.status(200).end(); + return; + } + + if (req.method !== 'GET') { + res.status(405).json({ error: 'Method not allowed' }); + return; + } + + const authorizationServer = process.env.WORKOS_AUTHORIZATION_SERVER_URL?.trim() || + process.env.WORKOS_ISSUER?.trim(); + + if (!authorizationServer) { + res.status(500).json({ error: 'WORKOS_AUTHORIZATION_SERVER_URL or WORKOS_ISSUER must be set.' }); + return; + } + + const target = `${authorizationServer.replace(/\/+$/, '')}/.well-known/oauth-authorization-server`; + res.setHeader('Location', target); + res.status(302).end(); +} diff --git a/packages/mcp/tests/oauth-metadata.test.ts b/packages/mcp/tests/oauth-metadata.test.ts index 4ffa3b90..4e3fcf18 100644 --- a/packages/mcp/tests/oauth-metadata.test.ts +++ b/packages/mcp/tests/oauth-metadata.test.ts @@ -2,6 +2,7 @@ import { EventEmitter } from 'node:events'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import protectedResourceHandler from '../../../api/oauth-protected-resource.ts'; +import authorizationServerHandler from '../../../api/oauth-authorization-server.ts'; /** * Mirrors the MockResponse used in api-handler.test.ts so these tests exercise @@ -172,3 +173,64 @@ describe('api/oauth-protected-resource (RFC 9728 PRM)', () => { expect(res.headers['Access-Control-Allow-Origin']).toBe('*'); }); }); + +describe('api/oauth-authorization-server (RFC 8414 metadata redirect)', () => { + beforeEach(clearOauthEnv); + afterEach(clearOauthEnv); + + it('302-redirects to the WorkOS issuer metadata (not a verbatim proxy)', () => { + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test/'; + const res = new MockResponse(); + + authorizationServerHandler(createRequest('GET') as never, res as never); + + expect(res.statusCode).toBe(302); + // Trailing slash normalized; client fetches from the issuer's own origin so + // the metadata `issuer` matches the fetch origin (RFC 8414 section 3.3). + expect(res.headers.Location).toBe( + 'https://auth.workos.test/.well-known/oauth-authorization-server', + ); + expect(res.endCalled).toBe(true); + expect(res.jsonCalled).toBe(false); + }); + + it('falls back to WORKOS_ISSUER for the redirect target', () => { + process.env.WORKOS_ISSUER = 'https://issuer.workos.test'; + const res = new MockResponse(); + + authorizationServerHandler(createRequest('GET') as never, res as never); + + expect(res.statusCode).toBe(302); + expect(res.headers.Location).toBe( + 'https://issuer.workos.test/.well-known/oauth-authorization-server', + ); + }); + + it('returns 500 when no authorization server is configured', () => { + const res = new MockResponse(); + + authorizationServerHandler(createRequest('GET') as never, res as never); + + expect(res.statusCode).toBe(500); + expect(payloadOf(res).error).toContain('WORKOS_AUTHORIZATION_SERVER_URL'); + }); + + it('answers CORS preflight with 200 and does not redirect', () => { + const res = new MockResponse(); + + authorizationServerHandler(createRequest('OPTIONS') as never, res as never); + + expect(res.statusCode).toBe(200); + expect(res.headers.Location).toBeUndefined(); + }); + + it('rejects non-GET methods with 405', () => { + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test'; + const res = new MockResponse(); + + authorizationServerHandler(createRequest('POST') as never, res as never); + + expect(res.statusCode).toBe(405); + expect(res.headers.Location).toBeUndefined(); + }); +}); diff --git a/vercel.json b/vercel.json index 5a300cc6..8000aea7 100644 --- a/vercel.json +++ b/vercel.json @@ -9,6 +9,9 @@ }, "api/oauth-protected-resource.ts": { "maxDuration": 10 + }, + "api/oauth-authorization-server.ts": { + "maxDuration": 10 } }, "rewrites": [ @@ -16,6 +19,10 @@ "source": "/.well-known/oauth-protected-resource", "destination": "/api/oauth-protected-resource" }, + { + "source": "/.well-known/oauth-authorization-server", + "destination": "/api/oauth-authorization-server" + }, { "source": "/mcp", "destination": "/api/mcp" From 50008a13274e05845640e85edd9bc189f827ba4c Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 13:53:41 -0700 Subject: [PATCH 12/19] docs(mcp): standardize connector URL on root origin; add WorkOS setup runbook The quickstart told clients to connect to https://mcp.terminal49.com/mcp, but the OAuth resource identifier is the bare origin. A client that derives its resource indicator from the /mcp path would send a resource that does not match the PRM resource or the WorkOS-registered indicator, getting its token rejected. Standardize all connector config on the root origin https://mcp.terminal49.com (the server still responds at /mcp and /api/mcp). Add WORKOS_MCP_SETUP.md: production setup checklist (DCR, Resource Indicator, env vars, smoke tests) plus ChatGPT/Claude client specifics, so the WorkOS dashboard config is verifiable rather than tribal. Cross-link it from OAUTH_TEST_CLIENT.md and AGENTS.md. Co-Authored-By: Claude Opus 4.8 (1M context) --- AGENTS.md | 1 + docs/mcp/home.mdx | 6 +- packages/mcp/OAUTH_TEST_CLIENT.md | 3 + packages/mcp/WORKOS_MCP_SETUP.md | 97 +++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 packages/mcp/WORKOS_MCP_SETUP.md diff --git a/AGENTS.md b/AGENTS.md index 61e17fc6..cea9778b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -74,6 +74,7 @@ For detailed docs writing standards, voice, and terminology, see [WRITING_GUIDE. - The gateway is an OAuth 2.1 **Resource Server**; **WorkOS** is the Authorization Server. Follow the MCP authorization spec (RFC 9728 / 8414 / 8707 / 6750). - Token validation is delegated to the Terminal49 backend (`/connected-clients/resolve`); the backend must enforce the token audience. The gateway must not weaken the `WWW-Authenticate` challenge, the PRM document, or the resource resolver without checking the spec. - Config is via env (`WORKOS_*`, `T49_MCP_*`). Never log tokens; return generic auth errors to clients and keep detail in server logs. +- The canonical connector URL and OAuth resource identifier is the **root origin** `https://mcp.terminal49.com` (pin `WORKOS_MCP_RESOURCE`); don't use the `/mcp` path in client config. Production/client setup (WorkOS dashboard, env vars, ChatGPT + Claude specifics) is in [packages/mcp/WORKOS_MCP_SETUP.md](packages/mcp/WORKOS_MCP_SETUP.md). --- diff --git a/docs/mcp/home.mdx b/docs/mcp/home.mdx index 3bfcc718..b3e5da5f 100644 --- a/docs/mcp/home.mdx +++ b/docs/mcp/home.mdx @@ -32,7 +32,7 @@ Use the Terminal49 MCP server to let Claude or Cursor answer questions with live { "mcpServers": { "terminal49": { - "url": "https://mcp.terminal49.com/mcp", + "url": "https://mcp.terminal49.com", "headers": { "Authorization": "Token " } @@ -47,7 +47,7 @@ Use the Terminal49 MCP server to let Claude or Cursor answer questions with live "mcp": { "servers": { "terminal49": { - "url": "https://mcp.terminal49.com/mcp", + "url": "https://mcp.terminal49.com", "headers": { "Authorization": "Token " } @@ -88,7 +88,7 @@ For the full walkthrough (including local stdio dev, deployment, and SDK example - Or set `T49_API_TOKEN` environment variable when self-hosting -Claude Desktop and Cursor use the HTTP transport at `https://mcp.terminal49.com/mcp`. +Connector URL: `https://mcp.terminal49.com`. The server also responds at `/mcp` and `/api/mcp`, but use the **root URL** — it is the canonical OAuth resource identifier, so OAuth clients (ChatGPT, Claude connectors) bind to the correct token audience. {/* OAuth hosted docs are not yet published. Links will be added when the pages are available. */} diff --git a/packages/mcp/OAUTH_TEST_CLIENT.md b/packages/mcp/OAUTH_TEST_CLIENT.md index e2dbe318..ebf6bc49 100644 --- a/packages/mcp/OAUTH_TEST_CLIENT.md +++ b/packages/mcp/OAUTH_TEST_CLIENT.md @@ -10,6 +10,9 @@ Open `http://localhost:8787`, click `Authorize`, complete the WorkOS flow, then ## WorkOS prerequisites +> For the full production setup (dashboard checklist, env vars, smoke tests, and +> per-client notes for ChatGPT and Claude), see [WORKOS_MCP_SETUP.md](./WORKOS_MCP_SETUP.md). + In the WorkOS environment used by `WORKOS_AUTHORIZATION_SERVER_URL`: - Enable MCP Auth with Client ID Metadata Document (CIMD). Keep Dynamic Client Registration (DCR) enabled for clients that do not yet support CIMD. diff --git a/packages/mcp/WORKOS_MCP_SETUP.md b/packages/mcp/WORKOS_MCP_SETUP.md new file mode 100644 index 00000000..67c9c5b9 --- /dev/null +++ b/packages/mcp/WORKOS_MCP_SETUP.md @@ -0,0 +1,97 @@ +# WorkOS MCP Auth — Production Setup + +How to configure WorkOS AuthKit + the Vercel deployment so ChatGPT and Claude +connectors can authenticate against `https://mcp.terminal49.com`. + +The gateway is an OAuth 2.1 **Resource Server**; WorkOS AuthKit is the +**Authorization Server**. The gateway's code is spec-compliant on its own — the +items below are dashboard/env config that gate whether clients can connect. Any +one of them, missing, silently breaks the connection. + +Canonical reference: + +## Canonical connector URL + +Use the **root origin** as the connector URL everywhere: + +``` +https://mcp.terminal49.com +``` + +The server also responds at `/mcp` and `/api/mcp`, but the root origin is the +OAuth **resource identifier**. The entered URL, the PRM `resource`, the WorkOS +Resource Indicator, and the token `aud` must all be this exact string. Using +`/mcp` risks a client deriving `resource=…/mcp`, which won't match and gets the +token rejected. + +## 1. WorkOS dashboard + +In the WorkOS environment referenced by `WORKOS_AUTHORIZATION_SERVER_URL`: + +- [ ] **Dynamic Client Registration (DCR)** — *Connect → Configuration*. **Off by + default.** ChatGPT relies on it; Claude uses DCR or CIMD. Without it, neither + client can self-register and the connection fails. +- [ ] **Client ID Metadata Document (CIMD)** — optional but recommended; reduces + Claude's per-connection client sprawl. Requires the AS metadata to advertise + `client_id_metadata_document_supported: true` and `none` in + `token_endpoint_auth_methods_supported`. +- [ ] **Resource Indicator** — register `https://mcp.terminal49.com` exactly. + This is load-bearing: without it WorkOS mints the environment-default audience, + the token `aud` won't match, and `/connected-clients/resolve` rejects every + token. Register any staging/preview resource hosts you also expect. +- [ ] **Redirect URIs** — automatic with DCR. If you pin clients (CIMD / + pre-registered), allowlist `https://claude.ai/api/mcp/auth_callback`, + `https://claude.com/api/mcp/auth_callback`, the ChatGPT connector callback, and + `http://localhost`/`http://127.0.0.1` loopback for Claude Code. + +## 2. Vercel environment variables + +| Variable | Value | Why | +|----------|-------|-----| +| `WORKOS_AUTHORIZATION_SERVER_URL` (or `WORKOS_ISSUER`) | the AuthKit issuer **origin** (no path) | Clients fetch AS metadata at `/.well-known/oauth-authorization-server` | +| `WORKOS_MCP_RESOURCE` | `https://mcp.terminal49.com` | **Pin it** so the resource is never Host-derived (preview domains would mint the wrong audience) | +| `T49_MCP_AUTHKIT_ENABLED` | `true` | Otherwise a WorkOS `Bearer` token is treated as a passthrough API key and fails | +| `T49_CONNECTED_CLIENTS_RESOLVE_SECRET` | the resolve shared secret | Required to call `/connected-clients/resolve` | +| `T49_MCP_ALLOWED_HOSTS` | include `mcp.terminal49.com` (if set at all) | Host allowlist; missing host → 403 | +| `T49_MCP_SCOPES_SUPPORTED` | **leave unset** | WorkOS only issues `openid/profile/email/offline_access`; advertising `mcp:tools` etc. causes `invalid_scope` | + +## 3. Smoke tests + +```sh +ISSUER="" + +# AS metadata: 200 with registration_endpoint + S256 +curl -s "$ISSUER/.well-known/oauth-authorization-server" \ + | jq '{registration_endpoint, code_challenge_methods_supported}' + +# DCR is open: expect 201 + client_id +curl -s -X POST "$ISSUER/oauth2/register" \ + -H 'Content-Type: application/json' \ + -d '{"client_name":"smoke","redirect_uris":["https://example.com/cb"],"grant_types":["authorization_code"],"response_types":["code"]}' + +# PRM: resource + authorization_servers +curl -s https://mcp.terminal49.com/.well-known/oauth-protected-resource | jq + +# 401 challenge points at the PRM +curl -si https://mcp.terminal49.com/mcp | grep -i www-authenticate + +# After an OAuth flow, decode the access token and confirm: +# aud == https://mcp.terminal49.com +``` + +## 4. Per-client notes + +- **ChatGPT (Apps SDK)** and **Claude connectors** connect **server-side** — no + browser CORS concerns. Both use PRM discovery; the 401 + `WWW-Authenticate` + challenge drives the flow. Connector URL = `https://mcp.terminal49.com`. +- **claude.ai / Claude Desktop cannot paste a static API key** — they must use + the WorkOS OAuth flow. The `Token`-scheme passthrough and `T49_MCP_CLIENT_SECRET` + paths only serve the Anthropic **Messages API** connector and non-Claude clients. +- **Anthropic Messages API connector** forwards a pre-obtained token; it needs + header `anthropic-beta: mcp-client-2025-11-20`, and that token must carry the + `https://mcp.terminal49.com` audience. +- **Rollout:** existing API-key users on `Authorization: Bearer ` (old docs) + break the moment `T49_MCP_AUTHKIT_ENABLED=true`. Migrate them to the `Token` + scheme **before** enabling AuthKit. + +See [OAUTH_TEST_CLIENT.md](./OAUTH_TEST_CLIENT.md) to exercise the full flow locally. From 13e3851c202d5fe0fcc4c2104d04d8bbe0015ec8 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 14:11:49 -0700 Subject: [PATCH 13/19] docs(mcp): add local dev guide for Claude Desktop tool testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document the two ways to test the MCP server locally with Claude Desktop: (1) direct stdio — Claude spawns the server, which talks straight to a local/prod t49 (simplest, tests the tools); (2) full local stack — Claude reaches the `vercel dev` gateway through `mcp-remote` (stdio↔HTTP bridge) in Token passthrough mode, exercising gateway auth + tools end to end. Claude Desktop can't reach localhost over an HTTP connector (its connectors run server-side), which is why both paths run a process on the machine. Add .env.local.example for the gateway and note the full WorkOS OAuth path needs a tunnel (not required for tool testing). The local stdio server was verified to boot and advertise all 10 tools. Co-Authored-By: Claude Opus 4.8 (1M context) --- .env.local.example | 17 ++++++ AGENTS.md | 1 + packages/mcp/LOCAL_DEV.md | 121 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 .env.local.example create mode 100644 packages/mcp/LOCAL_DEV.md diff --git a/.env.local.example b/.env.local.example new file mode 100644 index 00000000..3435da98 --- /dev/null +++ b/.env.local.example @@ -0,0 +1,17 @@ +# Local MCP gateway env for `vercel dev`. Copy to `.env.local` and edit. +# See packages/mcp/LOCAL_DEV.md for the full local testing guide. + +# --- Passthrough mode (default; for tool testing via Claude → mcp-remote) --- +# Point at your local t49 server (Rails default :3000). Drop it to use prod. +T49_API_BASE_URL=http://localhost:3000/v2 +# Leave T49_MCP_AUTHKIT_ENABLED unset so `Token ` passes straight through. + +# --- Full WorkOS OAuth (optional; requires an HTTPS tunnel + local t49 resolve) --- +# T49_MCP_AUTHKIT_ENABLED=true +# WORKOS_AUTHORIZATION_SERVER_URL=https://.authkit.app +# WORKOS_MCP_RESOURCE=https:// # must equal the WorkOS Resource Indicator +# T49_CONNECTED_CLIENTS_RESOLVE_SECRET= + +# --- Optional hardening / observability --- +# T49_MCP_ALLOWED_HOSTS=localhost:4000 +# SENTRY_ENABLED=false diff --git a/AGENTS.md b/AGENTS.md index cea9778b..846c3847 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -66,6 +66,7 @@ For detailed docs writing standards, voice, and terminology, see [WRITING_GUIDE. - Typecheck / build: `npm run build --workspace @terminal49/mcp` · `--workspace @terminal49/sdk` (tsc). `api/` is typechecked by the root config: `npx tsc --noEmit -p tsconfig.json`. - **Lint/format: oxlint + oxfmt** (migrated off Biome). `npm run lint --workspace `; auto-format with `npm run format --workspace ` (oxfmt). Config: `.oxlintrc.json` + `.oxfmtrc.json` per package. The SDK lint also runs `oxfmt --check`; MCP is lint-only. - CI (`.github/workflows/ci.yml`) runs build + test + lint for both packages. +- Running the MCP server locally + testing tool calls with Claude Desktop (stdio and gateway paths): [packages/mcp/LOCAL_DEV.md](packages/mcp/LOCAL_DEV.md). Gateway env template: `.env.local.example`. --- diff --git a/packages/mcp/LOCAL_DEV.md b/packages/mcp/LOCAL_DEV.md new file mode 100644 index 00000000..ecfbcacb --- /dev/null +++ b/packages/mcp/LOCAL_DEV.md @@ -0,0 +1,121 @@ +# Local Development & Testing with Claude + +Two ways to test the Terminal49 MCP server locally with Claude Desktop. Pick by +what you want to exercise. + +> Claude Desktop **cannot reach `http://localhost` over an HTTP connector** — its +> remote connectors route through Anthropic's backend (`160.79.104.0/21`), which +> can't see your machine. So both local paths run a process **on your machine**: +> Path 1 runs the MCP server directly; Path 2 uses `mcp-remote` as a local +> stdio↔HTTP bridge to your gateway. + +Substitute `` with your checkout path (`git rev-parse --show-toplevel`), +and `` with a key from . +Claude Desktop config lives at +`~/Library/Application Support/Claude/claude_desktop_config.json` (macOS). + +--- + +## Path 1 — direct stdio (simplest; tests the tools) + +Claude Desktop spawns the MCP server as a subprocess. It talks **straight to the +t49 API** — no gateway, no OAuth. Best for iterating on tool behavior. + +```sh +# build once (stable spawn; GUI apps have a minimal PATH) +npm run build --workspace @terminal49/mcp +``` + +```jsonc +{ + "mcpServers": { + "terminal49-local": { + "command": "node", + "args": ["/packages/mcp/dist/index.js"], + "env": { + "T49_API_TOKEN": "", + "T49_API_BASE_URL": "http://localhost:3000/v2" + } + } + } +} +``` + +- Point `T49_API_BASE_URL` at your **local t49** (Rails default `:3000`), or drop + it to use prod `https://api.terminal49.com/v2`. +- If Claude Desktop reports `node` not found, use the absolute path (`which node`). +- Live-reload variant (no build): `"command": "npx", "args": ["-y","tsx","/packages/mcp/src/index.ts"]`. + +Restart Claude Desktop, then ask: *"List the Terminal49 tools"* and +*"Track container CAIU1234567 with Maersk."* + +--- + +## Path 2 — full local stack (Claude → gateway → t49) + +Exercises the **HTTP gateway** (`api/mcp.ts`) and its auth resolution, matching +production wiring. `mcp-remote` runs locally and bridges Claude's stdio to your +local gateway over HTTP. + +**1. Run t49 locally** (the other repo) on `:3000`. + +**2. Run the gateway** (this repo). It defaults to `:3000`, so use a different +port to avoid clashing with t49: + +```sh +vercel link # once — pick terminal49/api +cp .env.local.example .env.local # then edit (see that file) +vercel dev --listen 4000 +``` + +**3. Point Claude at the gateway** via `mcp-remote` (passthrough auth: the +`Token` scheme forwards your API key straight through, AuthKit stays off): + +```jsonc +{ + "mcpServers": { + "terminal49-gateway-local": { + "command": "npx", + "args": [ + "-y", "mcp-remote", + "http://localhost:4000/mcp", + "--header", "Authorization: Token " + ] + } + } +} +``` + +This path tests gateway routing + auth + the tools, end to end, against local t49. + +--- + +## Full WorkOS OAuth (not needed for tool testing) + +The WorkOS Bearer/OAuth path (`T49_MCP_AUTHKIT_ENABLED=true`) can't be fully +reproduced on plain `localhost`: WorkOS must reach your gateway over HTTPS and the +OAuth `resource` must be an HTTPS URL registered as a Resource Indicator. To test +it, expose the gateway via a tunnel and use the registered HTTPS URL as the +resource — see [WORKOS_MCP_SETUP.md](./WORKOS_MCP_SETUP.md) and +[OAUTH_TEST_CLIENT.md](./OAUTH_TEST_CLIENT.md). Tool calls themselves never need +this; use Path 1 or 2. + +--- + +## Quick verification (no Claude needed) + +```sh +# stdio server boots and lists tools (no API token needed for tools/list): +printf '%s\n' \ + '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"1.0"}}}' \ + '{"jsonrpc":"2.0","method":"notifications/initialized"}' \ + '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \ + | T49_API_TOKEN=smoke npx tsx packages/mcp/src/index.ts | grep -o '"name":"[a-z_]*"' + +# gateway (Path 2) responds over HTTP: +curl -s -X POST http://localhost:4000/mcp -H 'Authorization: Token ' \ + -H 'Content-Type: application/json' \ + -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | head -c 400 +``` + +Or drive either with the MCP Inspector: `npx @modelcontextprotocol/inspector`. From 92059f3ee95bb165129923106b6ab3eef15d07ec Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 14:16:50 -0700 Subject: [PATCH 14/19] =?UTF-8?q?docs(mcp):=20add=20Path=203=20=E2=80=94?= =?UTF-8?q?=20testing=20the=20real=20WorkOS=20OAuth=20(MCP=20auth)=20local?= =?UTF-8?q?ly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flesh out the WorkOS OAuth path: expose the local gateway over an HTTPS tunnel (Resource Indicators must be HTTPS and a native Claude connector can't reach localhost), point WorkOS + the gateway env at that URL, and drive the flow three ways — Claude Desktop native custom connector (most realistic), mcp-remote as a local OAuth client (no token, it runs the flow), or the bundled oauth-test-client. Notes the aud == resource == indicator three-way match that gates the token exchange. Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/mcp/LOCAL_DEV.md | 72 +++++++++++++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/packages/mcp/LOCAL_DEV.md b/packages/mcp/LOCAL_DEV.md index ecfbcacb..3bfb6e6d 100644 --- a/packages/mcp/LOCAL_DEV.md +++ b/packages/mcp/LOCAL_DEV.md @@ -1,7 +1,8 @@ # Local Development & Testing with Claude -Two ways to test the Terminal49 MCP server locally with Claude Desktop. Pick by -what you want to exercise. +Three ways to test the Terminal49 MCP server locally with Claude Desktop. Pick by +what you want to exercise: **Path 1** the tools (stdio), **Path 2** the gateway + +passthrough auth, **Path 3** the real WorkOS OAuth (MCP auth). > Claude Desktop **cannot reach `http://localhost` over an HTTP connector** — its > remote connectors route through Anthropic's backend (`160.79.104.0/21`), which @@ -90,15 +91,66 @@ This path tests gateway routing + auth + the tools, end to end, against local t4 --- -## Full WorkOS OAuth (not needed for tool testing) +## Path 3 — WorkOS OAuth (the real MCP auth) -The WorkOS Bearer/OAuth path (`T49_MCP_AUTHKIT_ENABLED=true`) can't be fully -reproduced on plain `localhost`: WorkOS must reach your gateway over HTTPS and the -OAuth `resource` must be an HTTPS URL registered as a Resource Indicator. To test -it, expose the gateway via a tunnel and use the registered HTTPS URL as the -resource — see [WORKOS_MCP_SETUP.md](./WORKOS_MCP_SETUP.md) and -[OAUTH_TEST_CLIENT.md](./OAUTH_TEST_CLIENT.md). Tool calls themselves never need -this; use Path 1 or 2. +Drives the production auth path: the client runs the OAuth flow against WorkOS, +gets a Bearer access token, and the gateway exchanges it at +`/connected-clients/resolve` for the t49 API token + account id. No API key. + +**Prerequisites** +- Local **t49** running with the `/connected-clients/resolve` endpoint (PR #2321), + validating the token audience and sharing `T49_CONNECTED_CLIENTS_RESOLVE_SECRET`. +- A **WorkOS dev environment** with DCR enabled and a Resource Indicator + registered (see [WORKOS_MCP_SETUP.md](./WORKOS_MCP_SETUP.md)). The indicator must + equal the gateway's advertised `resource`. + +**Why a tunnel.** WorkOS Resource Indicators are HTTPS, the PRM `resource_metadata` +URL must be fetchable by the client, and a native Claude Desktop connector +(Anthropic's backend) can't reach localhost. So expose the local gateway over +HTTPS: + +```sh +cloudflared tunnel --url http://localhost:4000 # → https://.trycloudflare.com +# or: ngrok http 4000 (use a reserved domain for a URL that survives restarts) +``` + +Register that HTTPS URL in WorkOS as the Resource Indicator. + +**Gateway env** (`.env.local`, then `vercel dev --listen 4000`): + +```sh +T49_MCP_AUTHKIT_ENABLED=true +WORKOS_AUTHORIZATION_SERVER_URL=https://.authkit.app +WORKOS_MCP_RESOURCE=https:// # == the registered Resource Indicator +T49_CONNECTED_CLIENTS_RESOLVE_SECRET= +T49_API_BASE_URL=http://localhost:3000/v2 # local t49 +``` + +**Drive the OAuth flow — three options:** + +1. **Claude Desktop native connector (most realistic).** Settings → Connectors → + Add custom connector → `https://`. Anthropic's backend runs DCR + PKCE, + you consent in the browser, and it connects — exactly the real ChatGPT/Claude + experience. +2. **`mcp-remote` (local OAuth client, best for debugging).** No `--header` — it + *does* the OAuth instead of forwarding a key: + ```jsonc + { "command": "npx", "args": ["-y", "mcp-remote", "https:///mcp"] } + ``` + It discovers the PRM, registers via DCR, opens a browser, stores the token, and + calls the gateway — you watch the whole flow on your machine. +3. **Bundled test client (inspect the token).** + ```sh + MCP_OAUTH_RESOURCE_URL=https:// \ + MCP_OAUTH_MCP_ENDPOINT_URL=https:///mcp \ + node packages/mcp/scripts/oauth-test-client.mjs + ``` + +If `resolve` rejects the token, decode it: the `aud` claim must equal +`WORKOS_MCP_RESOURCE` == the WorkOS Resource Indicator == what the client sent as +`resource`. That three-way match is the whole game. + +> Doing tool work, not auth? Use Path 1 or 2 — they don't need any of this. --- From 43094137a8f9026ab9ba1d7801409fd86ab6b986 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 14:49:48 -0700 Subject: [PATCH 15/19] fix(mcp): only advertise OAuth discovery when WorkOS is configured The 401 WWW-Authenticate challenge always included a `resource_metadata` pointer, even in Token/client-secret deployments where WorkOS is unset and the PRM endpoint 500s. An OAuth-aware client following that pointer would land in a broken discovery flow instead of treating it as an API-key auth failure. Gate `resource_metadata` on WORKOS_AUTHORIZATION_SERVER_URL / WORKOS_ISSUER being set; emit a bare Bearer challenge otherwise. Add gate tests and clear the WORKOS_* env between handler tests. (Addresses Codex review P2 on PR #240.) Co-Authored-By: Claude Opus 4.8 (1M context) --- api/mcp.ts | 14 ++++++++++- packages/mcp/tests/api-handler.test.ts | 32 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/api/mcp.ts b/api/mcp.ts index 760f6966..f1ca97a3 100644 --- a/api/mcp.ts +++ b/api/mcp.ts @@ -83,6 +83,12 @@ type ConnectedClientResolutionResponse = { type UnauthorizedReason = 'missing_credentials' | 'invalid_token'; +function oauthConfigured(): boolean { + return Boolean( + process.env.WORKOS_AUTHORIZATION_SERVER_URL?.trim() || process.env.WORKOS_ISSUER?.trim(), + ); +} + function wwwAuthenticateHeader(req: RequestLike, reason: UnauthorizedReason): string { const parts = ['Bearer realm="mcp"']; @@ -93,7 +99,13 @@ function wwwAuthenticateHeader(req: RequestLike, reason: UnauthorizedReason): st parts.push('error_description="The access token is invalid or expired"'); } - parts.push(`resource_metadata="${protectedResourceMetadataUrl(req)}"`); + // Only advertise OAuth discovery when the authorization server is configured. + // In Token / client-secret deployments WorkOS is unset and the PRM endpoint + // 500s — pointing an OAuth-aware client at resource_metadata would break its + // discovery instead of surfacing the API-key auth failure normally. + if (oauthConfigured()) { + parts.push(`resource_metadata="${protectedResourceMetadataUrl(req)}"`); + } return parts.join(', '); } diff --git a/packages/mcp/tests/api-handler.test.ts b/packages/mcp/tests/api-handler.test.ts index 1026bd1b..5ef8fab1 100644 --- a/packages/mcp/tests/api-handler.test.ts +++ b/packages/mcp/tests/api-handler.test.ts @@ -103,6 +103,8 @@ describe('api/mcp handler lifecycle', () => { delete process.env.T49_MCP_RESOLVE_SECRET; delete process.env.T49_MCP_RESOURCE_URL; delete process.env.WORKOS_MCP_RESOURCE; + delete process.env.WORKOS_AUTHORIZATION_SERVER_URL; + delete process.env.WORKOS_ISSUER; delete process.env.T49_API_BASE_URL; delete process.env.T49_MCP_ALLOWED_HOSTS; delete process.env.T49_MCP_ALLOWED_ORIGINS; @@ -291,6 +293,7 @@ describe('api/mcp handler lifecycle', () => { process.env.T49_MCP_AUTHKIT_ENABLED = 'true'; process.env.T49_CONNECTED_CLIENTS_RESOLVE_SECRET = 'resolve-secret'; process.env.WORKOS_MCP_RESOURCE = 'https://mcp.test'; + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test'; vi.stubGlobal( 'fetch', vi.fn(async () => new Response(JSON.stringify({ error: 'not connected' }), { status: 401 })), @@ -315,6 +318,35 @@ describe('api/mcp handler lifecycle', () => { expect(mockState.servers).toHaveLength(0); }); + it('omits resource_metadata from the 401 challenge when WorkOS is not configured', async () => { + // Token / client-secret deployment: no WORKOS_* env. Advertising OAuth + // discovery would send clients to a PRM endpoint that 500s. + const { default: handler } = await import('../../../api/mcp.ts'); + const req = createRequest({ headers: { host: 'localhost' } }); + const res = new MockResponse(); + + await handler(req as any, res as any); + + expect(res.statusCode).toBe(401); + expect(res.headers['WWW-Authenticate']).toContain('Bearer realm="mcp"'); + expect(res.headers['WWW-Authenticate']).not.toContain('resource_metadata'); + }); + + it('includes resource_metadata in the 401 challenge when WorkOS is configured', async () => { + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test'; + process.env.WORKOS_MCP_RESOURCE = 'https://mcp.test'; + const { default: handler } = await import('../../../api/mcp.ts'); + const req = createRequest({ headers: { host: 'localhost' } }); + const res = new MockResponse(); + + await handler(req as any, res as any); + + expect(res.statusCode).toBe(401); + expect(res.headers['WWW-Authenticate']).toContain( + 'resource_metadata="https://mcp.test/.well-known/oauth-protected-resource"', + ); + }); + it('returns 502 (not 401) when the WorkOS resolve endpoint is unavailable', async () => { process.env.T49_MCP_AUTHKIT_ENABLED = 'true'; process.env.T49_CONNECTED_CLIENTS_RESOLVE_SECRET = 'resolve-secret'; From 78273f3b8a7396acf97a7cfdddb39face7e8ec6f Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 14:49:49 -0700 Subject: [PATCH 16/19] fix(mcp): default OAuth test client to /mcp; make runbook smoke test a POST The OAuth test client defaulted its MCP endpoint to the resource origin, so post-OAuth calls hit `/` (works only via the root rewrite); default it to `/mcp` while keeping the resource/audience as the bare origin. Also fix the WORKOS_MCP_SETUP.md 401-challenge smoke test: a GET to /mcp returns 405 before the auth check, so use an unauthenticated POST. (Addresses two Codex review P2s on PR #240.) Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/mcp/WORKOS_MCP_SETUP.md | 6 ++++-- packages/mcp/scripts/oauth-test-client.mjs | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/mcp/WORKOS_MCP_SETUP.md b/packages/mcp/WORKOS_MCP_SETUP.md index 67c9c5b9..96babe04 100644 --- a/packages/mcp/WORKOS_MCP_SETUP.md +++ b/packages/mcp/WORKOS_MCP_SETUP.md @@ -72,8 +72,10 @@ curl -s -X POST "$ISSUER/oauth2/register" \ # PRM: resource + authorization_servers curl -s https://mcp.terminal49.com/.well-known/oauth-protected-resource | jq -# 401 challenge points at the PRM -curl -si https://mcp.terminal49.com/mcp | grep -i www-authenticate +# 401 challenge points at the PRM (must be POST — a GET to /mcp returns 405) +curl -si -X POST https://mcp.terminal49.com/mcp \ + -H 'Content-Type: application/json' \ + -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | grep -i www-authenticate # After an OAuth flow, decode the access token and confirm: # aud == https://mcp.terminal49.com diff --git a/packages/mcp/scripts/oauth-test-client.mjs b/packages/mcp/scripts/oauth-test-client.mjs index 33ef87a2..ba6334fe 100644 --- a/packages/mcp/scripts/oauth-test-client.mjs +++ b/packages/mcp/scripts/oauth-test-client.mjs @@ -27,9 +27,12 @@ const settings = { ), callbackPath: stringEnv('MCP_OAUTH_CALLBACK_PATH', DEFAULT_CALLBACK_PATH), resourceUrl: trimTrailingSlash(stringEnv('MCP_OAUTH_RESOURCE_URL', DEFAULT_RESOURCE_URL)), + // Resource (audience) stays the bare origin; the MCP calls go to the /mcp + // route. Defaulting the endpoint to the origin would POST to `/`, which works + // only via the root rewrite — be explicit so the test client targets /mcp. mcpEndpointUrl: trimTrailingSlash(stringEnv( 'MCP_OAUTH_MCP_ENDPOINT_URL', - stringEnv('MCP_OAUTH_RESOURCE_URL', DEFAULT_RESOURCE_URL), + `${trimTrailingSlash(stringEnv('MCP_OAUTH_RESOURCE_URL', DEFAULT_RESOURCE_URL))}/mcp`, )), protectedResourceMetadataUrl: optionalEnv('MCP_OAUTH_PROTECTED_RESOURCE_METADATA_URL'), authorizationServerUrl: optionalEnv('MCP_OAUTH_AUTHORIZATION_SERVER_URL'), From 57d51cfa836c67c6a181348cd4297639d35ad794 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 15:03:18 -0700 Subject: [PATCH 17/19] docs(mcp): present the root origin as the canonical MCP endpoint The transports table still listed `/mcp`; the root already serves the MCP handler (vercel.json routes `/`, `/mcp`, and `/api/mcp` to it), and the connector URL elsewhere is the root origin. State the root as canonical and note `/mcp` / `/api/mcp` remain as aliases. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/mcp/home.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/mcp/home.mdx b/docs/mcp/home.mdx index b3e5da5f..943ec1a6 100644 --- a/docs/mcp/home.mdx +++ b/docs/mcp/home.mdx @@ -79,7 +79,7 @@ For the full walkthrough (including local stdio dev, deployment, and SDK example | Transport | Endpoint | Best For | |-----------|----------|----------| -| HTTP (streamable) | `POST /api/mcp` or `POST /mcp` | Serverless, short-lived requests | +| HTTP (streamable) | `POST https://mcp.terminal49.com` (root; `/mcp` and `/api/mcp` also work) | Serverless, short-lived requests | **Authentication**: - API token only (OAuth not required for this release) From a1936c73147f63b6c25a73f2462fd929b67633d1 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 15:05:56 -0700 Subject: [PATCH 18/19] docs(mcp): show only the root connector URL, drop alias mentions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep the public MCP docs clean — present `https://mcp.terminal49.com` as the single connector URL without listing the `/mcp` and `/api/mcp` aliases. The aliases still route in vercel.json; they're just not documented. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/mcp/home.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/mcp/home.mdx b/docs/mcp/home.mdx index 943ec1a6..f13d5047 100644 --- a/docs/mcp/home.mdx +++ b/docs/mcp/home.mdx @@ -79,7 +79,7 @@ For the full walkthrough (including local stdio dev, deployment, and SDK example | Transport | Endpoint | Best For | |-----------|----------|----------| -| HTTP (streamable) | `POST https://mcp.terminal49.com` (root; `/mcp` and `/api/mcp` also work) | Serverless, short-lived requests | +| HTTP (streamable) | `POST https://mcp.terminal49.com` | Serverless, short-lived requests | **Authentication**: - API token only (OAuth not required for this release) @@ -88,7 +88,7 @@ For the full walkthrough (including local stdio dev, deployment, and SDK example - Or set `T49_API_TOKEN` environment variable when self-hosting -Connector URL: `https://mcp.terminal49.com`. The server also responds at `/mcp` and `/api/mcp`, but use the **root URL** — it is the canonical OAuth resource identifier, so OAuth clients (ChatGPT, Claude connectors) bind to the correct token audience. +Connector URL: `https://mcp.terminal49.com`. It is the canonical OAuth resource identifier, so OAuth clients (ChatGPT, Claude connectors) bind to the correct token audience. {/* OAuth hosted docs are not yet published. Links will be added when the pages are available. */} From f48ccff3d48cc81e6e3269526a5fa38e2a453018 Mon Sep 17 00:00:00 2001 From: Akshay Dodeja Date: Fri, 19 Jun 2026 15:09:32 -0700 Subject: [PATCH 19/19] fix(mcp): gate OAuth discovery on AuthKit being enabled, not just configured The 401 challenge advertised resource_metadata whenever WORKOS_* was set, even with T49_MCP_AUTHKIT_ENABLED off. In that state a Bearer token is not resolved (it's treated as a passthrough key), so an OAuth-aware client would complete the WorkOS flow and then loop with a token the handler never honors. Require authKitMcpEnabled() && oauthConfigured() before emitting the OAuth challenge. Add the AuthKit-disabled gate test and document that Bearer is intentionally WorkOS-only under AuthKit (API keys use the Token scheme). (Addresses Codex review P2 on PR #240.) Co-Authored-By: Claude Opus 4.8 (1M context) --- api/mcp.ts | 16 +++++++++++----- packages/mcp/tests/api-handler.test.ts | 18 +++++++++++++++++- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/api/mcp.ts b/api/mcp.ts index f1ca97a3..76b3b02e 100644 --- a/api/mcp.ts +++ b/api/mcp.ts @@ -99,11 +99,12 @@ function wwwAuthenticateHeader(req: RequestLike, reason: UnauthorizedReason): st parts.push('error_description="The access token is invalid or expired"'); } - // Only advertise OAuth discovery when the authorization server is configured. - // In Token / client-secret deployments WorkOS is unset and the PRM endpoint - // 500s — pointing an OAuth-aware client at resource_metadata would break its - // discovery instead of surfacing the API-key auth failure normally. - if (oauthConfigured()) { + // Only advertise OAuth discovery when the WorkOS resolver path is actually + // active: AuthKit enabled AND the authorization server configured. If AuthKit + // is off, a Bearer token isn't resolved (it's treated as a passthrough key), so + // an OAuth-aware client would complete the WorkOS flow and then loop with a + // token the handler won't honor. The PRM endpoint also 500s without WORKOS_*. + if (authKitMcpEnabled() && oauthConfigured()) { parts.push(`resource_metadata="${protectedResourceMetadataUrl(req)}"`); } @@ -425,6 +426,11 @@ export default async function handler(req: RequestLike, res: ResponseLike): Prom authSource: resolvedAuth.source ?? 'authorization', }; + // Intentional: when AuthKit is enabled, `Bearer` is reserved for WorkOS OAuth + // access tokens (resolved below). API keys authenticate with the `Token` + // scheme (passthrough), which is what the docs instruct. Existing Bearer + // API-key clients must migrate to `Token` before AuthKit is enabled — see + // packages/mcp/WORKOS_MCP_SETUP.md (rollout note). if (authKitMcpEnabled() && resolvedAuth.scheme === 'Bearer') { try { const resolved = await resolveConnectedClientToken(callerToken, requestId); diff --git a/packages/mcp/tests/api-handler.test.ts b/packages/mcp/tests/api-handler.test.ts index 5ef8fab1..5f1b4b64 100644 --- a/packages/mcp/tests/api-handler.test.ts +++ b/packages/mcp/tests/api-handler.test.ts @@ -332,7 +332,8 @@ describe('api/mcp handler lifecycle', () => { expect(res.headers['WWW-Authenticate']).not.toContain('resource_metadata'); }); - it('includes resource_metadata in the 401 challenge when WorkOS is configured', async () => { + it('includes resource_metadata when AuthKit is enabled and WorkOS is configured', async () => { + process.env.T49_MCP_AUTHKIT_ENABLED = 'true'; process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test'; process.env.WORKOS_MCP_RESOURCE = 'https://mcp.test'; const { default: handler } = await import('../../../api/mcp.ts'); @@ -347,6 +348,21 @@ describe('api/mcp handler lifecycle', () => { ); }); + it('omits resource_metadata when WorkOS is configured but AuthKit is disabled', async () => { + // WORKOS_* is set, but the Bearer resolver path is off — advertising OAuth + // would make a client complete the flow then loop with an unresolved token. + process.env.WORKOS_AUTHORIZATION_SERVER_URL = 'https://auth.workos.test'; + process.env.WORKOS_MCP_RESOURCE = 'https://mcp.test'; + const { default: handler } = await import('../../../api/mcp.ts'); + const req = createRequest({ headers: { host: 'localhost' } }); + const res = new MockResponse(); + + await handler(req as any, res as any); + + expect(res.statusCode).toBe(401); + expect(res.headers['WWW-Authenticate']).not.toContain('resource_metadata'); + }); + it('returns 502 (not 401) when the WorkOS resolve endpoint is unavailable', async () => { process.env.T49_MCP_AUTHKIT_ENABLED = 'true'; process.env.T49_CONNECTED_CLIENTS_RESOLVE_SECRET = 'resolve-secret';