Repository navigation
Release 14.0.83 (CI gate - do not merge) - #5146
Merged
Merged
Conversation
…grations, connectors, read loop Cloud connections read a cloud account the way an OpenTelemetry Collector's cloud receivers would, with nothing to run: read-only access the customer creates with one command, an hourly inventory (Azure) or a sweep of where resources report (AWS, Google Cloud), and the key metrics of each resource through the metrics ingest in the receivers' own shape, so resources land under Cloud > All Resources with their metrics. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Security Events carried its pages as tabs across the top of the page (Events, Entities, Correlate; Detection Rules, Rule Library, Threat Intel, ATT&CK Coverage; Playbooks, Playbook Runs; Connections, Setup Guide), and the case queue and the runs page switched views with buttons along their tops. The side menu is now six sections - Overview, Security Cases, Events, Detections, Playbooks, Connections - and every tab and view is a page of its own in its section: - Security Cases: Open Cases, Assigned to Me, Unassigned, Closed Cases and All Cases, each a list fitted to its question (Closed Cases by verdict and when it closed; no Assignee column on Assigned to Me; an open list's Status filter offers only open statuses), with counts beside Open Cases and Assigned to Me and an empty state that says what empty means. - Playbooks: Playbooks, Waiting for Approval (counted) and Playbook Runs. - Detections and Connections fold until opened; each opens on its pages. The queue and runs pages keep their old addresses on what they opened on (cases = Open Cases, playbook-runs = Waiting for Approval); the other pages sit one level down. The Overview's counts open the exact page they count, breadcrumbs name the section and the page as the menu does, and Search finds every page under its section. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the connector tests The Connect page offers AWS, Azure and Google Cloud as tiles; each opens a guided form: run one command in the cloud's own browser terminal, paste what it printed, test, connect. Connected accounts are listed with their status and their resources by service. Tests cover the catalog, the paste reader, the setup commands, costs, key metrics, each cloud's connector against a fake API, the service and the read loop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mple and the docs are global
The help under Twilio SMS Phone Numbers - on a project's Twilio config and
on the Admin Dashboard's Call and SMS settings - read "Numbers to send SMS
from if yours can't (Singapore's national ones are voice-only)", with a
Singapore mobile number as the field's example. The maintainer: "Please
remove the Singapore warning or Singapore text from this. We need to make
the product global."
Everywhere a reader meets the list it now says when it is needed without
naming a country, and its example is no one country's numbers:
- the help: "Numbers to send SMS from if yours can only make calls. Each
SMS uses the one in the recipient's country, or the first." (118
characters, was 147), renamed in place in all 17 Dashboard and 17 Admin
Dashboard locales, each with its translation (the Admin's Spanish keeps
usted);
- the empty field's example, on both forms: PHONE_NUMBER_LIST_EXAMPLE,
"+14155550123, +447700900123" - two numbers in two countries, both from
ranges kept for fiction, the list the error below the field gives;
- the error that refuses a list: the server's example instead of
+6581234567, and the forms' key takes it as {{example}}, so no locale
repeats numbers;
- the API's description of ProjectCallSMSConfig.twilioSmsPhoneNumbers: as
GlobalConfig's already said it, and the example list;
- the docs page self-hosted/twilio-integration in all 17 languages: the
voice-only case and what to do explained in general terms, and the
Singapore-only note (SGNIC, Likely-SCAM) now says that some countries ask
senders to register, linking Twilio's SMS guidelines for every country.
The number-purchase country picker and the time zone lists keep
Singapore: there it is one country among all the others.
Tests: TwilioSmsNumbersNameNoCountry (App) holds every surface - help,
examples, error, API description, test-send copy, the refused-SMS hint -
in all 34 locales; InstallIntegrationsDocsFacts holds the docs page in all
17 languages; TwilioPhoneNumbers, PhoneNumberListError,
TwilioConfigSmsNumbers and AdminSettingsFormsOnePage pin the example, the
rendered placeholder and the new words.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s list - Breadcrumbs: each crumb opens what it names - Security Events the Overview (where the Products menu opens it), a section its first page (Playbooks the playbooks, not the runs that share their address). - Correlate gets a connected-points icon everywhere: Graph drew the same bars as the Overview's ChartBar. - Common tests: the side menu (sections, entries, folds, the lit entry on all 18 pages, icons drawn differently, the three counts and their queries, the phone summary); every address through the real route table (the old ones included, a case id never taken for a page, a page drawn afresh between case pages); breadcrumbs on every page; each case page's query, columns, filters, sort, create button, bulk actions and empty state through the production table; the runs pages; the Overview's counts opening their pages. - Guards: Security Cases, Events and Playbooks are everyday sections. - The offline Security Operations suite walks the menu, the case and run pages, the old addresses and the counts, and shoots them at 1280 and 390 in both themes; the empty-states fixture stubs the new pages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Security Events pages table lists the menu as it now draws: the Security Cases section with Open Cases, Assigned to Me, Unassigned, Closed Cases and All Cases, and Waiting for Approval beside Playbook Runs. The cases and getting-started pages name the pages where they used to name tabs. All 17 languages change line for line with the English, each drawing the labels its Dashboard draws, and the docs facts suites hold the table to the menu. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ment for both placeholders The Korean docs line that tells what to do with a number that can only make calls now says "your number" (보유한 번호로), as the Korean help under the field does. The two forms' placeholder comments read the same. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The library's category filter was a row of eight buttons - All, Recommended, Identity, Endpoint, Cloud, Network, Web, Kubernetes - lit like tabs across the card, the one row of tabs left in the product. It is now one select beside Search rules, the way the template pickers narrow theirs: All categories, Recommended, then each category. On a phone the two stack, each the card's width. "All categories" and the select's label, "Rule categories", are in all 16 languages. The page test and the offline browser suite pick from the select, hold that no button sits in the filter row, and measure the row at 1280 (light and dark) and 390. The offline suite's polls take block bodies, as the lint rules ask. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The list's toolbar had controls of every size: a tall sort select with a clear x, a small time chip, a text Advanced filters button, a lone refresh icon and a Search help link. Its header is now the one every table has: the Search... / pill that opens into the search bar, the time range at the header's height, and a ⋯ holding the sort order (ticked choices, as a feed's), Filter and Refresh. The chips sit in the shared Filter row. The pieces come from shared modules every table now draws with: Table/TableHeaderControls (search slot, main button and ⋯ split, the / shortcut), which BaseModelTable now uses too, and ResourceOwners/ FacetFilterBar, which useResourceOwners now uses too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Formatting only, as prettier writes it, for the route map, the Playbook Runs page, the empty-states fixture and the new pages' tests. The empty-states suite's Setup Guide test is named for the page it opens, which is no longer a tab. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e shared header controls - SessionReplaySearchBar: chips are never written into the box, a typed chip token narrows at once and moves into its chip on Enter, deleting it gives the chip back, syntax help and hints drop down while focused, Escape and the clear button, folding. - SessionReplayTable: the toolbar header (search, time range, ⋯ at one height), the ⋯'s sort / Filter / Refresh, the folded search and /, Clear all, the applied filters box, Show ID on every row. - Users page header; facets row; grammar helpers and help rows (App); TableHeaderControls; the time picker's Header size. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ler, sync and migration tests Counts are plurals in the reader's language, numbers are written their way, and the catalog's access note is extracted with the rest of its words. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…header's ⋯ Fourteen more lists drew loose header icons - a refresh icon, and on some a filter funnel - with no border, a size smaller than their neighbours, nudged into place with a hand-tuned class: the infrastructure resource tables, a host's processes, services and systemd units, Docker and Podman containers, Ceph daemons and cluster log, Kubernetes events, the two Kubernetes cost pages and right-sizing, on-call readiness, the state timeline cards, and the session list's two Session Replay siblings (Replay Users, User Flows). They now hand their buttons through getTableHeaderButtons - the main button in sight, the rest in the ⋯, the toolbar header - as every model table does. User Flows and Replay Users keep their time range in the header at the header's height. TableHeaderButtonsGuard holds every list built on Common's Table to the shared header, bans the nudge class anywhere, and keeps an icon-only Refresh out of a card header on its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… card Both tables were wider than their card at 1280 (the session list still at 1600): every column kept the table's 10rem floor, and lines that never wrap - a device, the session's id and start with its absolute date from 2xl - set the width, so Recording and Signals went under the sticky Actions column. The short columns now take a 7rem floor and the Session column 8rem; the Session and person cells are one-column grids whose lines end in an ellipsis instead of widening the table, and a session's id and start wrap as whole pieces where the column is narrow. Both now fit at 1280, 1440 and 1600. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e shared example list ProjectCallSMSConfig.twilioSmsPhoneNumbers wrote the example list as its own literal. It now reads PHONE_NUMBER_LIST_EXAMPLE, the list both forms show in the empty field and the error that refuses a list gives, so the four can never drift apart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…elp-global-ui-review
- The routes test's mocks cast jest.requireActual to the module's type, as Common's other tests do; compile-tests read it as unknown. - The offline suite's open() takes theme: undefined for light, so the loops over both themes compile with exactOptionalPropertyTypes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e settings; worker, ingest and Dashboard tests A page per cloud's one command, what OneUptime reads and what it costs, held to the code by CloudConnectDocsFacts. Cloud Resources points to it. cloudConnect.aws in the chart (and CLOUD_CONNECT_AWS_* in config.env) give a self-hosted OneUptime the AWS identity that signs in to customers' roles. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The / key hint inherited a 15px line for its 10px text and stood 21px tall, so every table's search drew 39px beside its 38px buttons. The hint is one shared class now, on a 12px line, and the ModelTable's opened search takes the header's control height (42px on a phone, 38px from md). In the dark theme a focused search's gray-400 border had no rule of its own and kept its light colour; it now draws the strong border the hover rule draws. A scan holds every class of a table's header to Theme.css. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ListHeader.spec.ts drives the offline fixture at 1280 and 390, light and dark: the header is three controls of one height (38px, 42px on a phone) with the shared gaps, the chips row ends in Clear all, the ⋯ holds Sort, Filter and Refresh, the search opens in place and Escape folds it, a chip token moves into its chip on Enter, and the list and Replay Users tables fit their cards at 1280, 1440 and 1600. The fixture specs and the real-stack helper sort from the ⋯ and focus the search before typing, as a person does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The page names the list's header as it now draws: the Search… field that / opens and that lists its tokens while empty, the chip tokens that move into their chips on Enter, Sort, Filter and Refresh in the ⋯, Clear all at the end of the chips row, and Show ID in a row's ⋯. The Users button and Advanced filters are gone. All 16 translations name each label as their Dashboard draws it, and RumReplayDocsFacts holds the page to the code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The search syntax rows, the Enter hint and the ignored-user-filter warning are new keys; every Dashboard language translates them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…idth, dark and Japanese; dark theme guard; formatting The offline suite (packages/E2E/CloudConnect, npm run test-cloud-connect-ui) renders the real page against an in-page API: the tiles, a cloud connected from its tile with its command, one paste and a test, an AWS role or an access key, the list's status and actions. It runs in the UI regressions' group 8. Each tile's Connect now sits on one line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Admin Dashboard's Call and SMS form folds its two optional numbers - Twilio SMS Phone Numbers and Twilio Secondary Phone Numbers - under More fields, and in every language but English the titles were translated while the marker after them was not: 'Twilio SMS 電話番号 (Optional)'. FieldLabel looks the marker up by its English text in the app's own locale, and only the Dashboard's (and Accounts') locales had the entry. Each of the 17 Admin locales now words '(Optional)' as the same language's Dashboard locale does, next to 'More fields'. Every optional field of an Admin form gains it. Tests: App AdminOptionalLabelLocales holds the entry in all 17 languages to the Dashboard's, and to the key FieldLabel reads; Common AdminSettingsFormsOnePage renders the Call and SMS form in Japanese and reads '(任意)' after both titles, the Japanese help and the example list. Both fail with the Japanese entry taken out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Twilio SMS Phone Numbers name no country: global help, example list and docs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ad runs A locked action gives up the row's button to the first usable one, so a read in progress handed its place to Test and the next tap could open a test. View error and Read now are the row's button by placement: View error while the connection fails, else Read now, locked with 'Reading now...' while its read runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Security events page: present SIEM + SOAR as shipped; BYO LLM off the Free plan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oks reach private addresses, and reads cleaner
UI review of the air-gapped page (/enterprise/air-gapped):
- Step 3 and its values.yaml now let probes and webhooks reach private
addresses (probes.one.allowPrivateNetworkMonitors, webhooks.allowPrivateNetwork).
On a network with no route out every website a monitor checks and every
tool a webhook posts to is on a private address, and both are refused by
default - the four steps left an install whose Website and API monitors,
webhooks and Mattermost posts were all refused. The chart's air-gapped
suite renders the new values and checks both switches (and that a stock
install refuses both).
- The hero's picture draws the probes and datastores inside OneUptime and the
customer's own registry, mail server, identity provider and AI model beside
it ("Uses your own"); two columns on a phone instead of eight stacked rows.
- Connections out: two tables, "On by default" and "Only once you set them
up", instead of badges on one table; settings, values and addresses drawn
as code (backticks in Utils/AirGapped.ts, kept as code in the .md variant,
dropped for the FAQ's structured data).
- values.yaml and the AI env block colour each value apart from its key, in
monospace: the site's * { font-family } rule had drawn spans inside code
(and the signing key's fingerprint) in the sans-serif font.
- Steps: settings chips first, then the fingerprint; no code chip for the
offline license token; a long setting wraps instead of running off a 320px
phone. The upgrades note no longer reads "Upgrades. Upgrades work...".
- The sticky section bar carries "Plan your install" from a tablet up; a
section the bar jumps to starts right under it.
- Shorter hero paragraph, a clearer link label (SMTP), no "When: When..." on
phones, and a readable "What we cover" label on the dark section.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… bar slides over the menus - The phone menu's link grid gains Enterprise and Air-Gapped, in pairs (Enterprise beside Request Demo, Air-Gapped beside Self-Hosted), so the Enterprise menu's pages are there on a phone too and the two columns stay even. - The air-gapped and self-hosted pages' sticky section bars sit at z-10, under the site's menus (z-20). A phone's menu is taller than the screen, and scrolling down to its links slid the bar (same z-index, later in the page) over them. - "air-gapped" on the Enterprise overview's data residency card no longer breaks at its hyphen. Tests: the phone menu's pairs and even count, and both bars under all three menus (mutation-checked: each break is caught). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat(cloud): connect AWS, Azure and Google Cloud in a few clicks, and see their resources
Locale conflicts resolved with npm run i18n:extract (both sides' keys kept). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Website: a page for air-gapped installs (/enterprise/air-gapped), and every Helm pod takes imagePullSecrets
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Session Replay: the list's header works and looks like every table's, and so do 14 more lists
Contributor
Author
✅ Snyk checks have passed. No issues have been found so far.
💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse. |
simlarsen
pushed a commit
that referenced
this pull request
Oct 21, 2026
…table header App Test (3/3) failed on master after #5135 (and on the 14.0.83 gate #5146): IntroductionDocsFacts looked for the "/" search shortcut in BaseModelTable.tsx, and RulesSmtpFormsDocsFacts for the rule that picks a table's main button there. #5135 moved both into the shared table header, Common/UI/Components/Table/TableHeaderControls.tsx: useTableHeaderSearchShortcut and splitTableHeaderButtons, which BaseModelTable calls. What the docs say is unchanged - / opens a list's search unless you are typing (now also not in an editable region), and an outlined button such as Export JSON or Import JSON never takes the header's button, so it sits in the More options menu. Both facts now read TableHeaderControls.tsx and check that BaseModelTable uses it. Dropping the Alt check from the shortcut, or letting an outlined button be the main one, fails each test; the 29 App suites that read BaseModelTable pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
simlarsen
pushed a commit
that referenced
this pull request
Oct 21, 2026
Dashboard Offline UI (5) failed on the 14.0.83 gate #5146: SecurityOperations' "each case page lists what its name says, from the side menu" went from Unassigned to Assigned to Me, waited for 'Showing 1-2 of 2 security cases' and read the rows - but Unassigned holds two cases as well, so that footer was still the last page's, and the rows were read while the new page's table loaded (empty). It now waits until the rows themselves show CASE-142. The test passes 5 of 5 and the suite 39 of 39 locally; a race under a busy runner, not a product change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
simlarsen
force-pushed
the
release-14.0.83
branch
from
October 21, 2026 14:31
1f8e7f7 to
38154c9
Compare
simlarsen
pushed a commit
that referenced
this pull request
Oct 21, 2026
…table header App Test (3/3) failed on master after #5135 (and on the 14.0.83 gate #5146): IntroductionDocsFacts looked for the "/" search shortcut in BaseModelTable.tsx, and RulesSmtpFormsDocsFacts for the rule that picks a table's main button there. #5135 moved both into the shared table header, Common/UI/Components/Table/TableHeaderControls.tsx: useTableHeaderSearchShortcut and splitTableHeaderButtons, which BaseModelTable calls. What the docs say is unchanged - / opens a list's search unless you are typing (now also not in an editable region), and an outlined button such as Export JSON or Import JSON never takes the header's button, so it sits in the More options menu. Both facts now read TableHeaderControls.tsx and check that BaseModelTable uses it. Dropping the Alt check from the shortcut, or letting an outlined button be the main one, fails each test; the 29 App suites that read BaseModelTable pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
simlarsen
pushed a commit
that referenced
this pull request
Oct 21, 2026
Dashboard Offline UI (5) failed on the 14.0.83 gate #5146: SecurityOperations' "each case page lists what its name says, from the side menu" went from Unassigned to Assigned to Me, waited for 'Showing 1-2 of 2 security cases' and read the rows - but Unassigned holds two cases as well, so that footer was still the last page's, and the rows were read while the new page's table loaded (empty). It now waits until the rows themselves show CASE-142. The test passes 5 of 5 and the suite 39 of 39 locally; a race under a busy runner, not a product change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
simlarsen
pushed a commit
that referenced
this pull request
Oct 21, 2026
MobileApp Test's expo-doctor job failed on the 14.0.83 gate #5146 (and fails on master with no code change): it checks the lockfile against Expo's live SDK 57 versions, and expo 57.0.31 was published 2026-10-21 14:28 UTC - 'expo expected ~57.0.31, found 57.0.30'. npx expo install --fix after npm ci: expo 57.0.31 with its patch dependencies (expo-modules-core 57.0.24, expo-modules-jsi 57.1.3, @expo/config-plugins 57.0.11, which needs xcode 4.0.0, so uuid 11.1.1 is no longer used), postcss 8.5.31, and @expo/cli 57.0.32 now nested under expo. From a clean npm ci of the new lockfile: expo-doctor 21/21, npm test 418 suites (10777 tests), npm run test-ui 76 of 76. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
||
| this.router.post( | ||
| `${basePath}/test`, | ||
| UserMiddleware.getUserMiddleware, |
Comment on lines
+69
to
+147
| async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => { | ||
| try { | ||
| const props: DatabaseCommonInteractionProps = | ||
| await CommonAPI.getDatabaseCommonInteractionProps(req); | ||
| const projectId: ObjectID = | ||
| CommonAPI.assertAuthenticatedProjectMember(props); | ||
| this.assertCanOperate(props); | ||
|
|
||
| const body: JSONObject = | ||
| req.body && typeof req.body === "object" && !Array.isArray(req.body) | ||
| ? (req.body as JSONObject) | ||
| : {}; | ||
|
|
||
| let settings: CloudConnectionSettings; | ||
|
|
||
| try { | ||
| settings = await this.readSettingsToTest({ | ||
| body, | ||
| projectId, | ||
| props, | ||
| }); | ||
| } catch (error) { | ||
| /* | ||
| * Settings the form could still fix (a role ARN of the wrong | ||
| * shape, a tenant that is not a GUID) are the test's answer, | ||
| * shown next to the field, not a failed request. | ||
| */ | ||
| if (!(error instanceof BadDataException)) { | ||
| throw error; | ||
| } | ||
|
|
||
| const result: CloudConnectionTestResult = { | ||
| provider: String(body["provider"] || ""), | ||
| status: "fail", | ||
| message: error.message, | ||
| failureKind: | ||
| "settings" as CloudConnectionTestResult["failureKind"], | ||
| durationMs: 0, | ||
| }; | ||
|
|
||
| return Response.sendJsonObjectResponse( | ||
| req, | ||
| res, | ||
| result as unknown as JSONObject, | ||
| ); | ||
| } | ||
|
|
||
| const result: CloudConnectionTestResult = | ||
| await CloudConnectorRegistry.getConnector(settings.provider) | ||
| .testConnection(settings, { | ||
| transport: DataSourceHttpFetch.fetch.bind(DataSourceHttpFetch), | ||
| }) | ||
| .catch((error: unknown): CloudConnectionTestResult => { | ||
| // testConnection never throws; this is the belt to its braces. | ||
| const failure: LlmProviderError = LlmProviderError.from({ | ||
| error, | ||
| step: "test", | ||
| providerTitle: settings.provider, | ||
| secretValues: getCloudSecretValues(settings), | ||
| }); | ||
|
|
||
| return { | ||
| provider: settings.provider, | ||
| status: "fail", | ||
| message: failure.message, | ||
| failureKind: failure.kind, | ||
| durationMs: 0, | ||
| }; | ||
| }); | ||
|
|
||
| return Response.sendJsonObjectResponse( | ||
| req, | ||
| res, | ||
| result as unknown as JSONObject, | ||
| ); | ||
| } catch (error) { | ||
| next(error); | ||
| } | ||
| }, |
|
|
||
| this.router.post( | ||
| `${basePath}/:connectionId/read-now`, | ||
| UserMiddleware.getUserMiddleware, |
Comment on lines
+154
to
+194
| async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => { | ||
| try { | ||
| const props: DatabaseCommonInteractionProps = | ||
| await CommonAPI.getDatabaseCommonInteractionProps(req); | ||
| const projectId: ObjectID = | ||
| CommonAPI.assertAuthenticatedProjectMember(props); | ||
| this.assertCanOperate(props); | ||
|
|
||
| const connectionId: string | undefined = req.params["connectionId"]; | ||
|
|
||
| if (!connectionId || !ObjectID.isValidUUID(connectionId)) { | ||
| throw new BadDataException("A valid connection ID is required."); | ||
| } | ||
|
|
||
| const connection: CloudConnection | null = | ||
| await this.service.findOneBy({ | ||
| query: { _id: connectionId, projectId }, | ||
| select: { _id: true, projectId: true, isEnabled: true }, | ||
| props, | ||
| }); | ||
| CommonAPI.assertResourceBelongsToProject({ | ||
| resourceProjectId: connection?.projectId, | ||
| projectId, | ||
| }); | ||
|
|
||
| if (!connection?.isEnabled) { | ||
| throw new BadDataException( | ||
| "This connection is turned off. Turn it on to read it.", | ||
| ); | ||
| } | ||
|
|
||
| await CloudConnectionScheduler.enqueue( | ||
| new ObjectID(connectionId), | ||
| new Date(), | ||
| ); | ||
|
|
||
| return Response.sendJsonObjectResponse(req, res, { queued: true }); | ||
| } catch (error) { | ||
| next(error); | ||
| } | ||
| }, |
|
|
||
| this.router.get( | ||
| `${basePath}/aws-role-setup`, | ||
| UserMiddleware.getUserMiddleware, |
Comment on lines
+201
to
+223
| async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => { | ||
| try { | ||
| const props: DatabaseCommonInteractionProps = | ||
| await CommonAPI.getDatabaseCommonInteractionProps(req); | ||
| const projectId: ObjectID = | ||
| CommonAPI.assertAuthenticatedProjectMember(props); | ||
| this.assertCanOperate(props); | ||
|
|
||
| const setup: CloudConnectionAwsRoleSetup = | ||
| await AwsServerIdentity.getRoleSetup({ | ||
| projectId: projectId.toString(), | ||
| transport: DataSourceHttpFetch.fetch.bind(DataSourceHttpFetch), | ||
| }); | ||
|
|
||
| return Response.sendJsonObjectResponse( | ||
| req, | ||
| res, | ||
| setup as unknown as JSONObject, | ||
| ); | ||
| } catch (error) { | ||
| next(error); | ||
| } | ||
| }, |
simlarsen
pushed a commit
that referenced
this pull request
Oct 21, 2026
…group 8 Group 5 ran past the job's 30 minutes on the 14.0.83 gate #5146 (second cut): its 16 suites took 29.5 minutes after setup - Security Operations had grown with the Security pages (#5134) to about 3.5 minutes - and the job was cancelled in Code, with Public Addresses never run. Every suite that ran passed. Security Operations, Code and Public Addresses (about 10 minutes together, all Chromium) move to group 8, the lightest (about 9 minutes): about 20 and 19 minutes for the two groups, near the 22 the groups are kept to. The upload step already lists every suite's output, and Tests/Ops (E2ESuitesRunInCi and the other workflow readers) pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…table header App Test (3/3) failed on master after #5135 (and on the 14.0.83 gate #5146): IntroductionDocsFacts looked for the "/" search shortcut in BaseModelTable.tsx, and RulesSmtpFormsDocsFacts for the rule that picks a table's main button there. #5135 moved both into the shared table header, Common/UI/Components/Table/TableHeaderControls.tsx: useTableHeaderSearchShortcut and splitTableHeaderButtons, which BaseModelTable calls. What the docs say is unchanged - / opens a list's search unless you are typing (now also not in an editable region), and an outlined button such as Export JSON or Import JSON never takes the header's button, so it sits in the More options menu. Both facts now read TableHeaderControls.tsx and check that BaseModelTable uses it. Dropping the Alt check from the shortcut, or letting an outlined button be the main one, fails each test; the 29 App suites that read BaseModelTable pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dashboard Offline UI (5) failed on the 14.0.83 gate #5146: SecurityOperations' "each case page lists what its name says, from the side menu" went from Unassigned to Assigned to Me, waited for 'Showing 1-2 of 2 security cases' and read the rows - but Unassigned holds two cases as well, so that footer was still the last page's, and the rows were read while the new page's table loaded (empty). It now waits until the rows themselves show CASE-142. The test passes 5 of 5 and the suite 39 of 39 locally; a race under a busy runner, not a product change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MobileApp Test's expo-doctor job failed on the 14.0.83 gate #5146 (and fails on master with no code change): it checks the lockfile against Expo's live SDK 57 versions, and expo 57.0.31 was published 2026-10-21 14:28 UTC - 'expo expected ~57.0.31, found 57.0.30'. npx expo install --fix after npm ci: expo 57.0.31 with its patch dependencies (expo-modules-core 57.0.24, expo-modules-jsi 57.1.3, @expo/config-plugins 57.0.11, which needs xcode 4.0.0, so uuid 11.1.1 is no longer used), postcss 8.5.31, and @expo/cli 57.0.32 now nested under expo. From a clean npm ci of the new lockfile: expo-doctor 21/21, npm test 418 suites (10777 tests), npm run test-ui 76 of 76. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…group 8 Group 5 ran past the job's 30 minutes on the 14.0.83 gate #5146 (second cut): its 16 suites took 29.5 minutes after setup - Security Operations had grown with the Security pages (#5134) to about 3.5 minutes - and the job was cancelled in Code, with Public Addresses never run. Every suite that ran passed. Security Operations, Code and Public Addresses (about 10 minutes together, all Chromium) move to group 8, the lightest (about 9 minutes): about 20 and 19 minutes for the two groups, near the 22 the groups are kept to. The upload step already lists every suite's output, and Tests/Ops (E2ESuitesRunInCi and the other workflow readers) pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
simlarsen
force-pushed
the
release-14.0.83
branch
from
October 21, 2026 16:35
38154c9 to
f478584
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Do not merge this PR. It is the CI gate for release 14.0.83. Its checks run on exactly the tree the release merge will build: this PR's merge ref is release plus the 14.0.83 bump. They run in a concurrency group that master pushes can't cancel. The release merge is pushed straight to
releaseonce these checks are green (14.0.82 published at 12:54Z). GitHub then marks this PR merged.chore: bump version to 14.0.83(f478584). It changes only VERSION and the package.json / package-lock.json files the hook keeps in step, the same 55 files as every bump.release(22f0124, the 14.0.82 release merge) to exactly the bump's tree (df6d9f07b1). Anything merged after ab82c77 ships in 14.0.84.cloudConnect.aws) for the role-based connection.imagePullSecrets; installs pulling from a private registry no longer need per-pod patches.release(Mob app monitors #2359-chore: npm audit fix #2364), all js/missing-rate-limiting on Cloud Connect's three routes (/test, /:connectionId/read-now, /aws-role-setup), which only a signed-in project owner or admin can call - the classreleasealready carries about 490 of; /test is a connection check like the LLM provider and MCP server tests (TestSendRoutesAskTheRule). A follow-up adds one per-project throttle for every such check.releaselacks and this PR accepts. Released as 7f3dbe7 at 19:10Z; the bump is merged into master as a7c48d4 (versions only; master's own App Test workflow file kept).🤖 Generated with Claude Code