Skip to content

feat(dashboards): add MCP tools to create and edit text tiles#59933

Merged
andrewm4894 merged 9 commits into
masterfrom
posthog-code/dashboard-text-tile-mcp-tools
May 28, 2026
Merged

feat(dashboards): add MCP tools to create and edit text tiles#59933
andrewm4894 merged 9 commits into
masterfrom
posthog-code/dashboard-text-tile-mcp-tools

Conversation

@andrewm4894
Copy link
Copy Markdown
Member

Problem

PostHog dashboards support text tiles (markdown blocks used as section headings, dividers, and annotations) but the MCP surface only exposed insight-tile workflows. Agents had no way to add structure to a dashboard they were building.

Today, the only path to create or update a text tile via the API is a deeply nested PATCH /dashboards/:id/ payload with a tiles: [{ text: { body: ... }, ... }] array. That shape is awkward to expose to an LLM through dashboard-update, both because the schema is complex and because the same tool then has to multiplex tile mutations against dashboard-level edits.

Refs #58307

Changes

Adds two dedicated viewset actions on DashboardsViewSet and matching MCP tool entries:

  • POST /dashboards/:id/create_text_tile/dashboard-create-text-tile
    Body: { body: string, layouts?: { sm?, xs? }, color? }. Creates a Text row and a DashboardTile referencing it, scoped to the dashboard's team. Returns a DashboardTileSerializer (tile-scoped, not the whole dashboard).
  • PATCH /dashboards/:id/update_text_tile/dashboard-update-text-tile
    Body: { tile_id: int, body?, layouts?, color? }. Updates only the fields that are passed (omitted fields are preserved), and bumps last_modified_by/last_modified_at. Refuses non-text tiles with a 400.

Both actions are guarded by dashboard:write scope, check can_edit on the dashboard, return 404 for deleted dashboards, and run the text + tile writes inside a single transaction. Returning a single tile (rather than the whole dashboard) keeps the LLM context footprint small.

The new request serializers are typed end-to-end — TileLayoutBoxSerializer and TileLayoutsSerializer give the generated OpenAPI / Zod / MCP schemas a typed layouts shape instead of a JSONField.

Deletion is intentionally not a new tool: dashboard-update already handles { tiles: [{ id, deleted: true }] }, so a separate tool would be redundant surface area.

How did you test this code?

I'm an agent (Claude Code via the PostHog Code agent). I ran:

  • ruff check and ruff format on the changed Python files — clean
  • YAML parse check on products/dashboards/mcp/tools.yaml — valid, both new tool entries resolve to the expected operation IDs (dashboards_create_text_tile_create, dashboards_update_text_tile_partial_update)

Added new unit tests under posthog/api/test/dashboards/test_dashboard.py:

  • test_create_text_tile_adds_markdown_tile_to_dashboard
  • test_create_text_tile_without_layouts_uses_default
  • test_create_text_tile_rejects_empty_body
  • test_create_text_tile_rejects_body_over_4000_chars
  • test_create_text_tile_on_deleted_dashboard_returns_404
  • test_update_text_tile_updates_body_and_layout
  • test_update_text_tile_leaves_omitted_fields_unchanged
  • test_update_text_tile_rejects_insight_tile
  • test_update_text_tile_with_unknown_id_returns_404
  • test_update_text_tile_on_other_dashboard_returns_404

I did not run the Django/pytest suite locally (the cloud agent environment didn't have a working Python venv pinned to 3.12.12); CI will run the full backend suite plus build:openapi to verify the generated MCP/Zod schemas.

Publish to changelog?

Yes — agents can now structure dashboards they create with markdown section tiles via the MCP.

Docs update

No new user-facing docs needed; the MCP tool descriptions are self-documenting and inherited by the generated tool list.

🤖 Agent context

Authored by Claude (PostHog Code agent).

Design decisions:

  • Dedicated viewset actions over dashboard-update param overrides. The existing dashboards_partial_update path supports text-tile mutations, but exposing the nested tiles[].text.body shape to an LLM via param_overrides would have required hand-writing a Zod schema. Two small, single-purpose endpoints match the existing tile-action precedent (copy_tile, move_tile, reorder_tiles) and yield clean, atomic MCP tools.
  • Return a single tile, not the whole dashboard. Existing tile actions (copy_tile, reorder_tiles) return the entire DashboardSerializer. For text-tile changes that's overkill — returning DashboardTileSerializer keeps the response small for the LLM and the human alike.
  • Typed layouts serializer. JSONField would have produced Record<string, unknown> in the generated types. The typed TileLayoutBoxSerializer / TileLayoutsSerializer give callers a real schema with field-level help_text.
  • No new delete tool. Soft-delete already works through dashboard-update with {tiles: [{id, deleted: true}]}.
  • update_text_tile rejects insight tiles with a 400 rather than silently doing nothing, since a wrong tile_id is far more likely an agent mistake worth surfacing than a desired no-op.

Created with PostHog Code

@andrewm4894 andrewm4894 marked this pull request as ready for review May 25, 2026 16:48
@andrewm4894 andrewm4894 self-assigned this May 25, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 25, 2026

🎭 Playwright didn't run on this PR — your changes touch code that could affect E2E behavior, but Playwright is opt-in via label now to keep CI cost down.

Add the run-playwright label if you want an E2E sweep before merging — CI will pick it up automatically.

Most PRs don't need this. Real regressions still get caught on master and fix-forward.

@assign-reviewers-posthog assign-reviewers-posthog Bot requested review from a team May 25, 2026 16:48
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 25, 2026

MCP UI Apps size report

App JS CSS
debug 474.9 KB 139.9 KB
action 349.4 KB 139.9 KB
action-list 357.2 KB 139.9 KB
cohort 348.5 KB 139.9 KB
cohort-list 356.2 KB 139.9 KB
error-details 369.9 KB 139.9 KB
error-issue 349.2 KB 139.9 KB
error-issue-list 357.2 KB 139.9 KB
experiment 353.7 KB 139.9 KB
experiment-list 358.0 KB 139.9 KB
experiment-results 355.8 KB 139.9 KB
feature-flag 434.3 KB 139.9 KB
feature-flag-list 438.8 KB 139.9 KB
feature-flag-testing 427.2 KB 139.9 KB
insight-actors 352.3 KB 139.9 KB
llm-costs 351.9 KB 139.9 KB
session-recording 350.2 KB 139.9 KB
session-summary 356.2 KB 139.9 KB
survey 350.0 KB 139.9 KB
survey-global-stats 354.8 KB 139.9 KB
survey-list 357.9 KB 139.9 KB
survey-stats 354.8 KB 139.9 KB
trace-span 348.8 KB 139.9 KB
trace-span-list 357.1 KB 139.9 KB
workflow 348.8 KB 139.9 KB
workflow-list 356.6 KB 139.9 KB
query-results 370.6 KB 139.9 KB
visual-review-snapshots 353.5 KB 139.9 KB

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 25, 2026

Prompt To Fix All With AI
Fix the following 2 code review issues. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 2
products/dashboards/backend/api/dashboard.py:220-227
The `body` field in `UpdateTextTileRequestSerializer` accepts both `null` and empty string (`allow_null=True, allow_blank=True`), which means a caller can PATCH `body: ""` or `body: null` and the handler will set `text.body` to `""` or `None`. Since `Text.body` is `null=True, blank=True` in the model, the write will succeed — silently clearing the tile's content. The create endpoint rejects this with `allow_blank=False`; the update should do the same.

```suggestion
    body = serializers.CharField(
        max_length=4000,
        required=False,
        allow_blank=False,
        help_text="New markdown body for the text tile. Omit to leave the body unchanged. Max 4000 characters.",
        error_messages={"max_length": "Text body cannot exceed 4000 characters"},
    )
```

### Issue 2 of 2
posthog/api/test/dashboards/test_dashboard.py:3280-3310
**Prefer parameterised tests for related rejection/404 cases**

`test_create_text_tile_rejects_empty_body` and `test_create_text_tile_rejects_body_over_4000_chars` both POST to the same endpoint and assert the same HTTP 400, differing only in the `body` value — a natural fit for a single `@pytest.mark.parametrize` / `subTest` loop. The same applies to `test_update_text_tile_with_unknown_id_returns_404` and `test_update_text_tile_on_other_dashboard_returns_404`. Repo conventions prefer parameterised tests over duplicated method bodies for scenarios that vary only in inputs.

Reviews (1): Last reviewed commit: "feat(dashboards): add create/update text..." | Re-trigger Greptile

Comment on lines +220 to +227
body = serializers.CharField(
max_length=4000,
required=False,
allow_null=True,
allow_blank=True,
help_text="New markdown body for the text tile. Omit to leave the body unchanged. Max 4000 characters.",
error_messages={"max_length": "Text body cannot exceed 4000 characters"},
)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 The body field in UpdateTextTileRequestSerializer accepts both null and empty string (allow_null=True, allow_blank=True), which means a caller can PATCH body: "" or body: null and the handler will set text.body to "" or None. Since Text.body is null=True, blank=True in the model, the write will succeed — silently clearing the tile's content. The create endpoint rejects this with allow_blank=False; the update should do the same.

Suggested change
body = serializers.CharField(
max_length=4000,
required=False,
allow_null=True,
allow_blank=True,
help_text="New markdown body for the text tile. Omit to leave the body unchanged. Max 4000 characters.",
error_messages={"max_length": "Text body cannot exceed 4000 characters"},
)
body = serializers.CharField(
max_length=4000,
required=False,
allow_blank=False,
help_text="New markdown body for the text tile. Omit to leave the body unchanged. Max 4000 characters.",
error_messages={"max_length": "Text body cannot exceed 4000 characters"},
)
Prompt To Fix With AI
This is a comment left during a code review.
Path: products/dashboards/backend/api/dashboard.py
Line: 220-227

Comment:
The `body` field in `UpdateTextTileRequestSerializer` accepts both `null` and empty string (`allow_null=True, allow_blank=True`), which means a caller can PATCH `body: ""` or `body: null` and the handler will set `text.body` to `""` or `None`. Since `Text.body` is `null=True, blank=True` in the model, the write will succeed — silently clearing the tile's content. The create endpoint rejects this with `allow_blank=False`; the update should do the same.

```suggestion
    body = serializers.CharField(
        max_length=4000,
        required=False,
        allow_blank=False,
        help_text="New markdown body for the text tile. Omit to leave the body unchanged. Max 4000 characters.",
        error_messages={"max_length": "Text body cannot exceed 4000 characters"},
    )
```

How can I resolve this? If you propose a fix, please make it concise.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Already addressed — body is now allow_null=False, allow_blank=False, min_length=1 in UpdateTextTileRequestSerializer (products/dashboards/backend/api/dashboard.py:233-244), and test_update_text_tile_rejects_empty_or_null_body is parameterized over both None and "".

Comment on lines +3280 to +3310
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(response.json()["text"]["body"], "Just a divider")

def test_create_text_tile_rejects_empty_body(self):
dashboard = Dashboard.objects.create(team=self.team, name="Test Dashboard")

response = self.client.post(
f"/api/environments/{self.team.pk}/dashboards/{dashboard.pk}/create_text_tile/",
{"body": ""},
content_type="application/json",
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

def test_create_text_tile_rejects_body_over_4000_chars(self):
dashboard = Dashboard.objects.create(team=self.team, name="Test Dashboard")

response = self.client.post(
f"/api/environments/{self.team.pk}/dashboards/{dashboard.pk}/create_text_tile/",
{"body": "x" * 4001},
content_type="application/json",
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

def test_create_text_tile_on_deleted_dashboard_returns_404(self):
dashboard = Dashboard.objects.create(team=self.team, name="Test Dashboard", deleted=True)

response = self.client.post(
f"/api/environments/{self.team.pk}/dashboards/{dashboard.pk}/create_text_tile/",
{"body": "Some text"},
content_type="application/json",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Prefer parameterised tests for related rejection/404 cases

test_create_text_tile_rejects_empty_body and test_create_text_tile_rejects_body_over_4000_chars both POST to the same endpoint and assert the same HTTP 400, differing only in the body value — a natural fit for a single @pytest.mark.parametrize / subTest loop. The same applies to test_update_text_tile_with_unknown_id_returns_404 and test_update_text_tile_on_other_dashboard_returns_404. Repo conventions prefer parameterised tests over duplicated method bodies for scenarios that vary only in inputs.

Prompt To Fix With AI
This is a comment left during a code review.
Path: posthog/api/test/dashboards/test_dashboard.py
Line: 3280-3310

Comment:
**Prefer parameterised tests for related rejection/404 cases**

`test_create_text_tile_rejects_empty_body` and `test_create_text_tile_rejects_body_over_4000_chars` both POST to the same endpoint and assert the same HTTP 400, differing only in the `body` value — a natural fit for a single `@pytest.mark.parametrize` / `subTest` loop. The same applies to `test_update_text_tile_with_unknown_id_returns_404` and `test_update_text_tile_on_other_dashboard_returns_404`. Repo conventions prefer parameterised tests over duplicated method bodies for scenarios that vary only in inputs.

How can I resolve this? If you propose a fix, please make it concise.

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!

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Done — both rejection groups now use @parameterized.expand: test_create_text_tile_rejects_invalid_body covers empty + over_max_length, and test_update_text_tile_rejects_empty_or_null_body covers null + empty. The two 404 paths share fixtures via _make_unknown_tile_id_args + subTest because parameterized.expand runs at class-construction time and can't reach DB-created fixtures.

Copy link
Copy Markdown

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

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: bfc5002256

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

Comment on lines +207 to +211
color = serializers.CharField(
required=False,
allow_null=True,
allow_blank=True,
help_text="Optional accent color name (e.g. 'blue', 'green', 'purple', 'black').",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Enforce color length in text-tile request serializers

The new text-tile endpoints accept color via plain CharField without a max_length, but DashboardTile.color is limited to 400 chars at the model/database layer. A request with an oversized color will pass serializer validation and fail only during save (in both create and update paths), causing a server error instead of a clean 4xx validation response. Add max_length=400 (and matching error message) to these request fields so invalid payloads are rejected before hitting the DB.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Already addressed — both CreateTextTileRequestSerializer and UpdateTextTileRequestSerializer set max_length=400 on color with a matching error_messages entry (products/dashboards/backend/api/dashboard.py:200-207 and :251-257).

Comment thread products/dashboards/backend/api/dashboard.py Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 25, 2026

Size Change: 0 B

Total Size: 80.6 MB

ℹ️ View Unchanged
Filename Size
frontend/dist-report/decompression-worker/src/scenes/session-recordings/player/snapshot-processing/decompressionWorker 2.85 kB
frontend/dist-report/exporter/_chunks/chunk 8.41 MB
frontend/dist-report/exporter/_parent/products/actions/frontend/pages/Action 24.9 kB
frontend/dist-report/exporter/_parent/products/actions/frontend/pages/Actions 1.3 kB
frontend/dist-report/exporter/_parent/products/business_knowledge/frontend/scenes/BusinessKnowledgeScene 19 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/Assignee/CyclotronJobInputAssignee 1.64 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/SlaBusinessHours/CyclotronJobInputBusinessHours 3.02 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/TicketTags/CyclotronJobInputTicketTags 1.02 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/settings/SupportSettingsScene 1.78 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/ticket/SupportTicketScene 33.9 kB
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/tickets/SupportTicketsScene 1.04 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/CustomerAnalyticsScene 39.2 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerAnalyticsConfigurationScene/CustomerAnalyticsConfigurationScene 2.61 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyBuilderScene/CustomerJourneyBuilderScene 2.15 kB
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyTemplatesScene/CustomerJourneyTemplatesScene 7.83 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/DataWarehouseScene 46.8 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene 1.08 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SchemaScene/SchemaScene 24 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SourceScene/SourceScene 1.03 kB
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SourcesScene/SourcesScene 6.27 kB
frontend/dist-report/exporter/_parent/products/deployments/frontend/Deployment 4.02 kB
frontend/dist-report/exporter/_parent/products/deployments/frontend/DeploymentProject 5.54 kB
frontend/dist-report/exporter/_parent/products/deployments/frontend/Deployments 9.28 kB
frontend/dist-report/exporter/_parent/products/early_access_features/frontend/EarlyAccessFeature 991 B
frontend/dist-report/exporter/_parent/products/early_access_features/frontend/EarlyAccessFeatures 3.21 kB
frontend/dist-report/exporter/_parent/products/endpoints/frontend/EndpointScene 40.6 kB
frontend/dist-report/exporter/_parent/products/endpoints/frontend/EndpointsScene 24.5 kB
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingFingerprintsScene/ErrorTrackingIssueFingerprintsScene 7.37 kB
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingIssueScene/ErrorTrackingIssueScene 102 kB
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingScene/ErrorTrackingScene 27.1 kB
frontend/dist-report/exporter/_parent/products/feature_flags/frontend/FeatureFlagTemplatesScene 7.35 kB
frontend/dist-report/exporter/_parent/products/games/368Hedgehogs/368Hedgehogs 5.58 kB
frontend/dist-report/exporter/_parent/products/games/FlappyHog/FlappyHog 6.09 kB
frontend/dist-report/exporter/_parent/products/legal_documents/frontend/scenes/LegalDocumentNewScene 59.7 kB
frontend/dist-report/exporter/_parent/products/legal_documents/frontend/scenes/LegalDocumentsScene 5.28 kB
frontend/dist-report/exporter/_parent/products/links/frontend/LinkScene 25.2 kB
frontend/dist-report/exporter/_parent/products/links/frontend/LinksScene 4.51 kB
frontend/dist-report/exporter/_parent/products/live_debugger/frontend/LiveDebugger 19.4 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/clusters/LLMAnalyticsClusterScene 21.6 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/clusters/LLMAnalyticsClustersScene 55 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/datasets/LLMAnalyticsDatasetScene 20.9 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/datasets/LLMAnalyticsDatasetsScene 3.6 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/evaluations/EvaluationTemplates 881 B
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/evaluations/LLMAnalyticsEvaluation 59.8 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/evaluations/LLMAnalyticsEvaluationsScene 28.1 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/LLMAnalyticsScene 118 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/LLMAnalyticsSessionScene 16.7 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/LLMAnalyticsTraceScene 130 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/LLMAnalyticsUsers 832 B
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/LLMASessionFeedbackDisplay 5.15 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/playground/LLMAnalyticsPlaygroundScene 37.7 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/prompts/LLMPromptScene 29.1 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/prompts/LLMPromptsScene 4.79 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/skills/LLMSkillScene 895 B
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/skills/LLMSkillsScene 912 B
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/tags/LLMAnalyticsTag 27.3 kB
frontend/dist-report/exporter/_parent/products/llm_analytics/frontend/tags/LLMAnalyticsTagsScene 7.26 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/LogsScene 17.8 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsAlertDetailScene/LogsAlertDetailScene 17.3 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsSamplingDetailScene/LogsSamplingDetailScene 5.27 kB
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsSamplingNewScene/LogsSamplingNewScene 2.22 kB
frontend/dist-report/exporter/_parent/products/managed_migrations/frontend/ManagedMigration 14.9 kB
frontend/dist-report/exporter/_parent/products/mcp_analytics/frontend/MCPAnalyticsScene 40.5 kB
frontend/dist-report/exporter/_parent/products/mcp_analytics/frontend/MCPAnalyticsToolDetail 18.5 kB
frontend/dist-report/exporter/_parent/products/metrics/frontend/MetricsScene 1.15 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/StickinessBarChart/StickinessBarChart 3.27 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/StickinessLineChart/StickinessLineChart 3.11 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsBarChart/TrendsBarChart 7.12 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsLifecycleChart/TrendsLifecycleChart 4.21 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsLineChart/TrendsLineChart 4.57 kB
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsPieChart/TrendsPieChart 4.31 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/observations/ReplayObservation 8.13 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ReplayScanner 32.3 kB
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ReplayScannersScene 12.7 kB
frontend/dist-report/exporter/_parent/products/revenue_analytics/frontend/RevenueAnalyticsScene 26.5 kB
frontend/dist-report/exporter/_parent/products/session_summaries/frontend/SessionGroupSummariesTable 5.02 kB
frontend/dist-report/exporter/_parent/products/session_summaries/frontend/SessionGroupSummaryScene 19.2 kB
frontend/dist-report/exporter/_parent/products/tasks/frontend/TaskDetailScene 23.5 kB
frontend/dist-report/exporter/_parent/products/tasks/frontend/TaskTracker 14.6 kB
frontend/dist-report/exporter/_parent/products/tracing/frontend/TracingScene 54.4 kB
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterview 9.28 kB
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterviewResponse 5.64 kB
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterviews 6.04 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewIndexScene 2.52 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewRunScene 44.6 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewRunsScene 7.29 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSettingsScene 11.1 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotHistoryScene 13.9 kB
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotOverviewScene 19.5 kB
frontend/dist-report/exporter/_parent/products/workflows/frontend/TemplateLibrary/MessageTemplate 16.6 kB
frontend/dist-report/exporter/_parent/products/workflows/frontend/Workflows/WorkflowScene 111 kB
frontend/dist-report/exporter/_parent/products/workflows/frontend/WorkflowsScene 60.1 kB
frontend/dist-report/exporter/src/exporter/exporter 19.6 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterDashboardScene 1.99 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterHeatmapScene 19.6 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterInsightScene 2.98 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterInterviewScene 310 kB
frontend/dist-report/exporter/src/exporter/scenes/ExporterNotebookScene 2.71 MB
frontend/dist-report/exporter/src/exporter/scenes/ExporterRecordingScene 1.1 kB
frontend/dist-report/exporter/src/exporterSharedChunkAnchors 1.19 kB
frontend/dist-report/exporter/src/lib/components/Cards/TextCard/TextCardMarkdownEditor 11.3 kB
frontend/dist-report/exporter/src/lib/components/MonacoDiffEditor 471 B
frontend/dist-report/exporter/src/lib/lemon-ui/LemonMarkdown/MermaidDiagram 2.22 kB
frontend/dist-report/exporter/src/lib/lemon-ui/LemonTextArea/LemonTextAreaMarkdown 808 B
frontend/dist-report/exporter/src/lib/lemon-ui/Link/Link 359 B
frontend/dist-report/exporter/src/lib/monaco/CodeEditorInline 798 B
frontend/dist-report/exporter/src/lib/monaco/vimMode 211 kB
frontend/dist-report/exporter/src/lib/ui/Button/ButtonPrimitives 422 B
frontend/dist-report/exporter/src/queries/nodes/WebVitals/WebVitals 7.48 kB
frontend/dist-report/exporter/src/queries/nodes/WebVitals/WebVitalsPathBreakdown 4.05 kB
frontend/dist-report/exporter/src/queries/schema 840 kB
frontend/dist-report/exporter/src/scenes/approvals/changeRequestsLogic 850 B
frontend/dist-report/exporter/src/scenes/authentication/passkeyLogic 790 B
frontend/dist-report/exporter/src/scenes/data-pipelines/event-filtering/EventFilterScene 22.2 kB
frontend/dist-report/exporter/src/scenes/data-pipelines/TransformationsScene 6.51 kB
frontend/dist-report/exporter/src/scenes/insights/views/BoxPlot/BoxPlot 5.35 kB
frontend/dist-report/exporter/src/scenes/insights/views/CalendarHeatMap/CalendarHeatMap 8.81 kB
frontend/dist-report/exporter/src/scenes/insights/views/RegionMap/RegionMap 29.7 kB
frontend/dist-report/exporter/src/scenes/insights/views/WorldMap/WorldMap 1.04 MB
frontend/dist-report/exporter/src/scenes/models/ModelsScene 19 kB
frontend/dist-report/exporter/src/scenes/models/NodeDetailScene 17 kB
frontend/dist-report/monaco-editor-worker/src/lib/monaco/workers/monacoEditorWorker 288 kB
frontend/dist-report/monaco-json-worker/src/lib/monaco/workers/monacoJsonWorker 419 kB
frontend/dist-report/monaco-typescript-worker/src/lib/monaco/workers/monacoTsWorker 7.02 MB
frontend/dist-report/posthog-app/_chunks/chunk 8.61 MB
frontend/dist-report/posthog-app/_parent/products/actions/frontend/pages/Action 25.1 kB
frontend/dist-report/posthog-app/_parent/products/actions/frontend/pages/Actions 1.36 kB
frontend/dist-report/posthog-app/_parent/products/business_knowledge/frontend/scenes/BusinessKnowledgeScene 19 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/Assignee/CyclotronJobInputAssignee 1.67 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/SlaBusinessHours/CyclotronJobInputBusinessHours 3.06 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/TicketTags/CyclotronJobInputTicketTags 1.06 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/settings/SupportSettingsScene 1.82 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/ticket/SupportTicketScene 26.6 kB
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/tickets/SupportTicketsScene 1.07 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/CustomerAnalyticsScene 38 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerAnalyticsConfigurationScene/CustomerAnalyticsConfigurationScene 2.65 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyBuilderScene/CustomerJourneyBuilderScene 2.18 kB
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyTemplatesScene/CustomerJourneyTemplatesScene 7.86 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/DataWarehouseScene 1.78 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene 1.15 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SchemaScene/SchemaScene 24.1 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SourceScene/SourceScene 1.06 kB
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SourcesScene/SourcesScene 6.31 kB
frontend/dist-report/posthog-app/_parent/products/deployments/frontend/Deployment 4.05 kB
frontend/dist-report/posthog-app/_parent/products/deployments/frontend/DeploymentProject 5.58 kB
frontend/dist-report/posthog-app/_parent/products/deployments/frontend/Deployments 9.31 kB
frontend/dist-report/posthog-app/_parent/products/early_access_features/frontend/EarlyAccessFeature 1.16 kB
frontend/dist-report/posthog-app/_parent/products/early_access_features/frontend/EarlyAccessFeatures 3.24 kB
frontend/dist-report/posthog-app/_parent/products/endpoints/frontend/EndpointScene 40.7 kB
frontend/dist-report/posthog-app/_parent/products/endpoints/frontend/EndpointsScene 22.4 kB
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingFingerprintsScene/ErrorTrackingIssueFingerprintsScene 7.44 kB
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingIssueScene/ErrorTrackingIssueScene 101 kB
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingScene/ErrorTrackingScene 27.2 kB
frontend/dist-report/posthog-app/_parent/products/feature_flags/frontend/FeatureFlagTemplatesScene 7.38 kB
frontend/dist-report/posthog-app/_parent/products/games/368Hedgehogs/368Hedgehogs 5.61 kB
frontend/dist-report/posthog-app/_parent/products/games/FlappyHog/FlappyHog 6.12 kB
frontend/dist-report/posthog-app/_parent/products/legal_documents/frontend/scenes/LegalDocumentNewScene 59.7 kB
frontend/dist-report/posthog-app/_parent/products/legal_documents/frontend/scenes/LegalDocumentsScene 5.32 kB
frontend/dist-report/posthog-app/_parent/products/links/frontend/LinkScene 25.2 kB
frontend/dist-report/posthog-app/_parent/products/links/frontend/LinksScene 4.55 kB
frontend/dist-report/posthog-app/_parent/products/live_debugger/frontend/LiveDebugger 19.5 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/clusters/LLMAnalyticsClusterScene 21.7 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/clusters/LLMAnalyticsClustersScene 55 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/datasets/LLMAnalyticsDatasetScene 21 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/datasets/LLMAnalyticsDatasetsScene 3.63 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/evaluations/EvaluationTemplates 915 B
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/evaluations/LLMAnalyticsEvaluation 59.8 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/evaluations/LLMAnalyticsEvaluationsScene 28.1 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/LLMAnalyticsScene 119 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/LLMAnalyticsSessionScene 16.8 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/LLMAnalyticsTraceScene 130 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/LLMAnalyticsUsers 866 B
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/LLMASessionFeedbackDisplay 5.19 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/playground/LLMAnalyticsPlaygroundScene 37.7 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/prompts/LLMPromptScene 29.2 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/prompts/LLMPromptsScene 4.82 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/skills/LLMSkillScene 929 B
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/skills/LLMSkillsScene 946 B
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/tags/LLMAnalyticsTag 27.3 kB
frontend/dist-report/posthog-app/_parent/products/llm_analytics/frontend/tags/LLMAnalyticsTagsScene 7.3 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/LogsScene 17.8 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsAlertDetailScene/LogsAlertDetailScene 17.3 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsSamplingDetailScene/LogsSamplingDetailScene 5.31 kB
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsSamplingNewScene/LogsSamplingNewScene 2.26 kB
frontend/dist-report/posthog-app/_parent/products/managed_migrations/frontend/ManagedMigration 14.9 kB
frontend/dist-report/posthog-app/_parent/products/mcp_analytics/frontend/MCPAnalyticsScene 40.5 kB
frontend/dist-report/posthog-app/_parent/products/mcp_analytics/frontend/MCPAnalyticsToolDetail 18.5 kB
frontend/dist-report/posthog-app/_parent/products/metrics/frontend/MetricsScene 1.18 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/StickinessBarChart/StickinessBarChart 3.31 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/StickinessLineChart/StickinessLineChart 3.14 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsBarChart/TrendsBarChart 7.15 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsLifecycleChart/TrendsLifecycleChart 4.24 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsLineChart/TrendsLineChart 4.6 kB
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsPieChart/TrendsPieChart 4.35 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/observations/ReplayObservation 8.17 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ReplayScanner 32.3 kB
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ReplayScannersScene 12.8 kB
frontend/dist-report/posthog-app/_parent/products/revenue_analytics/frontend/RevenueAnalyticsScene 26.6 kB
frontend/dist-report/posthog-app/_parent/products/session_summaries/frontend/SessionGroupSummariesTable 5.05 kB
frontend/dist-report/posthog-app/_parent/products/session_summaries/frontend/SessionGroupSummaryScene 19.2 kB
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/TaskDetailScene 23.6 kB
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/TaskTracker 14.6 kB
frontend/dist-report/posthog-app/_parent/products/tracing/frontend/TracingScene 54.4 kB
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterview 9.32 kB
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterviewResponse 5.68 kB
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterviews 6.08 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewIndexScene 2.56 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewRunScene 44.7 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewRunsScene 7.32 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSettingsScene 11.1 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotHistoryScene 13.9 kB
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotOverviewScene 19.6 kB
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/TemplateLibrary/MessageTemplate 16.6 kB
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/Workflows/WorkflowScene 104 kB
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/WorkflowsScene 60.2 kB
frontend/dist-report/posthog-app/src/index 61.1 kB
frontend/dist-report/posthog-app/src/layout/panel-layout/ai-first/tabs/NavTabChat 7.16 kB
frontend/dist-report/posthog-app/src/lib/components/Cards/TextCard/TextCardMarkdownEditor 11.3 kB
frontend/dist-report/posthog-app/src/lib/components/MonacoDiffEditor 471 B
frontend/dist-report/posthog-app/src/lib/lemon-ui/LemonMarkdown/MermaidDiagram 2.25 kB
frontend/dist-report/posthog-app/src/lib/lemon-ui/LemonTextArea/LemonTextAreaMarkdown 842 B
frontend/dist-report/posthog-app/src/lib/lemon-ui/Link/Link 359 B
frontend/dist-report/posthog-app/src/lib/monaco/CodeEditorInline 832 B
frontend/dist-report/posthog-app/src/lib/monaco/vimMode 211 kB
frontend/dist-report/posthog-app/src/lib/ui/Button/ButtonPrimitives 426 B
frontend/dist-report/posthog-app/src/queries/nodes/WebVitals/WebVitals 7.52 kB
frontend/dist-report/posthog-app/src/queries/nodes/WebVitals/WebVitalsPathBreakdown 4.09 kB
frontend/dist-report/posthog-app/src/queries/schema 840 kB
frontend/dist-report/posthog-app/src/scenes/activity/explore/EventsScene 3.28 kB
frontend/dist-report/posthog-app/src/scenes/activity/explore/SessionsScene 4.69 kB
frontend/dist-report/posthog-app/src/scenes/activity/live/LiveEventsTable 5.58 kB
frontend/dist-report/posthog-app/src/scenes/agentic/AgenticAuthorize 5.84 kB
frontend/dist-report/posthog-app/src/scenes/approvals/ApprovalDetail 16.6 kB
frontend/dist-report/posthog-app/src/scenes/approvals/changeRequestsLogic 884 B
frontend/dist-report/posthog-app/src/scenes/audit-logs/AdvancedActivityLogsScene 42.1 kB
frontend/dist-report/posthog-app/src/scenes/AuthenticatedShell 170 kB
frontend/dist-report/posthog-app/src/scenes/authentication/AccountConnected 3.33 kB
frontend/dist-report/posthog-app/src/scenes/authentication/AgenticAccountMismatch 2.73 kB
frontend/dist-report/posthog-app/src/scenes/authentication/CLIAuthorize 11.7 kB
frontend/dist-report/posthog-app/src/scenes/authentication/CLILive 4.37 kB
frontend/dist-report/posthog-app/src/scenes/authentication/credential-review/CredentialReview 3.95 kB
frontend/dist-report/posthog-app/src/scenes/authentication/EmailMFAVerify 3.37 kB
frontend/dist-report/posthog-app/src/scenes/authentication/InviteSignup 15.4 kB
frontend/dist-report/posthog-app/src/scenes/authentication/Login 10.2 kB
frontend/dist-report/posthog-app/src/scenes/authentication/Login2FA 4.87 kB
frontend/dist-report/posthog-app/src/scenes/authentication/passkeyLogic 824 B
frontend/dist-report/posthog-app/src/scenes/authentication/PasswordReset 4.71 kB
frontend/dist-report/posthog-app/src/scenes/authentication/PasswordResetComplete 3.34 kB
frontend/dist-report/posthog-app/src/scenes/authentication/signup/SignupContainer 28.5 kB
frontend/dist-report/posthog-app/src/scenes/authentication/signup/verify-email/VerifyEmail 5.13 kB
frontend/dist-report/posthog-app/src/scenes/authentication/TwoFactorReset 4.37 kB
frontend/dist-report/posthog-app/src/scenes/authentication/VercelConnect 5.33 kB
frontend/dist-report/posthog-app/src/scenes/authentication/VercelLinkError 2.61 kB
frontend/dist-report/posthog-app/src/scenes/billing/AuthorizationStatus 1.07 kB
frontend/dist-report/posthog-app/src/scenes/billing/Billing 833 B
frontend/dist-report/posthog-app/src/scenes/billing/BillingSection 21.1 kB
frontend/dist-report/posthog-app/src/scenes/cohorts/Cohort 28.4 kB
frontend/dist-report/posthog-app/src/scenes/cohorts/CohortCalculationHistory 6.58 kB
frontend/dist-report/posthog-app/src/scenes/cohorts/Cohorts 9.78 kB
frontend/dist-report/posthog-app/src/scenes/coupons/Coupons 1.06 kB
frontend/dist-report/posthog-app/src/scenes/dashboard/Dashboard 1.65 kB
frontend/dist-report/posthog-app/src/scenes/dashboard/dashboards/Dashboards 19.8 kB
frontend/dist-report/posthog-app/src/scenes/dashboard/dashboards/templates/DashboardTemplateCopyScene 6.06 kB
frontend/dist-report/posthog-app/src/scenes/data-management/DataManagementScene 986 B
frontend/dist-report/posthog-app/src/scenes/data-management/definition/DefinitionEdit 17.2 kB
frontend/dist-report/posthog-app/src/scenes/data-management/definition/DefinitionView 24.4 kB
frontend/dist-report/posthog-app/src/scenes/data-management/MaterializedColumns/MaterializedColumns 12 kB
frontend/dist-report/posthog-app/src/scenes/data-management/variables/SqlVariableEditScene 7.6 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/batch-exports/BatchExportScene 61 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/DataPipelinesNewScene 2.66 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/DestinationsScene 3.03 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/event-filtering/EventFilterScene 22.2 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/legacy-plugins/LegacyPluginScene 21 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/TransformationsScene 2.27 kB
frontend/dist-report/posthog-app/src/scenes/data-pipelines/WebScriptsScene 2.89 kB
frontend/dist-report/posthog-app/src/scenes/data-warehouse/DataWarehouseScene 1.72 kB
frontend/dist-report/posthog-app/src/scenes/data-warehouse/editor/EditorScene 1.48 kB
frontend/dist-report/posthog-app/src/scenes/debug/DebugScene 20.3 kB
frontend/dist-report/posthog-app/src/scenes/debug/hog/HogRepl 7.72 kB
frontend/dist-report/posthog-app/src/scenes/experiments/Experiment 207 kB
frontend/dist-report/posthog-app/src/scenes/experiments/Experiments 20.8 kB
frontend/dist-report/posthog-app/src/scenes/experiments/SharedMetrics/SharedMetric 6.41 kB
frontend/dist-report/posthog-app/src/scenes/experiments/SharedMetrics/SharedMetrics 889 B
frontend/dist-report/posthog-app/src/scenes/exports/ExportsScene 4.33 kB
frontend/dist-report/posthog-app/src/scenes/feature-flags/FeatureFlag 146 kB
frontend/dist-report/posthog-app/src/scenes/feature-flags/FeatureFlags 1.08 kB
frontend/dist-report/posthog-app/src/scenes/groups/Group 15.5 kB
frontend/dist-report/posthog-app/src/scenes/groups/Groups 4.26 kB
frontend/dist-report/posthog-app/src/scenes/groups/GroupsNew 7.7 kB
frontend/dist-report/posthog-app/src/scenes/health-alerts/HealthAlertsScene 4.14 kB
frontend/dist-report/posthog-app/src/scenes/health/categoryDetail/HealthCategoryDetailScene 7.6 kB
frontend/dist-report/posthog-app/src/scenes/health/HealthScene 12.7 kB
frontend/dist-report/posthog-app/src/scenes/health/pipelineStatus/PipelineStatusScene 9.91 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapNewScene 5.38 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapRecordingScene 4.27 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapScene 6.91 kB
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmaps/HeatmapsScene 4.23 kB
frontend/dist-report/posthog-app/src/scenes/hog-functions/HogFunctionScene 59.6 kB
frontend/dist-report/posthog-app/src/scenes/inbox/InboxScene 63.3 kB
frontend/dist-report/posthog-app/src/scenes/insights/InsightQuickStart/InsightQuickStart 5.77 kB
frontend/dist-report/posthog-app/src/scenes/insights/InsightScene 34.8 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/BoxPlot/BoxPlot 5.39 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/CalendarHeatMap/CalendarHeatMap 4.84 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/RegionMap/RegionMap 29.8 kB
frontend/dist-report/posthog-app/src/scenes/insights/views/WorldMap/WorldMap 5.13 kB
frontend/dist-report/posthog-app/src/scenes/instance/AsyncMigrations/AsyncMigrations 13.5 kB
frontend/dist-report/posthog-app/src/scenes/instance/DeadLetterQueue/DeadLetterQueue 5.74 kB
frontend/dist-report/posthog-app/src/scenes/instance/QueryPerformance/QueryPerformance 8.97 kB
frontend/dist-report/posthog-app/src/scenes/instance/SystemStatus/SystemStatus 17.4 kB
frontend/dist-report/posthog-app/src/scenes/IntegrationsRedirect/IntegrationsRedirect 1.08 kB
frontend/dist-report/posthog-app/src/scenes/marketing-analytics/MarketingAnalyticsScene 42 kB
frontend/dist-report/posthog-app/src/scenes/max/Max 1.02 kB
frontend/dist-report/posthog-app/src/scenes/models/ModelsScene 19 kB
frontend/dist-report/posthog-app/src/scenes/models/NodeDetailScene 17.1 kB
frontend/dist-report/posthog-app/src/scenes/moveToPostHogCloud/MoveToPostHogCloud 4.81 kB
frontend/dist-report/posthog-app/src/scenes/new-tab/NewTabScene 1.82 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookCanvasScene 3.89 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookPanel/NotebookPanel 5.94 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookScene 9.26 kB
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebooksScene 7.95 kB
frontend/dist-report/posthog-app/src/scenes/oauth/OAuthAuthorize 980 B
frontend/dist-report/posthog-app/src/scenes/onboarding/coupon/OnboardingCouponRedemption 1.55 kB
frontend/dist-report/posthog-app/src/scenes/onboarding/Onboarding 791 kB
frontend/dist-report/posthog-app/src/scenes/onboarding/sdks/SdkDoctorScene 10.2 kB
frontend/dist-report/posthog-app/src/scenes/organization/ConfirmOrganization/ConfirmOrganization 4.88 kB
frontend/dist-report/posthog-app/src/scenes/organization/Create/Create 1 kB
frontend/dist-report/posthog-app/src/scenes/organization/Deactivated 1.48 kB
frontend/dist-report/posthog-app/src/scenes/organization/PendingDeletion 2.45 kB
frontend/dist-report/posthog-app/src/scenes/persons/PersonScene 19 kB
frontend/dist-report/posthog-app/src/scenes/persons/PersonsScene 6.09 kB
frontend/dist-report/posthog-app/src/scenes/PreflightCheck/PreflightCheck 5.91 kB
frontend/dist-report/posthog-app/src/scenes/product-tours/ProductTour 275 kB
frontend/dist-report/posthog-app/src/scenes/product-tours/ProductTours 5.03 kB
frontend/dist-report/posthog-app/src/scenes/project-homepage/ProjectHomepage 18.4 kB
frontend/dist-report/posthog-app/src/scenes/project/Create/Create 1.18 kB
frontend/dist-report/posthog-app/src/scenes/resource-transfer/ResourceTransfer 9.53 kB
frontend/dist-report/posthog-app/src/scenes/saved-insights/SavedInsights 1 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/detail/SessionRecordingDetail 2.1 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/file-playback/SessionRecordingFilePlaybackScene 4.82 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/kiosk/SessionRecordingsKiosk 10.3 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/player/snapshot-processing/DecompressionWorkerManager 329 B
frontend/dist-report/posthog-app/src/scenes/session-recordings/playlist/SessionRecordingsPlaylistScene 5.45 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/SessionRecordings 1.12 kB
frontend/dist-report/posthog-app/src/scenes/session-recordings/settings/SessionRecordingsSettingsScene 2.31 kB
frontend/dist-report/posthog-app/src/scenes/sessions/SessionProfileScene 15.4 kB
frontend/dist-report/posthog-app/src/scenes/settings/SettingsScene 3.9 kB
frontend/dist-report/posthog-app/src/scenes/sites/Site 1.53 kB
frontend/dist-report/posthog-app/src/scenes/startups/StartupProgram 21.5 kB
frontend/dist-report/posthog-app/src/scenes/StripeConfirmInstall/StripeConfirmInstall 3.88 kB
frontend/dist-report/posthog-app/src/scenes/subscriptions/SubscriptionScene 14.7 kB
frontend/dist-report/posthog-app/src/scenes/subscriptions/SubscriptionsScene 5.53 kB
frontend/dist-report/posthog-app/src/scenes/surveys/forms/SurveyFormBuilder 1.89 kB
frontend/dist-report/posthog-app/src/scenes/surveys/Survey 1.36 kB
frontend/dist-report/posthog-app/src/scenes/surveys/Surveys 26.7 kB
frontend/dist-report/posthog-app/src/scenes/surveys/wizard/SurveyWizard 72.7 kB
frontend/dist-report/posthog-app/src/scenes/themes/CustomCssScene 3.91 kB
frontend/dist-report/posthog-app/src/scenes/toolbar-launch/ToolbarLaunch 2.82 kB
frontend/dist-report/posthog-app/src/scenes/Unsubscribe/Unsubscribe 2 kB
frontend/dist-report/posthog-app/src/scenes/web-analytics/SessionAttributionExplorer/SessionAttributionExplorerScene 6.97 kB
frontend/dist-report/posthog-app/src/scenes/web-analytics/WebAnalyticsScene 10.6 kB
frontend/dist-report/posthog-app/src/scenes/wizard/Wizard 4.8 kB
frontend/dist-report/posthog-app/src/sharedChunkAnchors 1.19 kB
frontend/dist-report/render-query/src/render-query/render-query 27.4 MB
frontend/dist-report/toolbar/src/toolbar/toolbar 15.7 MB

compressed-size-action

Copy link
Copy Markdown

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

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: 010621b3b0

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

export const DashboardsUpdateTextTilePartialUpdateBody = /* @__PURE__ */ zod.object({
tile_id: zod
.number()
.optional()
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Require tile_id in MCP update-text-tile schema

dashboard-update-text-tile currently validates tile_id as optional in the generated Zod body schema, but the backend request serializer requires it (tile_id is mandatory and immediately dereferenced). This means MCP clients can submit requests that pass local schema validation and then fail with a 400 from the API, creating a contract mismatch for the tool. Make tile_id required in the tool input schema so invalid calls are rejected before the HTTP request.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Confirmed real — services/mcp/tests/unit/__snapshots__/tool-schemas/common/dashboard-update-text-tile.json only lists ["id"] in required, even though the serializer marks tile_id as required=True. drf-spectacular isn't propagating the requirement through to the generated MCP/Zod schema. Will fix in this PR.

Comment thread services/mcp/src/generated/dashboards/api.ts Outdated
Copy link
Copy Markdown

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

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: f41ac1ed53

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

Comment thread services/mcp/src/tools/generated/dashboards.ts Outdated
Comment on lines +188 to +189
.string()
.max(dashboardsCreateTextTileCreateBodyBodyMax)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Enforce non-empty body in text-tile MCP schemas

The backend serializers reject blank text bodies (allow_blank=False), but the generated MCP schema only applies .max(4000) so "" passes local validation and then fails with a 400 from the API. This creates a request-contract mismatch for the new tool and causes avoidable runtime failures when an agent/tool submits an empty body. Add a minimum length/non-empty constraint (similarly for update body) in the generated schema contract.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Already addressed — both serializers set min_length=1 with an explicit min_length error message, and the regenerated snapshots at dashboard-create-text-tile.json and dashboard-update-text-tile.json both include "minLength": 1 on the body field.

Comment thread products/dashboards/mcp/tools.yaml Outdated
"type": "number"
}
},
"required": ["id"],
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The schema required array only includes ["id"] but is missing "tile_id". The UpdateTextTileRequestSerializer at line 222-225 in products/dashboards/backend/api/dashboard.py defines tile_id with required=True, so the schema should be "required": ["id", "tile_id"]. Without this, MCP clients will not know that tile_id is mandatory, leading to 400 Bad Request errors when agents omit it.

"required": ["id", "tile_id"]
Suggested change
"required": ["id"],
"required": ["id", "tile_id"],

Spotted by Graphite

Fix in Graphite


Is this helpful? React 👍 or 👎 to let us know.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Confirmed real — same finding as the codex comment on api.ts. The serializer marks tile_id as required=True but drf-spectacular isn't propagating that into the generated OpenAPI schema, so the snapshot ends up with "required": ["id"] instead of ["id", "tile_id"]. Will fix the codegen in this PR.

Copy link
Copy Markdown

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

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: bea6ad61bd

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

Comment thread services/mcp/schema/generated-tool-definitions.json Outdated
Comment on lines +307 to +309
tile_id: zod
.number()
.optional()
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Require tile_id in update text-tile MCP schema

The backend requires tile_id for update_text_tile (UpdateTextTileRequestSerializer sets required=True), but the generated MCP Zod contract marks tile_id optional. As a result, MCP callers can pass local validation with no tile id and then deterministically fail at runtime with a 400 from the API, which is a request-contract mismatch for this new tool.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Same finding as the earlier codex comment — confirmed real, fixing the codegen so tile_id propagates through OpenAPI → Orval → Zod as required.

@andrewm4894
Copy link
Copy Markdown
Member Author

will double check the bot comments and resolve conflicts

andrewm4894 and others added 9 commits May 28, 2026 14:02
Adds two new dashboard actions and matching MCP tools so AI agents can
create and edit markdown text tiles (used as section headings, dividers,
and annotations) without having to construct a deeply nested dashboard
PATCH payload.

- POST /dashboards/:id/create_text_tile/  → dashboard-create-text-tile
- PATCH /dashboards/:id/update_text_tile/ → dashboard-update-text-tile

Both endpoints take a small focused payload (markdown body, optional
layouts, optional color) and return a single DashboardTileSerializer,
avoiding the cost of returning the whole dashboard for a tile-scoped
change.

Generated-By: PostHog Code
Task-Id: 3d805ad6-0aaf-4961-bba7-643d68f41417
Address CI failures and trusted code-review bot feedback on the
text-tile MCP endpoints:

- mypy: narrow `tile.text` (Text | None) in
  test_update_text_tile_leaves_omitted_fields_unchanged by refreshing the
  Text row directly instead of going through the optional FK.
- Reject null/blank body on `update_text_tile` for consistency with
  `create_text_tile` (Greptile P1, Graphite). Update silently clearing a
  tile to an empty body would have been a footgun.
- Add `max_length=400` to the `color` field on both request serializers
  to match `DashboardTile.color` and surface oversize input as a 400
  rather than a 500 at save time (Codex).
- Parameterize duplicate rejection / 404 test methods (Greptile P2).
- Add a `subTest`-driven test covering both "unknown tile_id" and
  "tile belongs to a different dashboard" 404 cases.
- Commit MCP tool schema snapshots for the two new tools so the
  snapshot-staleness check passes.

Generated-By: PostHog Code
Task-Id: 3d805ad6-0aaf-4961-bba7-643d68f41417
Regenerate against the latest Orval-emitted Zod after the auto-bot
picked up `max_length=400` on `color` and the tightened `body` validation
on `update_text_tile`. Without this the snapshot test sees a stale schema
and fails.

Generated-By: PostHog Code
Task-Id: 3d805ad6-0aaf-4961-bba7-643d68f41417
Address Codex P2 feedback on the text-tile MCP tools:

- enrich_url: use {params.id} (dashboard id from URL path) instead of
  {id} from the response. The new endpoints return DashboardTile, so
  result.id was the tile id — the generated _posthogUrl pointed at the
  wrong dashboard URL.
- Enforce non-empty body in Zod by adding min_length=1 to both create
  and update body fields. The backend already rejected blank with
  allow_blank=False, but Zod only had max(4000), so empty strings would
  pass local validation and round-trip to a 400.
- Drop the misleading "use dashboard-update with deleted: true" hint
  from dashboard-update-text-tile's description. The MCP dashboard-update
  contract doesn't expose tiles, so that path is a dead end. Deletion
  via MCP needs a separate tool, out of scope for this PR.

The hand edits to services/mcp/src/{api,generated,tools/generated}/* and
products/dashboards/frontend/generated/* mirror what the codegen bot
will produce on rerun — committing them keeps CI green in the gap before
the auto-regen lands.

Generated-By: PostHog Code
Task-Id: 3d805ad6-0aaf-4961-bba7-643d68f41417
…ed in the MCP schema

drf-spectacular treats PATCH actions as partial-update and marks all body
fields optional in the generated OpenAPI schema, dropping tile_id from
`required` even though the serializer sets `required=True`. MCP/Zod
callers were not told tile_id was mandatory and hit 400s instead. Match
the create_text_tile / copy_tile / reorder_tiles pattern and use POST.
@andrewm4894 andrewm4894 force-pushed the posthog-code/dashboard-text-tile-mcp-tools branch from 3f00546 to 36bfe75 Compare May 28, 2026 14:07
@andrewm4894 andrewm4894 removed the request for review from a team May 28, 2026 14:09
@github-actions
Copy link
Copy Markdown
Contributor

🎭 Playwright report · View test results →

⚠️ 1 flaky test:

  • Inline editing insight title via compact card popover (chromium)

These issues are not necessarily caused by your changes.
Annoyed by this comment? Help fix flakies and failures and it'll disappear!

@andrewm4894 andrewm4894 enabled auto-merge (squash) May 28, 2026 15:11
@andrewm4894 andrewm4894 merged commit a490d43 into master May 28, 2026
321 of 325 checks passed
@andrewm4894 andrewm4894 deleted the posthog-code/dashboard-text-tile-mcp-tools branch May 28, 2026 15:23
@deployment-status-posthog
Copy link
Copy Markdown

deployment-status-posthog Bot commented May 28, 2026

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-05-28 15:57 UTC Run
prod-us ✅ Deployed 2026-05-28 16:18 UTC Run
prod-eu ✅ Deployed 2026-05-28 16:24 UTC Run

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.

2 participants