Skip to content

Rebuild Exie chat on shadcn-svelte AI Elements - #2684

Merged
ejsmith merged 52 commits into
mainfrom
feature/exie-ai-elements
Oct 22, 2026
Merged

ejsmith merged 52 commits into
mainfrom
feature/exie-ai-elements

Conversation

@ejsmith

@ejsmith ejsmith commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Summary

Rebuilds the Exie chat assistant on the official shadcn-svelte AI Elements primitives and fixes every issue from the UX review.

Primitives added (copied from the shadcn-svelte registry): message-scroller, message, bubble, trace, code-block (with highlighter.ts and use-highlighted-code), marker, and empty. The new @shadcn-svelte/primitives dependency powers MessageScroller. The scroll-fade and shimmer utilities from shadcn-svelte's tailwind.css are vendored in src/ai-elements.css.

Bugs fixed

  • Links: Links in answers are real <a> elements now, not link-safety <button>s. Middle-click and open-in-new-tab work, and the list bullet no longer drops to the next line.
  • Invented hosts: When the model prefixes a tool's relative webUrl with a made-up host (https://www.example.com/stack/…), the link is rewritten to the trusted relative path. This only applies to an exact path match with that response's tool results.
  • Stops and errors: A stopped or failed response shows inline with Retry. You no longer get an empty Exie bubble.
  • Order: Text and tool calls render in the order they streamed (message parts).
  • Changes are always visible: marking a stack critical, snoozing, status changes, and reference links always show. They used to appear only after typing the hidden /tools command, which is now gone.
  • Mobile: Inline code wraps instead of running off-screen.

UX improvements

  • Research shows as a Trace: live "Searching error stacks…" progress, collapsed to "Researched in N steps" when done. Each step shows its project or time range, and request/response details open as highlighted JSON with copy buttons. Details render lazily.
  • MessageScroller pins each question to the top while the answer streams, and the jump-to-latest button only appears when there's unseen content.
  • Composer:
    • Removable context chip, e.g. "Stack: NullReferenceException…".
    • Edit-and-resend.
    • Starts at one row.
    • Keyboard hints hidden on touch devices.
  • Starter prompts match the page you're on (stack, event, project, or general).
  • New chat replaces the Eraser icon and can be undone. Recent chats history is saved locally per user and organization: the last 20 chats, with large tool results compacted. A chat less than 12 hours old is restored on reload, and history is cleared on sign-out.
  • A thumbs-down asks "What went wrong?" and records the reason in telemetry. Feedback toasts are removed.
  • Focus and screen readers:
    • Opening Exie focuses the composer.
    • A live region announces when a response starts and finishes, instead of reading every streamed chunk.
  • The A shortcut toggles Exie and is listed in the keyboard shortcuts dialog.
  • One sparkles mark for Exie across the navbar, sidebar, command palette, Fix button, tours, and the upgrade screen. The navbar button reads "Close Exie" when Exie is open.

Exie reliability (backend)

The "Top errors today" starter sometimes ended in failed searches on organization-wide pages: invalid_time_range when the model sent last and startUtc together, then context_required when it retried without a project.

  • The system context now includes the current UTC time. The model had no clock and was guessing start dates.
  • New prompt rules:
    • For relative windows, send only last.
    • There is no organization-wide search, so search each project separately.
    • When a tool call fails, fix its arguments instead of dropping projectId.
  • The MCP descriptions for the time-range parameters and search_stacks.projectId are clearer, and the "project required" error now says how to recover. Tool behavior is unchanged.
  • The assistant quality evals were fixed. They had been returning 401 because the access token has no user. Scenarios are now separate tests, they use the real starter prompt, and any failed tool call fails them.

Measured against the dev data, with 15 runs of the starter on each version:

Old prompt (main) New prompt
Runs with failed tool calls 1 0
Searches sent without a project 2 0
"Malformed response from the AI provider" errors 2 1

The new prompt also states the exact time window it searched. The intermittent "malformed response from the AI provider" errors are a separate provider issue and were not addressed here.

Notes

  • Telemetry events are unchanged, apart from a new edit prompt source and a feedback_reason detail.
  • Chat history uses localStorage. It is scoped to userId:organizationId and removed on logout.

Testing

  • npm run check: 0 errors. npm run lint: clean. npm run build: succeeds.
  • vitest: 1,071 tests pass, including new tests for message parts, history storage, the link rewrite, the tool trace, stop/retry, edit-and-resend, history restore, and new chat with undo.
  • Exercised manually against a running API in the side panel, full page, mobile width (390px), and dark mode.

Project scope

  • New picker in the composer's bottom bar showing which projects Exie searches: "All projects" on organization pages, otherwise the page's project. It's hidden when the organization has only one project.
  • Choosing another project, or all projects, applies to the next questions and leaves out the page's event or stack. It goes back to the page's scope when you change pages or organizations, or when you restore the event or stack.
  • Exie now says when it searched only some projects ("I searched 5 of 12 projects") and offers the rest as follow-ups. When a setup question needs one project, it offers projects as one-click choices.

Breaking: MCP time filters use date math

search_stacks, get_stack_events, search_events, and count_events replace last, startUtc, and endUtc with time, in the same syntax as the app's time filter (for example [now-24h TO now], [now/d TO now/d] for today, [now-1w/w TO now-1w/w] for last week, or [2026-06-01 TO 2026-06-30]), plus an optional IANA timeZone that defaults to UTC. Ranges resolve through TimeRangeParser, the same code the API's time parameter uses. Exie passes the browser's time zone (sent as time_zone on the chat request) and asks the model for date math instead of computed UTC timestamps. Calendar boundaries use the zone's offset on that day, so ranges that cross a daylight saving change are exact, and timestamps with Z or an offset stay exact instants. Arguments a tool does not define now fail with invalid_argument, so a client still sending last gets an error instead of results for all time.

count_events orders groups by occurrences and names stack groups with each stack's title and status. Exie uses it, grouped by stack, for a period's top errors, so the ranking matches the app's Most Frequent view in one call per project. List results include a total.

A time-range eval checks the exact date math Exie sends for rolling windows, calendar periods, explicit dates, no period, follow-ups, the current stack, and organization-wide questions. The last run passed 61 of 61 checks with each scenario repeated 3 times.

DeepSeek DSML handling removed

Exie no longer parses, retries, or rejects DeepSeek's DSML tool-call markup. DSML is DeepSeek's private format, not a standard, and it only reached Exie when an OpenRouter host skipped DeepSeek's parser. The default model returns structured tool calls, and recovering calls from answer text would let quoted event data run tools.

Default model: GPT-6.1 Sol

The default model is now openai/gpt-6.1-sol instead of ~deepseek/deepseek-v4-flash-latest. We ran the paid eval suite against eight models (6 scenarios × 3 runs, twice), and GPT-6-Astra and Grok 4.7 graded the answers blind. Both ranked Sol first in both rounds: 9.5/10 and 18/18 turns passed. DeepSeek V4 Flash scored 5.9 because it made up errors, linked to example.com, and said fixed stacks are never reported again. Sol costs about $16 per 1,000 answers, compared with about $1.40 for DeepSeek, so the plan caps cover fewer answers. The admin model override still works.

Fixes found by the evals

  • Empty id arguments (strict tool calling sends "" for optional fields) now fall back to the current page's event or stack instead of failing.
  • Filters with a leading wildcard such as *timeout* return a clear error to the model instead of ending the turn with "Exie could not complete this request".
  • When a model offers follow-ups before answering, Exie now asks for the full answer instead of getting "the answer above is complete" with nothing above it.
  • The list_projects sort description lists the valid fields.
  • New eval scenarios: explaining a crash from its stack trace, and marking the current stack fixed. Set ASSISTANT_EVAL_RESULTS to record each turn's time and cost.

Review follow-ups

  • New chat stays blank after a reload, and a restored chat keeps searching the project it searched before.
  • Tool steps show in the order they ran when a change comes between lookups.
  • Sending a message keeps the earlier conversation in view: the new question appears at the bottom, the view follows the answer, and it stops once the question reaches the top. Rows render at their real size and the research summary stays one line while Exie works, so the chat no longer jumps.
  • External links in answers ask for confirmation before opening, since answers can repeat untrusted event data. Links within the app and to exceptionless.com open directly.
  • The close button sits in the header with the other actions, and the navbar button always says "Ask Exie".
  • Raw HTML in answers renders as text and remote images do not load, so neither can get around the link confirmation or send data out.
  • Saved chats are cleared on every sign-out path, including an expired session, and chats older than 30 days are dropped.

🤖 Generated with Claude Code

Adopt the official shadcn-svelte AI Elements primitives (message-scroller,
message, bubble, trace, code-block, marker, empty) and rework Exie's chat UX:

- Keep text and tool activity in streamed order and show research as a trace
  with live progress; changes Exie makes are always visible.
- Render answer links as real anchors and restore tool links that the model
  prefixed with an invented host.
- Show stopped and failed responses inline with Retry instead of an empty reply.
- Pin each question to the top while the answer streams (MessageScroller).
- Composer shows removable page context, edit-and-resend, and a stop button.
- Context-aware starter prompts, New chat with undo, and per-user/org chat
  history saved locally (cleared on sign-out).
- Feedback asks what went wrong; focus, live announcements, and an "a"
  shortcut make Exie keyboard and screen-reader friendly.
- One Exie mark across navbar, sidebar, command palette, and Fix button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review 🔄 Running since 2026-10-22T04:13:49.083346Z 2053910 New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

- Never write chat history back after sign-out, and only save from the
  stream that is still current.
- Disable Recent chats while Exie is responding so a deleted chat cannot
  be saved again.
- Drive the poor-rating popover from its open state so keyboard activation
  records the rating, and compose tooltip and popover triggers correctly.
- Cap stored chat history at a fixed size so it never fills the storage
  quota shared with the sign-in token.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 63d7b92e07

ℹ️ 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".

- Make the side panel full width on small screens; the sheet's base
  three-quarter width was overriding it.
- Skip automatic composer focus on touch screens, where opening the
  keyboard made iOS pan the fixed panel and clip its header. Editing a
  message still focuses the composer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 660176a7d4

ℹ️ 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".

Exie's "Top errors today" starter sometimes failed with invalid_time_range
or context_required tool errors on organization-wide pages.

- Give the model the current UTC time; it had no clock and guessed
  absolute start dates for relative questions.
- Add system prompt rules: pass only `last` for relative windows, search
  each project because there is no organization-wide search, and fix
  rather than drop scoping arguments when a tool call fails.
- Clarify the MCP time-range and search_stacks projectId descriptions and
  make the project-required error say how to recover.
- Fix the assistant quality evals: authenticate as a signed-in user (the
  access token had no user and always returned 401), split scenarios so
  each reports independently, use the real starter prompt, and fail on
  any tool error.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6e4476c557

ℹ️ 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".

Adds a project scope picker to the Exie composer. It follows the current
page by default ("All projects" on organization pages, the page's project
elsewhere); choosing another project or all projects scopes the next
requests and leaves out the page's event or stack. The scope resets when
the page or organization changes.

Exie now says when it searched only some of an organization's projects
and offers the rest as follow-ups, and offers projects as one-click
choices when a setup question needs a single project.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c4c991b099

ℹ️ 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".

Some OpenRouter providers for DeepSeek V4 (GMICloud, Baidu, DigitalOcean)
skip DeepSeek's tool parser and return tool calls as raw DSML markup in the
content. About 1 in 8 provider responses in local logs failed this way, and
the single retry usually failed again, ending the turn with "malformed
response".

Parse complete DSML tool_calls blocks the same way vLLM's DeepSeek V4
parser does and run them as structured tool calls, keeping the text before
the block. Incomplete or mixed markup still falls back to the retry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 863dc96024

ℹ️ 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".

V4.1 writes "<|DSML| calls>" with a space and no "tool_" prefix, so the
block start was missed and the recovery fell back to the retry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 152890b0b4

ℹ️ 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".

ejsmith and others added 2 commits October 20, 2026 18:13
Running the Exie evals against eight models surfaced server-side bugs:

- Strict tool calling (OpenAI models) sends "" for optional ids. Empty
  strings now fall back to the current page's ids instead of failing as
  invalid_id, which cost GPT-6.1 Sol a failed tool call on every
  current-event question.
- A leading-wildcard filter such as title:*database* made Elasticsearch
  reject the search and crashed the whole turn. Leading wildcards now
  return an invalid_filter result the model can correct, and searches
  Elasticsearch rejects become tool errors instead of turn failures.
- When a model offered follow-ups before answering, the final-answer
  instruction let it reply "the answer above is complete" with no answer
  shown. The instruction now says the user has not seen an answer yet.
- list_projects now names its sort fields; models guessed "project name".

Also add stack-trace explanation and mark-fixed eval scenarios, and an
ASSISTANT_EVAL_RESULTS option that records each eval turn for model
comparisons.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blind-graded evals ranked GPT-6.1 Sol first of eight models, ahead of
the current DeepSeek V4 Flash default, which invented errors and links.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 526ee6d940

ℹ️ 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".

ejsmith and others added 3 commits October 20, 2026 21:17
- New chat stays blank after a reload, and each saved chat restores the
  project scope it searched.
- An oversized newest chat no longer wipes the saved history.
- When a chat outlives its server tool results, the model is told to call
  the tools again instead of guessing.
- Tool steps show in the order they ran, with a change between lookups.
- Opening Exie directly no longer shows the previous page's context.
- "Today" and "this week" use the user's time zone, sent by the browser.
- Doubled-pipe DSML reaches the tool-call recovery parser.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Switching it to Close Exie widened the button and shifted the navbar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0b8fd0ea36

ℹ️ 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".

Cached tool results from one project would otherwise answer a follow-up
asked for another project or for all projects.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cbb565a601

ℹ️ 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".

ejsmith and others added 2 commits October 20, 2026 21:49
Integration test hosts run the app's APM setup, which registers a
process-wide tracer that records HttpClient spans. When the webhook
telemetry test shared a shard with them, its unsampled case picked up
those spans. The test now captures only traces its own sampler kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The full-page e2e looked for the old empty conversation log and Clear
  conversation button; the rebuilt chat shows a greeting and New chat.
- A chat restored before the project list loads now falls back to the
  page's project if its saved project is no longer available.
- MCP time-range descriptions send today and this week to startUtc.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e8abf6d1a4

ℹ️ 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".

ejsmith and others added 3 commits October 20, 2026 21:57
Exie's avatar, navbar button, navigation entry, command palette item, Fix button, and tour icons now use the four-point sparkle from the logo's i-dot and app icon instead of Lucide's sparkles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…4-hour starter

- A chat that finishes after moving to another project now saves the
  project its tool results came from, so a restored follow-up starts a
  new server conversation when the scope differs.
- The organization starter asks for the last 24 hours, so its label now
  says that instead of today.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Exie's icon is the robot again, now with the four-point sparkle from the logo's i-dot as its antenna tip, so it keeps its personality and still ties to the brand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ccb4333a6e

ℹ️ 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".

"last 7 days" and "last 2 weeks" are durations like [now-7d TO now], but
only minutes and hours were recognized, so a range across a daylight
saving change had its start moved to the older offset. Any phrase with a
number and a time unit now keeps its elapsed time; named periods such as
"last week" stay calendar periods.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4c6571d394

ℹ️ 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".

ejsmith and others added 2 commits October 21, 2026 09:24
search_stacks matches a period against each stack's last occurrence, so
asking which errors happened yesterday left out a stack that also
occurred today. Exie now uses count_events grouped by stack for any
question about errors in a period, and search_stacks only to find stacks
by stack fields. Stack groups include first and last occurrence, so
"new errors in the last hour" takes one call instead of a get_stack per
stack. The search_stacks description says what its time filter matches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each user and organization's saved chats had their own 1,000,000
character limit, so someone in several organizations could fill the
origin's storage quota and break saving the sign-in token. All saved
chats now share one budget: the oldest chats in any organization are
dropped first, the chat being saved is kept, and a history that loses
every chat is removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b07e834144

ℹ️ 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".

… stored

- Chats dropped from other organizations to make room are put back if
  the new history still cannot be written, so a failed save never costs
  older chats.
- Saving and deleting return the history as stored, so Recent chats no
  longer lists chats that were dropped for space, which could later be
  saved again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review


P2 Badge Read stack groups when building response links

When a top-errors answer uses count_events with groupBy: "stack", the serializer places each title and webUrl under data.groups, but this extractor only visits data.items or the data object itself. Consequently addAssistantResourceLinks cannot link an unlinked stack title, and createAssistantUrlTransform cannot repair a model-generated absolute URL for that stack; handle data.groups alongside data.items so the primary period-query flow retains its internal links.

ℹ️ 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".

- "How many times did this stack occur today?" now uses count_events
  with a stack filter, which sums occurrences. get_stack_events counted
  event documents, and one document can stand for several occurrences.
- Response links also read count_events stack groups, so ranked stack
  titles get linked and invented hosts on their URLs are repaired.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 58e00c893b

ℹ️ 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".

Saved chats trim tool results over 16,000 characters to the fields links
need, but only list items were kept. A large count_events result grouped
by stack lost every stack's title and link once the chat was saved and
reopened. Groups are now trimmed the same way, keeping each key, title,
and link.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0d25c0b055

ℹ️ 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".

Only the organization being loaded was cleaned of chats older than 30
days, so chats in an organization the user stopped opening stayed in
localStorage. Every history write now drops expired chats from all
organizations, and a failed save restores only the chats dropped for
space, never the expired ones.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8a68069494

ℹ️ 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".

…firmed

A chat restored before the project list loaded, or after it failed,
kept its server conversation, so the next message could reuse cached
tool results for a project the user may no longer see. When the saved
project is not the page's and access is not yet confirmed, the chat now
continues in a new server conversation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cb7519ea0f

ℹ️ 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".

When a restored chat's project was also the page's, as on a deleted
project's stale URL, the project recheck skipped it and follow-ups
reused that conversation's cached tool results. Once projects load, a
server conversation whose project is missing now starts over.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0a7d7a2573

ℹ️ 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".

Each cached tool result now records the projects it came from: its
projectId argument or the page's project, and any project ids in the
result. Loading a conversation drops results whose projects no longer
exist in the organization, so a deleted project's data never reaches a
later turn, whichever way the browser restored the chat. Results without
recorded projects, or whose projects cannot be checked, are dropped too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 74251de264

ℹ️ 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".

ejsmith and others added 2 commits October 21, 2026 12:13
… in diagnostics

- Project ids for a cached tool result are now read from the full
  result. Truncation wraps the result in a string, which hid its project
  ids, so a truncated result could outlive its deleted project.
- Exie's turn diagnostics now recognize count_events instead of
  reporting it as an unknown tool in logs and metrics.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 239eb8a1fd

ℹ️ 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".

ejsmith and others added 2 commits October 21, 2026 12:21
A successful result with no recorded project, such as a count whose
project the tool resolved implicitly for an organization's only
project, passed the deleted-project check by default. Only failed
results, which hold no project data, are now kept without a project.
The lookup failure warning also logs the exception message as a
structured property.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: dca5942409

ℹ️ 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".

ejsmith and others added 2 commits October 21, 2026 22:00
Ranges whose boundaries both carry Z or an offset skip DateTimeRange, so
{...} braces were ignored and events exactly on an excluded boundary
were counted. An exclusive boundary now moves one millisecond inward,
matching the inclusive millisecond-precision range query.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The e2e workflow runs npm ci before starting the AppHost, then the Vite
app's installer ran npm install again. That second install now takes
three to five minutes, past the five-minute wait for the app, so most
e2e shards never reached their tests. With --ci-e2e the app keeps npm as
its package manager but no longer installs again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Code Coverage

Package Line Rate Branch Rate Complexity Health
Exceptionless.AppHost 23% 22% 130 ❌
Exceptionless.Core 78% 70% 10986 ✔
Exceptionless.Insulation 51% 43% 370 ➖
Exceptionless.Web 86% 71% 9426 ✔
Summary 81% (28620 / 35511) 70% (14297 / 20496) 20912 ✔

@ejsmith
ejsmith merged commit 83151e3 into main Oct 22, 2026
22 checks passed
@ejsmith
ejsmith deleted the feature/exie-ai-elements branch October 22, 2026 04:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant