Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
157 commits
Select commit Hold shift + click to select a range
7565d6d
Data format for Metric layouts
matt-aitken Feb 1, 2026
ed1201e
Refactored some code from the action into the service
matt-aitken Jan 29, 2026
3d99540
QueryWidget that can be used on the Query page and on Metrics dashboards
matt-aitken Feb 1, 2026
d49b698
Added loading state
matt-aitken Feb 1, 2026
e98d4ab
Metric resource route
matt-aitken Feb 1, 2026
e8befa3
Scaffolding for built in metric page
matt-aitken Feb 1, 2026
3e26ac8
Very basic dashboard rendering
matt-aitken Feb 1, 2026
0013b5d
Metric errors and set concurrency limit
matt-aitken Feb 1, 2026
66757fe
Time filtering and auto-reloading
matt-aitken Feb 1, 2026
f8e6c7f
Drag and drop styles working
matt-aitken Feb 2, 2026
9aa7be9
Drag from all corners
matt-aitken Feb 2, 2026
51bb154
Shows resizing state when resizing
matt-aitken Feb 2, 2026
d867b3d
Don't allow text selection when resizing
matt-aitken Feb 2, 2026
4a54547
Customised the style of the resize bg and handles
matt-aitken Feb 2, 2026
8c5efe2
Page for custom dashboard
matt-aitken Feb 2, 2026
e839f43
description column added
matt-aitken Feb 2, 2026
419925a
Add metrics to the side menu, inc creating custom dashboards
matt-aitken Feb 2, 2026
114b9f0
Add query table/chart to custom dashboard
matt-aitken Feb 2, 2026
1ad46db
Editing and saving layouts working
matt-aitken Feb 2, 2026
d548acb
Cancel button reverts the layout
matt-aitken Feb 2, 2026
d93dd0e
SideMenu section for Metrics
matt-aitken Feb 2, 2026
e1554e3
Fix for side menu collapsible bg
matt-aitken Feb 2, 2026
181f397
Drag and resize without edit mode
matt-aitken Feb 4, 2026
e33af40
Delete dashboard implemented
matt-aitken Feb 4, 2026
9572762
Rename dashboard
matt-aitken Feb 4, 2026
9835df9
Separate components for rename/delete
matt-aitken Feb 4, 2026
b6210ab
Metric add/edit chart
matt-aitken Feb 4, 2026
4bec682
The data now gets passed through
matt-aitken Feb 4, 2026
bd15a33
Side menu collapsing improved
matt-aitken Feb 4, 2026
3d30683
Query add/edit from Metrics is a Sheet
matt-aitken Feb 4, 2026
b41e34e
Padding improvements
matt-aitken Feb 4, 2026
2ae0d21
More work on editing/saving
matt-aitken Feb 4, 2026
012ed25
New revalidate
matt-aitken Feb 5, 2026
a6074fe
Added duplication and working on fixes
matt-aitken Feb 5, 2026
0601b9c
Consolidate to a single resource route
matt-aitken Feb 5, 2026
021137b
Change to a sync for metrics changes
matt-aitken Feb 5, 2026
de4a52e
Reload widget when the query changes
matt-aitken Feb 5, 2026
0042ae2
Fix for duplicated widgets updating improperly
matt-aitken Feb 5, 2026
4663a57
Renaming widgets
matt-aitken Feb 5, 2026
fc03d07
Added filters to metrics
matt-aitken Feb 5, 2026
9846f91
Side menu: Metrics -> Insights
matt-aitken Feb 5, 2026
8ed37cb
Fixed wiget popover width
matt-aitken Feb 5, 2026
c594488
Fix TSQL fallback expression missing "in" operator support
samejr Feb 5, 2026
0efe7c6
@trigger.dev/platform@1.0.23
matt-aitken Feb 5, 2026
13be301
Brighter + button to add a dashboard
samejr Feb 5, 2026
eb65ecc
Differentiated icon colors for the insights section
samejr Feb 5, 2026
377aa5d
Nice left padding
samejr Feb 5, 2026
6f95060
Nicer padding
samejr Feb 5, 2026
e7c7587
Adds rename dashboard to the triple dot menu
samejr Feb 5, 2026
c489d76
Add secondary variant style to the triple dot menu
samejr Feb 5, 2026
b851271
Adds a classname to override the value in the filters
samejr Feb 5, 2026
c5b8292
Default wider task and queues popovers
samejr Feb 5, 2026
304027d
Added limits
matt-aitken Feb 5, 2026
d95ce79
Improved save layout
matt-aitken Feb 5, 2026
3a4c75f
Moves the add new dashboard button to the Metrics side menu item
samejr Feb 5, 2026
91165aa
Removed `any` from limits
matt-aitken Feb 5, 2026
cdb7536
New metrics side menu icon colors
samejr Feb 5, 2026
69bf807
Fix tailwind config error
samejr Feb 6, 2026
56c2cc4
Adds connector lines for the custom dashboard icons
samejr Feb 6, 2026
42f3749
Icon colour improvements
samejr Feb 6, 2026
5d96604
Reorderable custom dashboards
samejr Feb 6, 2026
15a3a32
Fixes the side menu collapsing animation for Metrics items
samejr Feb 6, 2026
2ace598
Smoother side menu item transition when expanding
samejr Feb 6, 2026
dc25552
Update the connector type on drag
samejr Feb 6, 2026
30ac4ac
Improve the upgrade dashboard modal
samejr Feb 6, 2026
c504c2f
Reorder hoverstate style tweak
samejr Feb 6, 2026
2bc14b3
Click anywhere on the side menu header to collapse it
samejr Feb 6, 2026
1a3a5ba
Prevent text selection when reordering side menu items
samejr Feb 6, 2026
f3051cd
Improved the delete dashboard modal
samejr Feb 6, 2026
685c53a
Add a nice blank state for the custom dashboard
samejr Feb 6, 2026
785a747
Fix edit menu items on a widget
samejr Feb 6, 2026
a517781
Consistent button text
samejr Feb 6, 2026
2014ba4
Make sure the height of the edit query page is 100%
samejr Feb 6, 2026
a6e0694
icon improvements
samejr Feb 6, 2026
56b5960
Consistent icons
samejr Feb 7, 2026
c14cac1
Refactored the reordering so we can reuse it
matt-aitken Feb 8, 2026
f8636a7
WIP adding BigNumber chart type
matt-aitken Feb 8, 2026
8d63e27
Improved BigNumber config and styling
matt-aitken Feb 8, 2026
d407594
Auto-fit for BigNumber
matt-aitken Feb 8, 2026
0a82d0d
Fix for useFetcher errors bubbling up to the web inspector
matt-aitken Feb 9, 2026
ade776e
Added a title widget type and the ability to add them
matt-aitken Feb 9, 2026
9776c53
Fix for duplicating widget id clash
matt-aitken Feb 9, 2026
4d0648a
Rounded corners for the Sheet
samejr Feb 9, 2026
56d8212
Remove Beta badge
samejr Feb 9, 2026
f2b4f88
Fixed history popover scrolling + improved the styling
samejr Feb 9, 2026
a1db285
Nicer query blank state
samejr Feb 9, 2026
6e2154e
Match the AI example query buttons with the AskAI examples
samejr Feb 9, 2026
7f82c91
Use ellipsis
samejr Feb 9, 2026
fdcfa74
Style updates and remove the tool call displaying in the UI
samejr Feb 9, 2026
aaaedc3
Fix rounded corners on the AI query panel
samejr Feb 9, 2026
35402e4
Fixed rounded corners for the AI query panel
samejr Feb 9, 2026
1264a0f
WIP for adding timeBucket() function for auto-bin
matt-aitken Feb 9, 2026
8876c15
Time bucketing using auto bins working
matt-aitken Feb 10, 2026
6159016
Improved alias matching case insensitivity
matt-aitken Feb 10, 2026
55c30a1
Prevent text selection when resizing or dragging
matt-aitken Feb 10, 2026
dbd685c
Fix for typecheck issues
matt-aitken Feb 10, 2026
45abb38
NIcer icons for add chart or text
samejr Feb 10, 2026
109055b
Prevent tooltips from collapsing the child when `isChild` is used
samejr Feb 10, 2026
0344755
Fixes the date/time button not showing the tooltip or icon
samejr Feb 10, 2026
c5d3853
Show the ResizableHandle horizontal hover line on top of the triple dots
samejr Feb 10, 2026
5747a80
Remove TS go from settings, users can set it individually
matt-aitken Feb 10, 2026
20293a0
Adds shortcut key to Cancel buttons
samejr Feb 10, 2026
f35a333
Date Time filters have secondary style cancel button for consistency
samejr Feb 10, 2026
07d8977
text-bright for the Scope filters
samejr Feb 10, 2026
c117398
Nicer behaviour when the example prompts container scales down
samejr Feb 10, 2026
df470b4
Only show the loading state when there's not data already
matt-aitken Feb 10, 2026
7e0603e
Unify button text and style
samejr Feb 10, 2026
30ab468
Consistent button revealing on the widgets
samejr Feb 10, 2026
7f09b0b
More consistent button reveals
samejr Feb 10, 2026
2094ae4
asChild fix
samejr Feb 10, 2026
17451c0
Improves the add to dashboard modal
samejr Feb 10, 2026
b67744b
Unify the Add to dashboard buttons
samejr Feb 10, 2026
ec98f75
Unify the add to dashboard buttons
samejr Feb 10, 2026
768d1c8
Filter button to secondary style
samejr Feb 10, 2026
b955dad
Fix for displaying the Maximise tooltip
samejr Feb 10, 2026
e75900c
For time-based graphs show the full time range from the filter
matt-aitken Feb 10, 2026
f0fd5b3
Chart legend: fixed the height of view more/hidden elements
matt-aitken Feb 10, 2026
9db0385
Improved the date granularity and rendering with ticks
matt-aitken Feb 10, 2026
e83a848
Minimal buttons for Export and Pretty formatting
samejr Feb 10, 2026
0e89ad5
nicer basic TRQL table styling
samejr Feb 10, 2026
999a2fa
asChild fix
samejr Feb 10, 2026
08f7ba4
Table header padding increase
samejr Feb 10, 2026
771ae67
Fix for when there are densely packed values
matt-aitken Feb 10, 2026
99e83b1
Improved the angled label renderer so they don't get cut off and we g…
matt-aitken Feb 10, 2026
70b8d55
Fix for a weird off-by-1px table row visual bug
samejr Feb 10, 2026
7a9280d
Display tables at the top of the full screen dialogue
samejr Feb 10, 2026
6c272e7
Fix for showing the last table row divider
samejr Feb 10, 2026
1b4f373
Icon hover state tweaks
samejr Feb 10, 2026
0557b23
Color fix for the triple dot ellipsis button
samejr Feb 11, 2026
38cb9b1
Rounded corners for the ghost widget when resizing or moving
samejr Feb 11, 2026
af739c5
Better resize icon
samejr Feb 11, 2026
1f939be
Reveal table header functions on hover
samejr Feb 11, 2026
9527648
Padding tweak
samejr Feb 11, 2026
32b591a
Wording consistency
samejr Feb 11, 2026
0f242ea
Table header tweak
samejr Feb 11, 2026
635b576
Icon alignment fix
samejr Feb 11, 2026
eeed291
Tooltip behaviour and hover state behaviour improvements
samejr Feb 11, 2026
29c6e35
Use ellipsis
samejr Feb 11, 2026
191a698
Nicer padding for buttons in query editor
samejr Feb 11, 2026
3dd6fea
Fixes mismatched height when toggling between pretty and non-pretty t…
samejr Feb 11, 2026
a16ed9a
Chart fullscreen legend shows all items and is scrollable
matt-aitken Feb 11, 2026
fe93b6d
Customizable series colours. Automatic status colours
matt-aitken Feb 11, 2026
d2f0825
Adds dashboard and query limits to the Limits page
samejr Feb 11, 2026
b0fea40
Improved messaging for upgrading number of dashboards
samejr Feb 11, 2026
2f53e84
New dashboard and query limits added to pricing plans
samejr Feb 11, 2026
4b82df8
Use type only import
samejr Feb 11, 2026
110fc1c
Built in dashboard widgets added
matt-aitken Feb 11, 2026
632690e
Hopefully nicer task run chart colors
samejr Feb 11, 2026
dd2199f
Hover states for the bar and line charts
samejr Feb 11, 2026
ea832f5
Fix some useInterval issues
matt-aitken Feb 11, 2026
2b8b748
Protect against multiple updates to a dashboard at once
matt-aitken Feb 11, 2026
1b4b06d
Side menu dragging fix for failed json parsing
matt-aitken Feb 11, 2026
adff8db
Allow metric dashboards to have no owner, in case the user gets deleted
matt-aitken Feb 11, 2026
fd6ab3f
QueryWidget chart gets isLoading
matt-aitken Feb 11, 2026
cd15d51
Parse the scope from the URL
matt-aitken Feb 11, 2026
d7260ca
fix for divide by zero
matt-aitken Feb 11, 2026
0312aeb
Fix for error not propagating (but only if there's no response)
matt-aitken Feb 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,5 @@
"packages/cli-v3/e2e": true
},
"vitest.disableWorkspaceWarning": true,
"typescript.experimental.useTsgo": true,
"chat.agent.maxRequests": 10000
}
29 changes: 29 additions & 0 deletions apps/webapp/app/components/AlphaBadge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,32 @@ export function AlphaTitle({ children }: { children: React.ReactNode }) {
</>
);
}

export function BetaBadge({
inline = false,
className,
}: {
inline?: boolean;
className?: string;
}) {
return (
<SimpleTooltip
button={
<Badge variant="extra-small" className={cn(inline ? "inline-grid" : "", className)}>
Beta
</Badge>
}
content="This feature is in Beta."
disableHoverableContent
/>
);
}

export function BetaTitle({ children }: { children: React.ReactNode }) {
return (
<>
<span>{children}</span>
<BetaBadge />
</>
);
}
149 changes: 65 additions & 84 deletions apps/webapp/app/components/code/AIQueryInput.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
import { PencilSquareIcon, PlusIcon, SparklesIcon } from "@heroicons/react/20/solid";
import { CheckIcon, PencilSquareIcon, PlusIcon, XMarkIcon } from "@heroicons/react/20/solid";
import { AnimatePresence, motion } from "framer-motion";
import { Suspense, lazy, useCallback, useEffect, useRef, useState } from "react";
import { AISparkleIcon } from "~/assets/icons/AISparkleIcon";
import { Button } from "~/components/primitives/Buttons";
import { Spinner } from "~/components/primitives/Spinner";
import { useEnvironment } from "~/hooks/useEnvironment";
import { useOrganization } from "~/hooks/useOrganizations";
import { useProject } from "~/hooks/useProject";
import type { AITimeFilter } from "~/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.query/types";
import { cn } from "~/utils/cn";

// Lazy load streamdown components to avoid SSR issues
const StreamdownRenderer = lazy(() =>
Expand All @@ -13,13 +19,6 @@ const StreamdownRenderer = lazy(() =>
),
}))
);
import { Button } from "~/components/primitives/Buttons";
import { Spinner } from "~/components/primitives/Spinner";
import { useEnvironment } from "~/hooks/useEnvironment";
import { useOrganization } from "~/hooks/useOrganizations";
import { useProject } from "~/hooks/useProject";
import type { AITimeFilter } from "~/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.query/types";
import { cn } from "~/utils/cn";

type StreamEventType =
| { type: "thinking"; content: string }
Expand Down Expand Up @@ -179,21 +178,7 @@ export function AIQueryInput({
setThinking((prev) => prev + event.content);
break;
case "tool_call":
if (event.tool === "setTimeFilter") {
setThinking((prev) => {
if (prev.trimEnd().endsWith("Setting time filter...")) {
return prev;
}
return prev + `\nSetting time filter...\n`;
});
} else {
setThinking((prev) => {
if (prev.trimEnd().endsWith("Validating query...")) {
return prev;
}
return prev + `\nValidating query...\n`;
});
}
// Tool calls are handled silently — no UI text needed
break;
case "time_filter":
// Apply time filter immediately when the AI sets it
Expand Down Expand Up @@ -262,13 +247,13 @@ export function AIQueryInput({
}, [error]);

return (
<div className="flex flex-col gap-3">
<div className="flex flex-col">
{/* Gradient border wrapper like the schedules AI input */}
<div
className="rounded-md p-px"
className="overflow-hidden rounded-md p-px"
style={{ background: "linear-gradient(to bottom right, #E543FF, #286399)" }}
>
<div className="overflow-hidden rounded-[5px] bg-background-bright">
<div className="overflow-hidden rounded-md bg-background-bright">
<form onSubmit={handleSubmit}>
<textarea
ref={textareaRef}
Expand Down Expand Up @@ -297,10 +282,10 @@ export function AIQueryInput({
variant="tertiary/small"
disabled={true}
LeadingIcon={Spinner}
className="pl-1.5"
className="pl-2"
iconSpacing="gap-1.5"
>
{mode === "edit" ? "Editing..." : "Generating..."}
{mode === "edit" ? "Editing" : "Generating"}
</Button>
) : (
<>
Expand Down Expand Up @@ -366,64 +351,60 @@ export function AIQueryInput({
transition={{ duration: 0.2 }}
className="overflow-hidden"
>
<div className="rounded-md border border-grid-dimmed bg-charcoal-850 p-3">
<div className="mb-2 flex items-center justify-between">
<div className="flex items-center gap-2">
{isLoading ? (
<Spinner
color={{
background: "rgba(99, 102, 241, 0.3)",
foreground: "rgba(99, 102, 241, 1)",
}}
className="size-3"
/>
) : lastResult === "success" ? (
<div className="size-3 rounded-full bg-success" />
) : lastResult === "error" ? (
<div className="size-3 rounded-full bg-error" />
) : null}
<span className="text-xs font-medium text-text-dimmed">
{isLoading
? "AI is thinking..."
: lastResult === "success"
<div className="px-1">
<div className="rounded-b-lg border-x border-b border-grid-dimmed bg-charcoal-850 p-3 pb-1">
<div className="mb-1 flex items-center justify-between">
<div className="flex items-center gap-1">
{isLoading ? (
<Spinner className="size-4" />
) : lastResult === "success" ? (
<CheckIcon className="size-4 text-success" />
) : lastResult === "error" ? (
<XMarkIcon className="size-4 text-error" />
) : null}
<span className="text-xs font-medium text-text-dimmed">
{isLoading
? "AI is thinking…"
: lastResult === "success"
? "Query generated"
: lastResult === "error"
? "Generation failed"
: "AI response"}
</span>
? "Generation failed"
: "AI response"}
</span>
</div>
{isLoading ? (
<Button
variant="minimal/small"
onClick={() => {
if (abortControllerRef.current) {
abortControllerRef.current.abort();
}
setIsLoading(false);
setShowThinking(false);
setThinking("");
}}
className="text-xs"
>
Cancel
</Button>
) : (
<Button
variant="minimal/small"
onClick={() => {
setShowThinking(false);
setThinking("");
}}
className="text-xs"
>
Dismiss
</Button>
)}
</div>
<div className="streamdown-container max-h-96 overflow-y-auto text-xs text-text-dimmed scrollbar-thin scrollbar-track-transparent scrollbar-thumb-charcoal-600">
<Suspense fallback={<p className="whitespace-pre-wrap">{thinking}</p>}>
<StreamdownRenderer isAnimating={isLoading}>{thinking}</StreamdownRenderer>
</Suspense>
</div>
{isLoading ? (
<Button
variant="minimal/small"
onClick={() => {
if (abortControllerRef.current) {
abortControllerRef.current.abort();
}
setIsLoading(false);
setShowThinking(false);
setThinking("");
}}
className="text-xs"
>
Cancel
</Button>
) : (
<Button
variant="minimal/small"
onClick={() => {
setShowThinking(false);
setThinking("");
}}
className="text-xs"
>
Dismiss
</Button>
)}
</div>
<div className="streamdown-container max-h-96 overflow-y-auto text-xs text-text-dimmed scrollbar-thin scrollbar-track-transparent scrollbar-thumb-charcoal-600">
<Suspense fallback={<p className="whitespace-pre-wrap">{thinking}</p>}>
<StreamdownRenderer isAnimating={isLoading}>{thinking}</StreamdownRenderer>
</Suspense>
</div>
</div>
</motion.div>
Expand Down
Loading