Repository navigation
Conversation
* chore: unify monorepo on Vite+ 0.3.3 (#381) * chore: unify monorepo on Vite+ 0.3.2 Co-authored-by: Akshay Dodeja <dodeja@gmail.com> * fix: preserve cold workspace build ordering Co-authored-by: Akshay Dodeja <dodeja@gmail.com> * ci: verify stacked agent trust PR Co-authored-by: Akshay Dodeja <dodeja@gmail.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> * docs: fix passive voice and phrasing in guide pages (#385) Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com> * docs: document line hold type (#314) * feat(mcp): expose custom fields in get_container and get_shipment_details (#386) * feat(mcp): expose custom fields in get_container and get_shipment_details Account-defined custom fields (PO number, project manager, ...) were not reachable through the MCP server, so assistants answered that the connector had no such data. The API already serves them from the custom_fields sub-resource, which only accepts a signed-in user. SDK: containers.customFields and shipments.customFields now request the definition sideload and map each value to { slug, name, value, displayValue, dataType }. MCP: get_container accepts include ['custom_fields'] and get_shipment_details accepts include_custom_fields; both return custom_fields: [{ name, slug, value, display_value, data_type }] and report an API-key credential as a note instead of failing the call. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * docs(sdk): regenerate reference for CustomField Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix(mcp): report custom field access and load state accurately --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Akshay Dodeja <dodeja@gmail.com> * docs: update migration guides for self-serve API trial (#380) * docs: explain self-serve API trial in migration guides * docs: align API access instructions with self-serve trial * fix(ci): stop outsider content from steering the @claude agent (#390) The @claude workflow only checked who wrote the triggering comment. On this public repo anyone can open an issue or fork PR, and its body, diff, and comments reach the prompt of an agent holding a write-scoped GitHub App token. In git CLI mode the pinned action also writes that token into the origin remote URL in .git/config, readable by the agent's Read tool, and the explicit Write/Edit grant allowed edits outside the workspace. - Require the issue/PR author to be OWNER, MEMBER, or COLLABORATOR too. - Feed the agent only comments and reviews from trusted authors (plus named review bots) via include_comments_by_actor; refuse fork PRs. The pre-step fails closed on API errors. - Commit through the GitHub API (use_commit_signing) so no token is written to the workspace; checkout without persisted credentials. - Drop blanket Write/Edit; deny Bash, reads of .git, /proc and git credential files, and edits to .git and .github/workflows. - Correct the system prompt's shell claim and mark non-request content as untrusted data. - Pin actions/checkout by SHA. Refs DEV-13107 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mcp): strip credential headers from Sentry events (#389) Sentry's default RequestData integration copies every incoming request header and cookie into event.request on each error and transaction event, regardless of sendDefaultPii. On the gateway that is the caller's Authorization header, i.e. a customer's Terminal49 API key in pass-through mode. Its built-in deny list only covers span attributes and misses names such as x-vercel-protection-bypass, x-vercel-proxy-signature, and arbitrary cookie names. Scrub request headers, request cookies, and header span attributes in beforeSend and beforeSendTransaction with one policy, and cover it with a test that runs the real SDK pipeline against a loopback server and fails without the hooks. Refs DEV-13105 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * docs: improve SEO metadata on recently changed pages (#391) Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com> * chore(deps): bump the npm-security group across 1 directory with 9 updates (#373) * chore(deps): bump the npm-security group across 1 directory with 9 updates Bumps the npm-security group with 9 updates in the / directory: | Package | From | To | | --- | --- | --- | | [axios](https://github.com/axios/axios) | `1.16.1` | `1.20.0` | | [fast-uri](https://github.com/fastify/fast-uri) | `3.1.2` | `3.1.8` | | [hono](https://github.com/honojs/hono) | `4.12.26` | `4.13.9` | | [ip-address](https://github.com/beaugunderson/ip-address) | `10.2.0` | `10.7.2` | | [linkify-it](https://github.com/markdown-it/linkify-it) | `5.0.1` | `5.0.2` | | [nanoid](https://github.com/ai/nanoid) | `3.3.11` | `3.3.19` | | [postcss](https://github.com/postcss/postcss) | `8.5.14` | `8.5.28` | | [socket.io-parser](https://github.com/socketio/socket.io) | `4.2.6` | `4.2.7` | | [tar](https://github.com/isaacs/node-tar) | `7.5.15` | `7.5.21` | Updates `axios` from 1.16.1 to 1.20.0 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](axios/axios@v1.16.1...v1.20.0) Updates `fast-uri` from 3.1.2 to 3.1.8 - [Release notes](https://github.com/fastify/fast-uri/releases) - [Commits](fastify/fast-uri@v3.1.2...v3.1.8) Updates `hono` from 4.12.26 to 4.13.9 - [Release notes](https://github.com/honojs/hono/releases) - [Commits](honojs/hono@v4.12.26...v4.13.9) Updates `ip-address` from 10.2.0 to 10.7.2 - [Release notes](https://github.com/beaugunderson/ip-address/releases) - [Commits](beaugunderson/ip-address@v10.2.0...v10.7.2) Updates `linkify-it` from 5.0.1 to 5.0.2 - [Changelog](https://github.com/markdown-it/linkify-it/blob/master/CHANGELOG.md) - [Commits](markdown-it/linkify-it@5.0.1...5.0.2) Updates `nanoid` from 3.3.11 to 3.3.19 - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](ai/nanoid@3.3.11...3.3.19) Updates `postcss` from 8.5.14 to 8.5.28 - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](postcss/postcss@8.5.14...8.5.28) Updates `socket.io-parser` from 4.2.6 to 4.2.7 - [Release notes](https://github.com/socketio/socket.io/releases) - [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io/compare/socket.io-parser@4.2.6...socket.io-parser@4.2.7) Updates `tar` from 7.5.15 to 7.5.21 - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](isaacs/node-tar@v7.5.15...v7.5.21) --- updated-dependencies: - dependency-name: axios dependency-version: 1.20.0 dependency-type: indirect dependency-group: npm-security - dependency-name: fast-uri dependency-version: 3.1.8 dependency-type: indirect dependency-group: npm-security - dependency-name: hono dependency-version: 4.13.8 dependency-type: indirect dependency-group: npm-security - dependency-name: ip-address dependency-version: 10.7.2 dependency-type: indirect dependency-group: npm-security - dependency-name: linkify-it dependency-version: 5.0.2 dependency-type: indirect dependency-group: npm-security - dependency-name: nanoid dependency-version: 3.3.19 dependency-type: indirect dependency-group: npm-security - dependency-name: postcss dependency-version: 8.5.28 dependency-type: indirect dependency-group: npm-security - dependency-name: socket.io-parser dependency-version: 4.2.7 dependency-type: indirect dependency-group: npm-security - dependency-name: tar dependency-version: 7.5.21 dependency-type: indirect dependency-group: npm-security ... Signed-off-by: dependabot[bot] <support@github.com> * chore: Auto-generate Postman collection from openapi.json [skip ci] * fix(deps): repair Node 24 frozen installs and drop generated churn --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Akshay Dodeja <dodeja@gmail.com> * chore(deps): apply js-yaml security update to root workspace lock (#318) * chore(deps): bump js-yaml Bumps the npm_and_yarn group with 1 update in the /sdks/typescript-sdk directory: [js-yaml](https://github.com/nodeca/js-yaml). Updates `js-yaml` from 4.2.0 to 4.3.1 - [Changelog](https://github.com/nodeca/js-yaml/blob/4.3.1/CHANGELOG.md) - [Commits](nodeca/js-yaml@4.2.0...4.3.1) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.3.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * chore: Auto-generate Postman collection from openapi.json [skip ci] * chore: Auto-generate Postman collection from openapi.json [skip ci] * chore(deps): keep generated collection unchanged in security update --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Akshay Dodeja <dodeja@gmail.com> * chore: release main (#343) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Akshay Dodeja <dodeja@gmail.com> * chore(deps): bump the npm-security group across 1 directory with 2 updates (#395) Bumps the npm-security group with 2 updates in the / directory: [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) and [markdown-it](https://github.com/markdown-it/markdown-it). Updates `http-cache-semantics` from 4.2.0 to 4.3.0 - [Commits](https://github.com/kornelski/http-cache-semantics/commits) Updates `markdown-it` from 14.2.0 to 14.3.2 - [Changelog](https://github.com/markdown-it/markdown-it/blob/14.3.2/CHANGELOG.md) - [Commits](markdown-it/markdown-it@14.2.0...14.3.2) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-version: 4.3.0 dependency-type: indirect dependency-group: npm-security - dependency-name: markdown-it dependency-version: 14.3.2 dependency-type: indirect dependency-group: npm-security ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the npm-security group across 1 directory with 3 updates (#394) Bumps the npm-security group with 3 updates in the / directory: [http-cache-semantics](https://github.com/kornelski/http-cache-semantics), [markdown-it](https://github.com/markdown-it/markdown-it) and [source-map-js](https://github.com/7rulnik/source-map-js). Updates `http-cache-semantics` from 4.2.0 to 4.3.0 - [Commits](https://github.com/kornelski/http-cache-semantics/commits) Updates `markdown-it` from 14.2.0 to 14.3.2 - [Changelog](https://github.com/markdown-it/markdown-it/blob/14.3.2/CHANGELOG.md) - [Commits](markdown-it/markdown-it@14.2.0...14.3.2) Updates `source-map-js` from 1.2.1 to 1.2.2 - [Release notes](https://github.com/7rulnik/source-map-js/releases) - [Changelog](https://github.com/7rulnik/source-map-js/blob/main/CHANGELOG.md) - [Commits](7rulnik/source-map-js@v1.2.1...v1.2.2) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-version: 4.3.0 dependency-type: indirect dependency-group: npm-security - dependency-name: markdown-it dependency-version: 14.3.2 dependency-type: indirect dependency-group: npm-security - dependency-name: source-map-js dependency-version: 1.2.2 dependency-type: indirect dependency-group: npm-security ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump the npm_and_yarn group across 1 directory with 3 updates (#393) Bumps the npm_and_yarn group with 3 updates in the /sdks/typescript-sdk directory: [js-yaml](https://github.com/nodeca/js-yaml), [markdown-it](https://github.com/markdown-it/markdown-it) and [source-map-js](https://github.com/7rulnik/source-map-js). Updates `js-yaml` from 4.2.0 to 4.3.2 - [Changelog](https://github.com/nodeca/js-yaml/blob/4.3.2/CHANGELOG.md) - [Commits](nodeca/js-yaml@4.2.0...4.3.2) Updates `markdown-it` from 14.2.0 to 14.3.2 - [Changelog](https://github.com/markdown-it/markdown-it/blob/14.3.2/CHANGELOG.md) - [Commits](markdown-it/markdown-it@14.2.0...14.3.2) Updates `source-map-js` from 1.2.1 to 1.2.2 - [Release notes](https://github.com/7rulnik/source-map-js/releases) - [Changelog](https://github.com/7rulnik/source-map-js/blob/main/CHANGELOG.md) - [Commits](7rulnik/source-map-js@v1.2.1...v1.2.2) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.3.2 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: markdown-it dependency-version: 14.3.2 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: source-map-js dependency-version: 1.2.2 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(mcp): search public docs through Mintlify REST and MCP (#387) * feat(mcp): add search_docs tool backed by the Mintlify docs MCP Forwards the query to the MCP server Mintlify hosts for terminal49.com/docs (search_terminal49), so results always match the live public docs. Adds the tool to the ChatGPT submission listing, which the annotations test locks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(mcp): include search_docs in protocol smoke checks * feat(mcp): search_docs uses Mintlify's REST search API when a key is set (#388) With MINTLIFY_ASSISTANT_API_KEY, search_docs calls the documented POST /discovery/v1/search/terminal49 endpoint. Without it, the tool keeps forwarding to Mintlify's hosted docs MCP. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mcp): validate docs links and preserve SSE response boundaries --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Akshay Dodeja <dodeja@gmail.com> * feat(sdk): complete verified shipment and container filters (#396) * chore(sdk): generate filter contracts and preserve docs metadata * docs: document verified shipment and container filters * feat(sdk): support validated shipment and container filters * chore: Auto-generate Postman collection from openapi.json [skip ci] * fix(tooling): disable optional Postman parameters by default * fix(docs): restore shipment party flag and container schema * fix(sdk): reject malformed list filter expressions before requests * chore: Auto-generate Postman collection from openapi.json [skip ci] --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * chore(mcp): generate filter schemas from the public API contract * feat(mcp): add verified shipment and container filters * docs(mcp): document filtered worklists and pagination * fix(tooling): preserve SDK status expressions and identifier trimming * fix(mcp): reject competing tag aliases and preserve valid inputs * docs(mcp): clarify shipment tag aliases --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com> Co-authored-by: Matt Turner <matt@terminal49.com> Co-authored-by: Maurycy Pawłowski-Wieroński <maurycy@maurycy.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: alosec <alex.garcia@terminal49.com>
SDK filter messages are fragments without trailing punctuation, so the
appended guidance ran on ("...comparison expressions Use the filter
values..."). Terminate the SDK message before the guidance and assert
the exact text.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds live eval cases for has_more/next_page, page overlap, a SCAC filter round-trip, a pickup_lfd round-trip derived from returned data, and pre-request rejection of duplicate filters and impossible dates. CI previously ran the eval only against production, so a PR's tool changes were never evaluated before deploy. The preview job now runs the same suite against the PR's Vercel preview. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b5c2edc30d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| test: (p) => | ||
| (listTotal(p) ?? 0) <= 2 || | ||
| (listMeta(p).has_more === true && listMeta(p).next_page === 2), |
There was a problem hiding this comment.
Fail when pagination totals are missing
When meta.total is absent or changes to a non-number, listTotal() returns undefined, this expression coerces it to zero, and line 451 skips the test. Consequently, a response that loses its total and also reports incorrect has_more/next_page values passes this new regression gate. Require a numeric total before conditionally skipping, or fail explicitly when the pagination metadata is malformed.
Useful? React with 👍 / 👎.
| }, | ||
| 'has-more', | ||
| ); | ||
| if ((listTotal(result.payload) ?? 0) <= 2) return skip(); |
There was a problem hiding this comment.
The new next-page check skips before asserting score.contractPass. If the tool returns an error or drops meta.total, listTotal returns undefined, which becomes zero and skips the failed check. This can hide a broken response in CI. Assert that the call succeeded and returned a numeric total before skipping accounts with two or fewer records.
Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/mcp/eval/tools.eval.ts
Line: 451
Comment:
**Broken list calls skip**
The new next-page check skips before asserting `score.contractPass`. If the tool returns an error or drops `meta.total`, `listTotal` returns `undefined`, which becomes zero and skips the failed check. This can hide a broken response in CI. Assert that the call succeeded and returned a numeric total before skipping accounts with two or fewer records.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.| predicates: [ | ||
| { | ||
| name: 'no id from page 1 repeats on page 2', | ||
| test: (p) => listItems(p).every((i) => !firstIds.has(i.id)), |
There was a problem hiding this comment.
The page-overlap check can pass without receiving a valid second page. listItems turns malformed items into an empty array, and .every() then returns true. requiredKeys only checks that items exists, so a response such as items: null passes. Assert the array shape and valid IDs; when the first page's total exceeds five, also require a non-empty second page.
Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/mcp/eval/tools.eval.ts
Line: 467
Comment:
**Invalid second pages pass**
The page-overlap check can pass without receiving a valid second page. `listItems` turns malformed `items` into an empty array, and `.every()` then returns true. `requiredKeys` only checks that `items` exists, so a response such as `items: null` passes. Assert the array shape and valid IDs; when the first page's total exceeds five, also require a non-empty second page.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.|
Preview deployment for your docs. Learn more about Mintlify Previews.
|
| { pickup_lfd: lfd, number: String(withLfd.number) }, | ||
| { | ||
| requiredKeys: ['items'], | ||
| predicates: [ | ||
| { | ||
| name: `returns ${String(withLfd.number)} for pickup_lfd=${lfd}`, | ||
| test: (p) => listItems(p).some((i) => i.id === withLfd.id), |
There was a problem hiding this comment.
The new pickup_lfd check also filters by the sampled container’s exact number, then only checks that its ID comes back. If the server ignores pickup_lfd, the number filter still returns that container and CI passes this check. Add a second call with the same number and a different date, and require that container to be absent.
Knowledge Base Used: MCP observability and quality assurance
Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/mcp/eval/tools.eval.ts
Line: 537-543
Comment:
**Ignored date filters pass**
The new `pickup_lfd` check also filters by the sampled container’s exact `number`, then only checks that its ID comes back. If the server ignores `pickup_lfd`, the number filter still returns that container and CI passes this check. Add a second call with the same number and a different date, and require that container to be absent.
**Knowledge Base Used:** [MCP observability and quality assurance](https://app.greptile.com/terminal49/-/custom-context/knowledge-base/terminal49/api/-/docs/mcp-observability-and-quality.md)
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.| output += `/** Comparison expressions are validated at runtime; arrays combine bounds with AND. */\nexport type DateFilter = string | readonly string[];\n`; | ||
| output += `/** Generic string arrays use AND. Use comma-separated literals for OR unless specified otherwise. */\nexport type StringFilter = string | readonly string[];\n`; | ||
| output += `export type PartyFilter = StringFilter | { value: StringFilter; operator?: 'any' | 'all' };\n`; | ||
| output += `export type ContainerStatusFilter = ContainerStatus | \`=\${ContainerStatus}\` | \`\${ContainerStatus},\${string}\` | '@exists' | '@not_exists' | readonly ContainerStatus[];\n`; |
There was a problem hiding this comment.
Valid status arrays need casts
The generated ContainerStatusFilter only allows plain status names inside arrays. The MCP tests and SDK checks support expressions such as ['@exists'], ['=available'], and ['available,on_ship'], but TypeScript callers cannot use them without a cast. Generate the array member type from the same supported expressions as the scalar member.
Prompt To Fix With AI
This is a comment left during a code review.
Path: sdks/typescript-sdk/scripts/generate-filter-types.mjs
Line: 31
Comment:
**Valid status arrays need casts**
The generated `ContainerStatusFilter` only allows plain status names inside arrays. The MCP tests and SDK checks support expressions such as `['@exists']`, `['=available']`, and `['available,on_ship']`, but TypeScript callers cannot use them without a cast. Generate the array member type from the same supported expressions as the scalar member.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
New eval cases describe the code under review, so running them against production on a PR fails until deploy and skipped the preview eval that depends on the mcp job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b976808351
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const lfd = String(withLfd.demurrage.pickupLfd).slice(0, 10); | ||
| const { score } = await evaluate( | ||
| 'list_containers', | ||
| { pickup_lfd: lfd, number: String(withLfd.number) }, |
There was a problem hiding this comment.
Verify pickup LFD without the exact-number fallback
When the backend ignores pickup_lfd but still applies the exact number filter, this call returns the sampled container and the new regression gate passes. Since the test is intended to detect ineffective LFD filtering, also query the same number with a deliberately nonmatching date, or otherwise validate results without a second filter that independently guarantees the expected row.
Useful? React with 👍 / 👎.
| name: 'no id from page 1 repeats on page 2', | ||
| test: (p) => listItems(p).every((i) => !firstIds.has(i.id)), |
There was a problem hiding this comment.
Require a valid second page before passing overlap checks
When page 1 has five rows but page 2 is broken, listItems() converts a malformed or missing items value into [], and .every() then passes vacuously; an unexpectedly empty second page also passes even when the first response advertises more rows. Assert the second-page array shape and, when page 1 indicates more results, require at least one valid ID before checking overlap.
Useful? React with 👍 / 👎.
| output += `/** Comparison expressions are validated at runtime; arrays combine bounds with AND. */\nexport type DateFilter = string | readonly string[];\n`; | ||
| output += `/** Generic string arrays use AND. Use comma-separated literals for OR unless specified otherwise. */\nexport type StringFilter = string | readonly string[];\n`; | ||
| output += `export type PartyFilter = StringFilter | { value: StringFilter; operator?: 'any' | 'all' };\n`; | ||
| output += `export type ContainerStatusFilter = ContainerStatus | \`=\${ContainerStatus}\` | \`\${ContainerStatus},\${string}\` | '@exists' | '@not_exists' | readonly ContainerStatus[];\n`; |
There was a problem hiding this comment.
Include supported expressions in status-array types
The runtime and MCP schema accept status-array elements such as '=available', '@exists', and 'available,on_ship', but this generated public type restricts arrays to plain ContainerStatus values. TypeScript consumers therefore need casts for inputs the SDK validates and forwards successfully; generate the array member from the same expression union as the scalar member rather than editing the generated output directly.
AGENTS.md reference: AGENTS.md:L42-L43
Useful? React with 👍 / 👎.
|
Superseded by #411, which carries this change rebased onto main. |
Summary
Follow-up to #397 from live testing on mcp.t49.dev and an audit of the eval suite.
npm run evalagainst the PR's Vercel preview (once per run, not per protocol version). The production run stays as a deployed-state check.list_shipmentsandlist_containers:has_more/next_pagewhenmeta.totalexceeds the page, no ID overlap between pages 1 and 2, a SCAC filter round-trip, apickup_lfdround-trip derived from returned data, and pre-request rejection of duplicate filters and impossible dates....comparison expressions Use the filter values...). The unit test now asserts the exact text.Expected eval results until the backend fix deploys
list_containers reports a next pageandlist_containers pickup_lfd filterfail against production today. Both are fixed in https://github.com/Terminal49/t49/pull/4200. These cases are the regression gate for it.Testing
@terminal49/mcp: 379 tests pass;eval:checkand lint pass.🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.The PR appears safe to merge, with non-blocking improvements needed in the live checks and generated status type.
Fix with agent prompt
Summary
Adds preview evaluations and live checks for list filtering and pagination. The wider diff also adds typed filters across the API, SDK, and MCP, optional custom-field reads, documentation search, and automation updates.
pickup_lfdcheck needs a nonmatching-date case to catch ignored filters.Diagram
%%{init: {'theme': 'neutral'}}%% flowchart LR Spec[OpenAPI filter catalog] --> SDK[SDK filter types and checks] Spec --> MCP[MCP input schemas] MCP --> SDK SDK --> API[Terminal49 API] CI[Preview CI job] --> Eval[Live list evaluations] Eval --> Preview[Vercel MCP preview] Preview --> MCPReviews (2) · Last reviewed commit: "test(mcp): eval list filtering and pagin..." · Reviewed by Greptile