Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 4 additions & 2 deletions docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -3728,7 +3728,8 @@
"icon": "magnifying-glass",
"pages": [
"zh/rum/explorer/overview",
"zh/rum/explorer/data-query"
"zh/rum/explorer/data-query",
"zh/rum/explorer/analytics"
]
},
{
Expand Down Expand Up @@ -5410,7 +5411,8 @@
"icon": "magnifying-glass",
"pages": [
"en/rum/explorer/overview",
"en/rum/explorer/data-query"
"en/rum/explorer/data-query",
"en/rum/explorer/analytics"
]
},
{
Expand Down
7 changes: 6 additions & 1 deletion en/ai-sre/automations.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ The configuration form has the following fields:
| Scope | Yes | Use the **scope selector** to choose **Personal** (`team_id=0`) or a **Team** (`team_id>0`). Scope determines both the rule's ownership and edit permissions, and constrains the self-hosted Runners selectable in **Environment** — only account-global Runners and Runners belonging to the same team as the scope are selectable. |
| Environment | No | Use the **environment picker** to choose the runtime environment: **Auto** (the backend picks the best available environment, the default), **Cloud Sandbox**, or a **self-hosted (BYOC) Runner**. After picking a team scope, a team Runner that does not belong to that scope is cleared automatically. |
| Task prompt | Yes | Describe the task for AI SRE to perform, written in a rich-text editor. This prompt is exactly what is sent to the agent on each run. Placeholder: `Describe the task for Flashduty AI SRE to perform.` |
| Time zone | No | A field on the **Schedule** trigger card (see "Schedule (cron)" below): the **rule time zone** the cron expression is read in. Pick an IANA zone name (for example `Asia/Shanghai`) from a searchable dropdown; the options are ordered by their UTC offset. On create it defaults to your effective time zone (member time zone first, falling back to the account time zone); when no zone is available the field is left empty and the create request omits it. |

<Note>
For **Environment**, "Auto" has the backend pick the best available environment at each run; "Cloud Sandbox" is a platform-managed ephemeral sandbox; a self-hosted Runner runs on your own machine. See <a href="/en/ai-sre/environments">Environments</a> for the differences and how to connect them.
Expand Down Expand Up @@ -96,13 +97,17 @@ To avoid hand-writing the expression, the UI offers four modes:
| Custom | Type a 4-field or 5-field cron expression directly |

<Warning>
**Time zone**: in **Daily / Weekly** modes, the time you pick is interpreted in your **local time zone**, converted to UTC on save; the UI labels your local time zone next to the cadence summary. In **Custom** mode the expression is interpreted in **UTC**, labeled `UTC` in the UI.
**Time zone**: a **Schedule** run is read against the cron's **rule time zone** — pick it from the **Time zone** dropdown on the trigger card. All four modes (**Hourly / Daily / Weekly / Custom**) share that one field; there is no split between "this mode uses your local zone, that one uses UTC". Saving stores the IANA zone you picked as-is, no longer converting the hour and minute to UTC, and the cadence summary no longer carries a time zone label beside it.
</Warning>

<Note>
The actual execution time may differ from the set time by a **few minutes**. This is intentional, to spread out system load. Do not treat a rule as a second-accurate timer.
</Note>

When you edit a rule that is **enabled** and already has its next run scheduled, changing the cron expression or the **time zone** adds a note to the trigger card: **the occurrence that is already scheduled and has not started yet (`<time>`, `<old zone>`) will not run. The next one is recalculated on the `<new zone>` clock, and its real start can be up to 5 minutes later than that minute.**

The note appears only when the schedule really changed: switching the time zone between an empty value and `UTC` does not count (they are the same clock face), and it does not appear when the **Schedule** trigger is off or the rule has no pending run.

### Call via API (HTTP POST)

Lets you trigger this automation on demand from an external system, independent of a time cadence.
Expand Down
6 changes: 3 additions & 3 deletions en/ai-sre/im.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,13 @@ The **reply mode** is configurable (off / first / all), controlling whether AI S

### Processing Receipt

Once the bot has your message, it first puts an emoji reaction on **the message you sent**, as an immediate "received, working on it" signal. The emoji is picked **at random** from that platform's own pool rather than being fixed:
Once the bot has your message, it first puts an emoji reaction on **the message you sent**, as an immediate "received, working on it" signal. The emoji is picked **at random** from that platform's own pool rather than being fixed — the pool keeps only glyphs that read as "received, working on it", and congratulatory, thumbs-up, heart, or smiley reactions are left out because on a message that just arrived they read as a verdict or as sarcasm:

| Platform | Emoji pool (one picked at random) |
| --- | --- |
| Slack | eyes, thinking_face, hourglass_flowing_sand, mag, zap |
| Lark / Feishu | Typing, Thinking, Get, CheckMark, OnIt, Hundred, and more |
| DingTalk | Platform built-in emotions: 思考, 收到, Get, 赞, 比心, OK, and more |
| Lark / Feishu | Typing, THINKING, Get, OnIt |
| DingTalk | Platform built-in emotions: 思考, 收到, Get |

On Slack this sits alongside a native "is working on it" status, which the bot also shows.

Expand Down
6 changes: 3 additions & 3 deletions en/ai-sre/mcp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ The **Recommended** block above the catalog ("Recommended from your alert source
The dialog first shows the template's details: the vendor ("Official Datadog · MCP" or "Community · MCP"), a link to its official docs, its description, and a set of "**Ask things like this once connected**" example questions. Then come the connection parameters the template declares — URL / endpoint placeholders and environment variables. **Shared** fields (shared account-wide under service authorization) are labelled "Shared by the whole account."; in **Member authorization (key)** mode there is also a "**Your API token**" field (a password input) labelled "Only for your own use — other members fill in their own the first time they use it.", with a "How to get one" docs link beside it.
</Step>
<Step title="Pick an execution environment and submit">
Choose the **execution environment** this connection should be made from — "Connects in the session's own environment by default."; for a template that needs a self-hosted Runner, the hint reads "If 〈name〉 is only reachable on your internal network, pick a self-hosted Runner on that network." The primary button is **Connect**; for a **Member authorization (OAuth)** template it reads "**Authorize 〈name〉**" and creates the connector first, then opens the browser authorization window (OAuth discovery, Dynamic Client Registration, and token exchange all run from the chosen environment).
Choose the **execution environment** this connection should be made from — "Connects in the session's own environment by default."; for a template that needs a self-hosted Runner, the hint reads "If 〈name〉 is only reachable on your internal network, pick a self-hosted Runner on that network." The primary button is **Connect**; for a **Member authorization (OAuth)** template it reads "**Authorize 〈name〉**" and creates the connector first, then opens the browser authorization window (OAuth discovery, Dynamic Client Registration, and token exchange all run from the chosen environment; when the authorization server does not support DCR, fc-safari falls back to a Client ID Metadata Document — see "Authentication" below).
</Step>
<Step title="Confirm the result">
On submit, the system creates the connector and runs one connection test against it. On success the dialog shows "**〈name〉 connected**" plus the example questions: click **Done** to close it, or click an example question to open a new chat with that question **prefilled** (it is not sent automatically). On failure it shows "**The connection test failed**" with the raw error: click **Retry** to re-run the test; for a template that needs a Runner, a non-cloud environment also offers a "Let AI SRE install it on the Runner" entry, which opens a new chat that carries no token and asks the agent to install the missing command-line tools (`npx`'s Node.js, `uvx`'s uv) on the self-hosted Runner.
Expand Down Expand Up @@ -158,7 +158,7 @@ MCP servers support three **authorization modes** that determine how credentials
Suitable for third-party SaaS where each engineer uses their own API key (e.g., a personal GitHub token).
</Tab>
<Tab title="Member authorization (OAuth)">
Each member authorizes individually via **OAuth 2.1**. An authorization window pops up automatically the first time a tool on this server is invoked. Server discovery and Dynamic Client Registration (DCR) are performed as needed; tokens are stored per member and refreshed automatically near expiry. Suitable for services that support OAuth.
Each member authorizes individually via **OAuth 2.1**. An authorization window pops up automatically the first time a tool on this server is invoked. Server discovery and client registration are performed as needed: when the authorization server advertises a registration endpoint, fc-safari uses **Dynamic Client Registration (DCR)**; when there is no registration endpoint but the server declares **Client ID Metadata Document** support, fc-safari registers no client and instead uses the `/safari/oauth/client-metadata.json` document it publishes as its `client_id`, leaving the authorization server to fetch it by that URL — nothing extra to configure on your side. Tokens are stored per member and refreshed automatically near expiry. Suitable for services that support OAuth.
</Tab>
</Tabs>

Expand All @@ -180,7 +180,7 @@ MCP servers using service authorization have no per-member authorization step an

**Actions in the Credential dialog**: the dialog offers actions based on its authorization mode and your current credential state:

- **Member authorization (OAuth)**: first choose an **execution environment**, then click **Authorize** (when disconnected) / **Reauthorize** (when connected or expired). Choose a Cloud Sandbox or an online BYOC Runner; **Auto** is not available. OAuth discovery, Dynamic Client Registration, token exchange, and later refreshes all run from that environment. On each open, the dialog prefers the last successful environment if it is still online, then an online runner bound to the connector, and finally the Cloud Sandbox. For an OAuth service reachable only on a private network, choose a BYOC Runner that can reach it. A browser popup then opens the authorization window (initiated via `/safari/credentials/oauth/initiate`, which returns an authorize URL opened in the popup).
- **Member authorization (OAuth)**: first choose an **execution environment**, then click **Authorize** (when disconnected) / **Reauthorize** (when connected or expired). Choose a Cloud Sandbox or an online BYOC Runner; **Auto** is not available. OAuth discovery, Dynamic Client Registration, token exchange, and later refreshes all run from that environment (when the authorization server does not support DCR, fc-safari falls back to a Client ID Metadata Document — see "Authentication" above). On each open, the dialog prefers the last successful environment if it is still online, then an online runner bound to the connector, and finally the Cloud Sandbox. For an OAuth service reachable only on a private network, choose a BYOC Runner that can reach it. A browser popup then opens the authorization window (initiated via `/safari/credentials/oauth/initiate`, which returns an authorize URL opened in the popup).
- **Member authorization (key)**: click **Enter Key** (when disconnected) / **Update Key** (when connected) to open the secret-entry modal, which submits to `/safari/credentials/secret`.
- **Revoke**: when a credential exists, click **Revoke** (via `/safari/credentials/revoke`) to delete your saved credential; the status returns to Disconnected.

Expand Down
2 changes: 1 addition & 1 deletion en/ai-sre/memory.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ Go to **AI SRE → Customize → Context → Memory**.

- **Pick a scope**: switch between **Personal** and **Team** at the top; for Team, pick one of your teams from the dropdown. There is no Shared (account-level) memory. The scope and team are kept in the page URL, so a refresh or a shared link opens the same set of memories.
- **Find a memory**: the list on the left is grouped by Preference / Procedure / Fact / Lesson, newest update first within each group; the search box filters by name, description, and file name.
- **Create or edit**: click **New memory**, or click **Edit** on the right, fill in the name, type, a one-line description (when it applies), and the content, then save.
- **Edit**: click **Edit** on the right, change the name, the one-line description (when it applies), and the content, then save. This page has no create entry — memory is produced only in a conversation (see [How Memory Is Created](#how-memory-is-created)); the **type** cannot be changed here either, because it is fixed when the memory is written. The page only groups by type and writes the type back unchanged.
- **Delete**: after deletion, later conversations no longer use it. Telling the assistant to forget something in the conversation has the same effect.

If someone else or the AI changed the memory while you were editing, saving warns you; saving again overwrites it with your version, and canceling shows the latest content.
Expand Down
23 changes: 23 additions & 0 deletions en/changelog/changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,29 @@ description: "This page documents important updates and feature releases for Fla
keywords: ["Changelog", "Product Release", "Feature Updates", "Flashduty", "Version History"]
---

<Update label="2026-10-09" description="📊 Dashboard built-in time variables and display time zone, RUM Explorer analytics, OAuth for MCP Server and the Go SDK">

### Dashboards: built-in time variables and display time zone

Panel expressions can now use the built-in time variables `$__interval`, `$__rate_interval`, `$__range` and `$__auto`, rendered into seconds from the panel's own execution window and step — writing `$__range` removes the need to hand-maintain a variable just to know how long the window is. Availability depends on the datasource and query mode: Prometheus range queries support the first three, Loki range queries support `$__auto`, `$__interval` and `$__range`, Loki instant queries support `$__auto` and `$__range`, and any other combination is rejected on save. A leading `__` is reserved for built-in variables, so custom variables can no longer use that prefix.

The time picker footer gains a **Display time zone** row: switch between **Default** (follow your effective time zone), **Browser time**, **Coordinated Universal Time**, and a city list grouped by continent. It applies to dashboards only — it drives how the time picker displays and parses time and how the time-series x-axis and tooltips read — and the choice is remembered in this browser. See [Dashboards](/en/monitors/dashboards/dashboards).

### RUM Explorer: analytics view

The Explorer gains **List** and **Analytics** tabs. The **Analytics** view aggregates the events of the current event type by aggregation (count, distinct count, average, sum, minimum, maximum and P50 / P75 / P90 / P95 / P99) and group field, and offers five chart types: time series, top list, pie, table and distribution. You can drill from a chart element back into the list, drag-select a time range to zoom, download a PNG or export CSV; the whole analytics state lives in the URL, so copying the link reproduces the same analysis. See [RUM Explorer analytics](/en/rum/explorer/analytics).

### OAuth for MCP Server and the Go SDK

The remote MCP service `https://mcp.flashcat.cloud/mcp` now accepts both APP keys and **MCP OAuth access tokens**: with an MCP OAuth capable client (claude.ai, Claude Desktop, ChatGPT connectors and similar) you add a connector with no credentials at all, the client discovers the Flashduty authorization server and opens the consent page in your browser, and the token grants the same access as an APP key. Requests with no credential return `401` with a `WWW-Authenticate` header naming the protected-resource metadata. The Go SDK gains the matching `NewClientWithAccessToken`, which authenticates with `Authorization: Bearer` and no longer injects the `app_key` query parameter. See [MCP Server](/en/developer/mcp-server) and [Go SDK](/en/developer/go-sdk).

### CLI: `--timezone` for automation rules

`flashduty automation create` and `flashduty automation update` gain `--timezone` (an IANA zone name): when omitted, `create` lets the server take the caller's member time zone, then the account time zone, then fall back to `Asia/Shanghai`; when omitted on `update` the stored zone is kept, while an explicit empty value is stored as UTC — and the next fire time is recalculated immediately. `alert list` also gains `--alert-ids`, `--alert-keys`, `--asc` and `--by-updated-at`. See [CLI](/en/developer/cli).

</Update>


<Update label="2026-09-30" description="📊 Dashboard comparisons and cross-panel cursor linking, RUM apps link to code repositories, on-prem License expiry reminders">

### Monitors dashboards: comparisons, cross-panel cursor linking and point-value filtering
Expand Down
Loading
Loading