Compare commits

...

599 Commits

Author SHA1 Message Date
Nawaz Dhandala
9b482ec26e feat(workflow): Enhance workflow UI with new empty state component and improved styling 2025-12-23 22:50:55 +00:00
Nawaz Dhandala
035707ec72 feat(workflow): Implement workflow builder components and onboarding experience 2025-12-23 22:40:50 +00:00
Nawaz Dhandala
d09228a71d fix(tests): Update navigation link types to use Locator for better type safety
chore: Bump version to 9.2.27
2025-12-23 21:58:44 +00:00
Nawaz Dhandala
e5c48061e4 refactor(tests): Simplify navigation link interactions in pricing and enterprise tests 2025-12-23 21:52:43 +00:00
Nawaz Dhandala
e1ffba9fbd Merge branch 'master' of https://github.com/OneUptime/oneuptime 2025-12-23 21:47:03 +00:00
Nawaz Dhandala
cd44bf0360 fix(telegram): Update description for Chat ID to include bot administrator requirement 2025-12-23 21:47:00 +00:00
Nawaz Dhandala
04a553eec6 fix(telegram): Enhance error handling by providing additional context for Telegram API errors 2025-12-23 21:39:00 +00:00
Nawaz Dhandala
d2c33f4996 fix(telegram): Simplify error handling for missing Telegram message 2025-12-23 21:27:09 +00:00
Nawaz Dhandala
b2321dd966 feat(telegram): Add Send Message to Telegram component with necessary configurations 2025-12-23 21:24:48 +00:00
Simon Larsen
47d9c118c0 Merge pull request #2196 from OneUptime/snyk-upgrade-65b43cef168cd3ea4773f38623f87961
[Snyk] Upgrade xmlbuilder2 from 4.0.0 to 4.0.3
2025-12-23 21:15:04 +00:00
Simon Larsen
649f317c3d Merge pull request #2194 from OneUptime/snyk-upgrade-c57662cf87ba0d6564e00e5c30e3deea
[Snyk] Upgrade playwright from 1.56.1 to 1.57.0
2025-12-23 21:14:58 +00:00
snyk-bot
272bb1b3ab fix: upgrade xmlbuilder2 from 4.0.0 to 4.0.3
Snyk has created this PR to upgrade xmlbuilder2 from 4.0.0 to 4.0.3.

See this package in npm:
xmlbuilder2

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/102b46c1-e36e-406c-acd1-31c8200a6c5f?utm_source=github&utm_medium=referral&page=upgrade-pr
2025-12-23 11:52:59 +00:00
snyk-bot
d218f5e9cf fix: upgrade playwright from 1.56.1 to 1.57.0
Snyk has created this PR to upgrade playwright from 1.56.1 to 1.57.0.

See this package in npm:
playwright

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/49c81d9c-12c2-4e8e-b9e8-72f98b1b595c?utm_source=github&utm_medium=referral&page=upgrade-pr
2025-12-22 10:21:25 +00:00
Nawaz Dhandala
7ef6c5fbdb chore: Bump version to 9.2.26 2025-12-19 21:56:40 +00:00
Simon Larsen
cc9372edfb Merge pull request #2192 from OneUptime/demo-improve
Demo improve
2025-12-19 21:27:34 +00:00
Nawaz Dhandala
43aae580e2 Implement feature X to enhance user experience and fix bug Y in module Z 2025-12-19 21:20:18 +00:00
Nawaz Dhandala
9d147c9aa5 fix(demo): Update compliance certification sections to use anchor links for improved navigation 2025-12-19 21:09:53 +00:00
Nawaz Dhandala
c417d87c00 fix(demo): Add customer reference call prompt with contact link 2025-12-19 21:05:13 +00:00
Nawaz Dhandala
c14708ac8d fix(demo): Update SVG path for improved icon representation in workflows section 2025-12-19 21:02:59 +00:00
Nawaz Dhandala
e92d7b3834 fix(demo): Update SVG icons for improved visual consistency and clarity 2025-12-19 21:01:07 +00:00
Nawaz Dhandala
43583c3c30 fix(demo): Adjust logo image styles for improved alignment and consistency 2025-12-19 20:57:52 +00:00
Nawaz Dhandala
51b08d34d0 fix(demo): Revise main headline for improved clarity and update logo image sizes 2025-12-19 20:56:41 +00:00
Nawaz Dhandala
b847ef6aca fix(demo): Update main headline to better reflect software operations focus 2025-12-19 20:52:27 +00:00
Nawaz Dhandala
2cf3cd7e32 fix(demo): Remove Trusted By section to streamline demo page layout 2025-12-19 20:51:28 +00:00
Nawaz Dhandala
cc389542ad fix(demo): Update section title and description to enhance clarity and engagement 2025-12-19 20:50:05 +00:00
Nawaz Dhandala
ab521336b6 fix(demo): Update section title and content to clarify demo objectives 2025-12-19 20:49:24 +00:00
Nawaz Dhandala
e796c74d6f fix(demo): Update CTA button text and link for scheduling a demo 2025-12-19 20:31:30 +00:00
Nawaz Dhandala
99eca5b8de fix(demo): Update tagline to reflect broader client base and enhance messaging 2025-12-19 20:28:47 +00:00
Nawaz Dhandala
1090f56684 fix(demo): Adjust logo vertical alignment and heights for improved visual consistency 2025-12-19 20:27:12 +00:00
Nawaz Dhandala
083408f8a5 fix(demo): Adjust logo image heights for better visual consistency in marquee 2025-12-19 20:24:00 +00:00
Nawaz Dhandala
0f2b0a40b8 fix(demo): Adjust logo marquee width and item flex properties for better layout 2025-12-19 20:12:18 +00:00
Nawaz Dhandala
fd4661301e Refactor code structure for improved readability and maintainability 2025-12-19 20:09:46 +00:00
Nawaz Dhandala
7906280c98 feat(demo): Add CSCS logo to logo marquee for enhanced branding 2025-12-19 20:02:31 +00:00
Nawaz Dhandala
0353b57711 feat(demo): Update FAQ section with security certifications and deployment options for clarity 2025-12-19 19:14:16 +00:00
Nawaz Dhandala
ba26e1a24b Remove SVG logo and replace with PNG version for Syniti in logo-roll.ejs 2025-12-19 19:09:46 +00:00
Nawaz Dhandala
4283131030 Add new SVG logo for Syniti 2025-12-19 19:03:03 +00:00
Nawaz Dhandala
154cdf6d25 feat(demo): Enhance logo marquee with improved styling and seamless looping for better visual impact 2025-12-19 18:50:24 +00:00
Nawaz Dhandala
a0f9c2892f feat(demo): Update demo messaging for clarity and improved user understanding 2025-12-19 18:40:29 +00:00
Nawaz Dhandala
3b8a91128a feat(demo): Simplify calendar widget container by removing decorative glow for a cleaner look 2025-12-19 18:38:26 +00:00
Nawaz Dhandala
63debedf65 feat(demo): Update hero section background to match design consistency with a refined dot pattern 2025-12-19 18:36:26 +00:00
Nawaz Dhandala
14dd1f16a0 feat(demo): Enhance calendar widget with new header, decorative elements, and helper text for improved user experience 2025-12-19 18:35:09 +00:00
Nawaz Dhandala
df04467ae9 feat(demo): Update demo page background and remove floating elements for a cleaner design 2025-12-19 18:30:21 +00:00
Nawaz Dhandala
6ac4591c26 feat(demo): Revise demo page with updated messaging, improved CTA, and enhanced layout for better user engagement 2025-12-19 18:26:54 +00:00
Nawaz Dhandala
945d5df750 feat(demo): Revamp FAQ section with collapsible items and improved layout for better user engagement 2025-12-19 18:22:10 +00:00
Nawaz Dhandala
1a9b3d48c0 Improve demo page layout and content; adjust typography, enhance CTA buttons, and reorganize sections for better user experience 2025-12-19 18:16:52 +00:00
Nawaz Dhandala
225480d99a feat(oss-friends): Update category icon colors for improved visual consistency 2025-12-19 18:12:01 +00:00
Nawaz Dhandala
c3f598f2f3 feat(demo): Enhance demo page with animated elements and improved messaging 2025-12-19 16:42:35 +00:00
Nawaz Dhandala
54982c5e88 feat(oss-friends): Update badge design and messaging in the OSS Friends section 2025-12-19 16:29:24 +00:00
Nawaz Dhandala
3eb465a901 feat(footer): Update CTA design and enhance messaging for clarity 2025-12-19 16:27:42 +00:00
Nawaz Dhandala
c8d091e5ef feat(footer): Revamp CTA section with updated design and messaging 2025-12-19 16:25:02 +00:00
Nawaz Dhandala
2986e94655 feat: Enhance OSS Friends page with improved category navigation and project stats display 2025-12-19 16:24:29 +00:00
Nawaz Dhandala
ddc21d6947 fix(footer): simplify Careers link by removing hiring badge 2025-12-19 16:21:53 +00:00
Nawaz Dhandala
e7ca4dc1c2 feat: Revamp OSS Friends page layout and enhance project visibility 2025-12-19 16:20:16 +00:00
Nawaz Dhandala
5136dd5412 refactor: Remove "Observability & Monitoring" category and associated projects from OSSFriends 2025-12-19 16:18:23 +00:00
Nawaz Dhandala
7642d2dd80 feat: Enhance OSS Friends page with categories and additional projects
- Updated OSSFriends data structure to include categories and website URLs.
- Modified the HomeFeatureSet to render unique categories for OSS Friends.
- Improved the oss-friends.ejs view to display projects categorized by their respective types.
- Added a hero section and stats section to highlight the number of OSS projects and categories.
- Included a call-to-action for users to submit their projects for listing.
- Updated footer links for consistency and clarity.
2025-12-19 16:13:49 +00:00
Nawaz Dhandala
01d22b0ff1 fix(footer): reduce logo height for better alignment 2025-12-19 15:51:49 +00:00
Nawaz Dhandala
2f1f446980 fix(footer): increase logo size for better visibility 2025-12-19 15:50:03 +00:00
Nawaz Dhandala
319eb98ffa Update footer logo and enhance careers link styling
- Replaced the footer logo with a new SVG image (4-gray.svg) and adjusted its height.
- Modified the careers link in the footer to increase the gap between text and hiring badge.
- Updated the hiring badge style to include a green border and a dot indicator.
2025-12-19 15:45:55 +00:00
Nawaz Dhandala
f864e389ea style: Update footer links for consistency and improved clarity 2025-12-19 15:40:57 +00:00
Nawaz Dhandala
bdc40bcd59 fix: replace em dashes with hyphens in various files for consistency
- Updated error messages in errors.ejs to use hyphens instead of em dashes.
- Modified meta description in index.ejs files to use hyphens.
- Adjusted WhatsApp setup instructions in Index.tsx to replace em dashes with hyphens.
- Changed footer description in footer.ejs to use hyphens.
- Updated various markdown and HTML files to replace em dashes with hyphens for uniformity.
2025-12-19 15:39:29 +00:00
Nawaz Dhandala
65bd7a90bd style: Enhance footer design with improved layout, content, and accessibility 2025-12-19 15:34:14 +00:00
Nawaz Dhandala
f61ee70c2c style: Update footer design for improved aesthetics and user engagement 2025-12-19 15:31:20 +00:00
Nawaz Dhandala
aafab4b313 Implement feature X to enhance user experience and fix bug Y in module Z 2025-12-19 14:17:10 +00:00
Simon Larsen
2e7ec3e5bf Merge pull request #2190 from tollercode/fix/msteams-scoped-teams-retrieval
Fix user ID handling in MicrosoftTeams service
2025-12-19 11:41:38 +00:00
Nawaz Dhandala
433482b87c chore: Bump version to 9.2.25 2025-12-19 11:03:40 +00:00
Simon Larsen
904788fb34 Merge pull request #2182 from OneUptime/better-prod--pages
Refactor code structure for improved readability and maintainability
2025-12-19 11:03:21 +00:00
Nawaz Dhandala
7f6efa0b55 style: Refactor code for consistent formatting and improved readability 2025-12-19 11:03:10 +00:00
Nawaz Dhandala
633c07323e Refactor code structure for improved readability and maintainability 2025-12-19 11:02:35 +00:00
Nils T
3a575f8666 Handle potential null user in UserService call 2025-12-19 10:37:22 +01:00
Nils T
2eed0cbfb2 Update import path for User model 2025-12-19 10:33:41 +01:00
Nils T
c4f21561ff Fix formatting of User type declaration 2025-12-19 10:22:50 +01:00
Nils T
ff3113cc30 Update user ID handling in MicrosoftTeams service 2025-12-19 10:01:28 +01:00
Nawaz Dhandala
1050cc729a style: Improve code tab layout and prevent content overflow 2025-12-18 22:59:56 +00:00
Nawaz Dhandala
50c43c6b7a fix: Update SVG icons for various programming languages in code tabs 2025-12-18 22:51:27 +00:00
Nawaz Dhandala
de088b4012 feat: Enhance syntax highlighting support by adding additional language scripts and improving code block highlighting logic 2025-12-18 22:40:12 +00:00
Nawaz Dhandala
0d5418e4a0 feat: Add request preview functionality with headers and body display in code tabs 2025-12-18 22:31:32 +00:00
Nawaz Dhandala
3ef008415e refactor: Remove Project ID placeholder from API request examples 2025-12-18 22:15:51 +00:00
Nawaz Dhandala
6560fea782 Enhance code block copy functionality and styling
- Updated the copy button in code blocks to include icons and text feedback for better user experience.
- Changed the button class from `copy-btn` to `copy-btn-response` and adjusted its styling for improved visibility and interaction.
- Modified the JavaScript function to handle icon toggling and text updates upon copying code.
- Ensured consistent styling for the copy button across different components.
2025-12-18 22:10:18 +00:00
Nawaz Dhandala
e26f3ea9d3 fix: Update layout of API reference sections for improved readability 2025-12-18 22:00:04 +00:00
Nawaz Dhandala
ce7925f947 Add code tabs for multiple programming languages in API reference
- Implemented a dynamic code tab component using EJS for rendering code examples in various languages (cURL, JavaScript, Python, Go, Ruby, Rust, PowerShell).
- Added responsive design with tab switching functionality and copy-to-clipboard feature.
- Integrated local storage to remember user’s preferred programming language across sessions.
- Enhanced accessibility with ARIA roles and attributes for better screen reader support.
2025-12-18 21:56:10 +00:00
Nawaz Dhandala
1076987cc8 feat: Implement SMS template variable handling with plain text conversion for notifications 2025-12-18 21:37:01 +00:00
Nawaz Dhandala
704456e256 fix: Update Slack message formatting to use standard Markdown syntax 2025-12-18 21:09:30 +00:00
Nawaz Dhandala
73b38b9bcb fix: Simplify SMS example formatting in notification template documentation 2025-12-18 21:02:59 +00:00
Nawaz Dhandala
f1ee95e1e2 fix: Adjust formatting for Microsoft Teams notification method check 2025-12-18 20:58:16 +00:00
Nawaz Dhandala
21acba85f4 feat: Update notification template handling for different methods and improve documentation examples 2025-12-18 20:56:53 +00:00
Nawaz Dhandala
0f7f8aafe3 Enhance status page design with floating elements and improved animations
- Added subtle grid pattern background for visual depth.
- Introduced floating status and subscriber cards with animations.
- Updated button styles for better interactivity and responsiveness.
- Enhanced text styles for improved readability and aesthetics.
- Implemented hover effects on various elements for a more engaging user experience.
- Added custom CSS animations for floating effects.
2025-12-18 19:05:19 +00:00
Nawaz Dhandala
66dd76ab6a fix: Simplify date assignment logic in timeline for scheduled maintenance events 2025-12-18 18:15:39 +00:00
Nawaz Dhandala
e86f033a8b Refactor code structure for improved readability and maintainability 2025-12-18 18:00:19 +00:00
Nawaz Dhandala
994c614d5e Add AI Agent landing page with features, capabilities, and privacy details 2025-12-18 17:47:08 +00:00
Nawaz Dhandala
c467d2ec30 feat: Rename "Reliability Copilot" to "AI Agent" in feature descriptions 2025-12-18 14:34:42 +00:00
Nawaz Dhandala
4d1cde73b3 Merge branch 'master' into better-prod--pages 2025-12-18 14:31:37 +00:00
Nawaz Dhandala
1b354cb040 chore: Bump version to 9.2.24 2025-12-18 14:08:42 +00:00
Nawaz Dhandala
c75e37b58c Merge branch 'master' of https://github.com/OneUptime/oneuptime 2025-12-18 13:59:26 +00:00
Nawaz Dhandala
384fe01ddc test: Refactor test fixtures in BaseAPI tests for consistency and clarity 2025-12-18 13:59:24 +00:00
Simon Larsen
8609fa638f Merge pull request #2188 from tollercode/fix/msteams-scoped-teams-refresh
Refactor the use app-scoped token for fetching teams per user
2025-12-18 13:58:20 +00:00
Nawaz Dhandala
992eb51eac chore: Bump version to 9.2.23 2025-12-18 13:52:56 +00:00
Nawaz Dhandala
e7f489da3b fix: Add type annotations for improved type safety in various modules 2025-12-18 13:46:22 +00:00
Nawaz Dhandala
9481d61c2f Refactor SelectFieldGenerator and SchemaConverter for improved readability and maintainability
- Updated formatting and indentation for consistency in SelectFieldGenerator.ts and SchemaConverter.ts.
- Enhanced logging messages for better debugging in generateAllFieldsSelect and findModelClass functions.
- Simplified error handling and fallback mechanisms in generateAllFieldsSelect.
- Improved type definitions and structure in Zod schema conversion functions.
- Added tests for server initialization and tool management to ensure proper functionality and error handling.
2025-12-18 13:22:18 +00:00
Nawaz Dhandala
89dd543677 feat: Remove EnableMCP decorator from Project model 2025-12-18 13:21:07 +00:00
Nawaz Dhandala
b94c6f9fb7 feat: Remove resolve_status_page_domain tool from public status page tools 2025-12-18 13:20:08 +00:00
Nawaz Dhandala
c8409da40b feat: Update MCP server to support public tools without API key 2025-12-18 13:13:53 +00:00
Nawaz Dhandala
eecf87bd0f feat: Enhance MCP tool generation with public status page tools
- Refactored ToolGenerator.ts to include generation of public status page tools.
- Added PublicStatusPageTools.ts with functions to create tools for querying public status pages.
- Implemented tools for getting overview, incidents, scheduled maintenance, announcements, and resolving status page domains.
- Updated logging and error handling for public status page tool execution.
2025-12-18 13:03:17 +00:00
Nawaz Dhandala
2cf23c203e feat: update StatusPageAPI to validate UUIDs and use domain in route parameters 2025-12-18 13:02:43 +00:00
Nawaz Dhandala
9dd2876664 feat: add UUID validation methods to ObjectID and update BaseAPI to use them 2025-12-18 12:44:24 +00:00
Nawaz Dhandala
51e6c1ce9c feat: add helper tools for resource discovery and guidance in MCP 2025-12-18 12:03:57 +00:00
Nawaz Dhandala
8e399accc1 feat: add enableMCP property and decorator to various models for enhanced MCP functionality 2025-12-18 11:49:01 +00:00
Nawaz Dhandala
53ec40a3cb refactor: enhance formatCountResponse to handle various result formats 2025-12-18 11:39:59 +00:00
Nawaz Dhandala
73c126699d refactor: update Nginx configuration for MCP endpoint handling 2025-12-18 11:19:04 +00:00
Nawaz Dhandala
e93b9f7759 feat: Implement MCP Tool Handler and Server Management
- Added ToolHandler.ts to manage tool execution and response formatting.
- Implemented session management in SessionManager.ts for handling API keys and session data.
- Created MCPServer.ts for initializing and managing the MCP server instance.
- Developed SelectFieldGenerator.ts to generate select field objects for API queries.
- Introduced SchemaConverter.ts for converting Zod schemas to JSON Schema format.
- Built ToolGenerator.ts to generate MCP tools for OneUptime models, including CRUD operations.
- Enhanced logging throughout the code for better traceability and debugging.
2025-12-17 18:01:21 +00:00
Nawaz Dhandala
6cdc9f9a2b refactor: update Dockerfile for Node.js version and improve nodemon configuration 2025-12-17 17:46:40 +00:00
Nawaz Dhandala
2fd7dd136d refactor: add CORS support and handle root endpoint in MCP routes 2025-12-17 17:43:41 +00:00
Nawaz Dhandala
fd0c84d6b9 refactor: update cost display from per million to per 1000 tokens 2025-12-17 17:30:20 +00:00
Nils T
df78d71802 Fix logger.debug formatting in MicrosoftTeams.ts 2025-12-17 14:04:53 +01:00
Nawaz Dhandala
7ebbfb062a refactor: remove playwright dependencies from Dockerfiles 2025-12-17 12:38:53 +00:00
Nawaz Dhandala
60b2ee0b45 refactor: remove playwright dependencies from Dockerfile 2025-12-17 12:27:13 +00:00
Nawaz Dhandala
e2cde12c2f refactor: add QEMU_CPU environment variable to Docker image deployment jobs 2025-12-17 12:05:52 +00:00
Nils T
849326d54e Refactor the use app-scoped token for fetching teams per user 2025-12-17 12:51:40 +01:00
Nawaz Dhandala
ab600ee29c refactor: consolidate MCP Docker image deployment steps in release workflows 2025-12-17 11:07:10 +00:00
Nawaz Dhandala
cdd4ea1644 refactor: rename MCP server references to use a consistent naming convention 2025-12-17 10:45:31 +00:00
Nawaz Dhandala
694f20f231 chore: update version number to 9.2.22 2025-12-16 21:58:50 +00:00
Nawaz Dhandala
6a0db02101 refactor: improve code formatting and enhance type definitions in MCP server 2025-12-16 21:50:32 +00:00
Nawaz Dhandala
14ebd5450b refactor: enhance MCP server documentation for VS Code integration with GitHub Copilot 2025-12-16 21:42:36 +00:00
Nawaz Dhandala
b27863ed37 refactor: remove multiple instances configuration section from MCP server documentation 2025-12-16 21:36:53 +00:00
Nawaz Dhandala
8a6be6960b refactor: update API service initialization to use environment variables for URL configuration 2025-12-16 21:32:18 +00:00
Nawaz Dhandala
af155d8c43 refactor: replace Server with McpServer for improved functionality and clarity 2025-12-16 21:29:22 +00:00
Nawaz Dhandala
449549e1f9 refactor: update MCP server transport to Streamable HTTP and enhance session management 2025-12-16 21:27:10 +00:00
Nawaz Dhandala
da0d3b2e34 refactor(tests): update mock event type for preventDefault in Breadcrumbs tests 2025-12-16 21:14:18 +00:00
Nawaz Dhandala
39cc8bcb3f Merge branch 'release' of https://github.com/OneUptime/oneuptime into release 2025-12-16 20:54:39 +00:00
Nawaz Dhandala
136c9bca26 refactor(tests): add type annotations for better clarity and maintainability 2025-12-16 20:41:15 +00:00
Nawaz Dhandala
8998faac57 refactor: improve code readability by normalizing whitespace and enhancing comments in tests 2025-12-16 20:35:34 +00:00
Nawaz Dhandala
9c3d21fec4 chore: bump version to 9.2.21 2025-12-16 20:27:53 +00:00
Nawaz Dhandala
1a33d51190 Refactor tests for HashedString, Dropdown, FilePicker, and API
- Updated HashedString tests to include async handling and additional cases for hashing with salts.
- Enhanced Dropdown tests to verify value prop display, multiselect functionality, and placeholder handling.
- Revised FilePicker tests to cover rendering, file uploads, error handling, and read-only mode, replacing skipped tests with new implementations.
- Added new tests for API class methods, including PATCH requests and error message handling, while removing outdated instance method tests.
2025-12-16 20:27:35 +00:00
Nawaz Dhandala
37884050f8 test: Skip FilePicker tests that check for image rendering due to component changes 2025-12-16 20:09:52 +00:00
Nawaz Dhandala
737ba1b242 test: Skip outdated FilePicker and API tests due to component redesign and method changes 2025-12-16 20:02:29 +00:00
Nawaz Dhandala
ed43f22815 test: Update BaseAPI tests to use DEFAULT_LIMIT for limit=0; normalize whitespace in StatementGenerator tests; refine FilePicker tests to use text for dropzone; enhance uuid mock for valid UUID generation 2025-12-16 19:58:02 +00:00
Nawaz Dhandala
9508c31a1e test: Update cookie utility tests to include default path and sameSite options; modify modal tests for responsive width; enhance navbar tests with mock navigation location; adjust ordered states list test for bar loader role 2025-12-16 19:52:09 +00:00
Nawaz Dhandala
fd47a72d54 test: Skip database-dependent test suites and update mock configurations 2025-12-16 19:18:28 +00:00
Nawaz Dhandala
6acf9fe3cf feat: Introduce AI templates for incident postmortem, public notes, and internal notes 2025-12-16 19:03:25 +00:00
Nawaz Dhandala
3e8ad4c05c fix: Update error message for AI balance recharge instructions 2025-12-16 18:48:12 +00:00
Simon Larsen
ac1d052f35 Merge pull request #2187 from OneUptime/master
fix: Remove unused data source items from AI postmortem generation
2025-12-16 18:33:55 +00:00
Nawaz Dhandala
da21231d9b chore: Bump version to 9.2.20 2025-12-16 18:32:23 +00:00
Nawaz Dhandala
c14976bac8 feat: Add ejs as a dependency in package.json and package-lock.json 2025-12-16 18:32:00 +00:00
Nawaz Dhandala
b7c3070204 feat: Add markdown table conversion for Slack formatting 2025-12-16 18:02:52 +00:00
Nawaz Dhandala
f5b18a0a3d fix: Remove unused data source items from AI postmortem generation 2025-12-16 17:50:02 +00:00
Nawaz Dhandala
6cfb7bf965 fix: Update internal note generation to use correct type for API response 2025-12-16 16:11:25 +00:00
Nawaz Dhandala
1526b59ff5 refactor: Clean up import statements and improve code formatting in API files 2025-12-16 16:02:24 +00:00
Nawaz Dhandala
4966468d99 fix: Change button style for AI generation to outline 2025-12-16 15:58:35 +00:00
Nawaz Dhandala
b4357d8e5b feat: Enhance Domain validation with comprehensive checks and regex implementation 2025-12-16 15:55:30 +00:00
Nawaz Dhandala
1895bffb95 feat: Update AI note generation for alerts, incidents, and scheduled maintenance with structured request data 2025-12-16 15:53:16 +00:00
Nawaz Dhandala
8d79a38a1e refactor: Remove maxTokens parameter from LLMCompletionRequest and related methods 2025-12-16 15:39:43 +00:00
Nawaz Dhandala
bdd894f57e feat: Add maxTokens parameter to LLMCompletionRequest and update related methods 2025-12-16 15:33:33 +00:00
Nawaz Dhandala
64a584dd76 fix: Add peer dependency flag to various packages in package-lock.json 2025-12-16 15:29:37 +00:00
Nawaz Dhandala
4b967375aa refactor: Update type annotations for note templates and API response in InternalNote 2025-12-16 15:25:23 +00:00
Nawaz Dhandala
35441d90a8 feat: Add AI-generated note functionality for alerts, incidents, and scheduled maintenance
- Implemented GenerateFromAIModal in InternalNote and PublicNote components for Alerts, Incidents, and Scheduled Maintenance.
- Added API endpoints for generating notes from AI for alerts and scheduled maintenance.
- Created context builders for alerts and scheduled maintenance to format data for AI processing.
- Enhanced internal and public note generation with AI capabilities, allowing for automated note creation based on existing data.
2025-12-16 15:18:04 +00:00
Nawaz Dhandala
ea2b1192ff refactor: Correct type annotation for costInUSD in LlmPage 2025-12-16 14:35:59 +00:00
Nawaz Dhandala
9dc2e8e04d refactor: Correct type annotations for cost calculations in LlmPage 2025-12-16 14:35:17 +00:00
Nawaz Dhandala
56e2baeb44 refactor: Update LlmPage description based on BILLING_ENABLED status 2025-12-16 14:32:54 +00:00
Nawaz Dhandala
907379ef23 refactor: Add billing cost display logic in LlmPage based on BILLING_ENABLED 2025-12-16 14:31:24 +00:00
Nawaz Dhandala
afb3de360b refactor: Add billing enabled check in AIBillingAPI and AIBillingService 2025-12-16 14:28:09 +00:00
Nawaz Dhandala
a1587c33e7 refactor: Add peer property to multiple dependencies in package-lock.json 2025-12-16 14:20:39 +00:00
Nawaz Dhandala
f01227c997 refactor: Remove border styling from MarkdownEditor in GenerateFromAIModal and update icon color handling in Modal component 2025-12-16 14:10:50 +00:00
Nawaz Dhandala
ce50121696 refactor: Comment out AI Logs SideMenuItem in multiple SideMenu components 2025-12-16 14:03:01 +00:00
Nawaz Dhandala
e109b01ae5 refactor: Move LLM Providers link to the end of the AI section in DashboardSideMenu 2025-12-16 14:02:53 +00:00
Nawaz Dhandala
9bd2dd0942 refactor: Update button style to PRIMARY in GenerateFromAIModal and IncidentPostmortem 2025-12-16 14:00:47 +00:00
Nawaz Dhandala
0fba2bb8bf refactor: Simplify AILoader usage in GenerateFromAIModal and remove unused data source prop 2025-12-16 13:58:43 +00:00
Nawaz Dhandala
3ca7d37c49 refactor: Remove unused data source info section from GenerateFromAIModal 2025-12-16 13:56:41 +00:00
Nawaz Dhandala
78c4a7cfc5 refactor: Set default selected template ID and simplify template options mapping 2025-12-16 13:55:36 +00:00
Nawaz Dhandala
2e7fdd53a5 Merge remote-tracking branch 'origin/incident-ai' 2025-12-16 13:33:18 +00:00
Nawaz Dhandala
6335887d62 feat: Reduce npm fetch retry timeout values in Dockerfiles 2025-12-16 13:30:12 +00:00
Nawaz Dhandala
3797f258e8 refactor: Update inputSchema type to JSONSchema and improve route setup with forEach 2025-12-16 12:15:37 +00:00
Nawaz Dhandala
8e628d0a4f refactor: Remove unused properties from AILoaderProps and improve type definitions in LlmLogsTable and MCP Index 2025-12-16 12:13:27 +00:00
Nawaz Dhandala
858710cf1b refactor: Clean up imports and improve formatting across multiple files 2025-12-16 12:11:48 +00:00
Nawaz Dhandala
5cbce238b1 refactor: Update AILoaderProps to explicitly define optional properties and enhance GenerateFromAIModal with default templates and improved template selection 2025-12-16 12:06:04 +00:00
Nawaz Dhandala
276f79057d feat: Enhance incident postmortem generation with template support and clearer instructions 2025-12-16 11:59:44 +00:00
Nawaz Dhandala
c50aa35064 refactor: Simplify AILoader component by removing unused icons and stages, enhancing loading message display 2025-12-16 11:57:32 +00:00
Nawaz Dhandala
87ab8b6c40 feat: Add visibility condition for error view button in LlmLogsTable 2025-12-16 11:54:24 +00:00
Nawaz Dhandala
06f248717d refactor: Remove outdated MCP documentation and update navigation for AI integration 2025-12-16 11:51:20 +00:00
Nawaz Dhandala
9b714bbe29 refactor: Improve type definitions and enhance JSON schema handling in MCP services 2025-12-16 11:42:56 +00:00
Nawaz Dhandala
2fb8239fe9 refactor: Simplify tsconfig structure in jest.config.json 2025-12-16 11:34:02 +00:00
Nawaz Dhandala
fbdedaacc3 chore: update dependencies in package.json
- Upgraded @modelcontextprotocol/sdk from ^0.6.0 to ^1.25.0
- Updated ts-node from ^10.9.1 to ^10.9.2
- Upgraded devDependencies:
  - @types/jest from ^27.5.0 to ^29.5.14
  - @types/node from ^17.0.31 to ^22.15.21
  - jest from ^28.1.0 to ^29.7.0
  - nodemon from ^2.0.20 to ^3.1.11
  - ts-jest from ^28.0.2 to ^29.4.6
  - typescript from ^5.8.3 to ^5.9.3
2025-12-16 11:33:05 +00:00
Nawaz Dhandala
4c577c7dfa fix: Allow any type for request parameters in tool call handler 2025-12-16 11:30:50 +00:00
Nawaz Dhandala
f15f797d43 refactor: Replace MCP server implementation with a streamlined structure and improved logging 2025-12-16 11:27:02 +00:00
Nawaz Dhandala
f92a109f3d feat: Add MCP service configuration with volumes and debugging port 2025-12-16 11:24:29 +00:00
Nawaz Dhandala
5eca1a5d04 refactor: Remove maxTokens from LLMCompletionRequest and related usages 2025-12-16 11:21:47 +00:00
Nawaz Dhandala
091a766c29 docs: Update MCP documentation for improved clarity and configuration details 2025-12-16 11:19:44 +00:00
Nawaz Dhandala
f2906f59a2 refactor: Simplify server run logic and remove unused stdio mode 2025-12-16 11:06:02 +00:00
Nawaz Dhandala
83107857bd feat: Add MCP service configuration and related environment variables 2025-12-16 11:04:56 +00:00
Nawaz Dhandala
73d2cab46e refactor: update import paths to use relative imports for consistency 2025-12-16 10:50:16 +00:00
Nawaz Dhandala
0563970eb6 refactor: update package dependencies and tsconfig settings
- Changed dependency from "@oneuptime/common" to a local file reference "Common".
- Re-enabled experimental decorators in tsconfig.json.
- Cleaned up tsconfig.json formatting for better readability.
- Ensured strict type-checking options are clearly defined in tsconfig.json.
2025-12-16 10:50:09 +00:00
Nawaz Dhandala
2818146543 feat: Introduce AILoader component for enhanced loading experience during AI content generation 2025-12-16 10:33:04 +00:00
Nawaz Dhandala
6371ac4e36 feat: Refactor AI logging service by renaming AILogService to AIService and updating references in IncidentAPI 2025-12-16 10:28:52 +00:00
Nawaz Dhandala
cc077aff99 feat: Conditionally display cost settings based on billing configuration in LlmProviders settings 2025-12-16 10:27:21 +00:00
Nawaz Dhandala
5652298f38 feat: Implement hard delete for LlmLog items older than 3 days when billing is enabled; refactor LlmLogsTable by removing unused fields and action buttons 2025-12-16 10:25:31 +00:00
Nawaz Dhandala
931a5f9e63 feat: Add AI Logs section to Scheduled Maintenance with routing and component integration 2025-12-15 21:43:26 +00:00
Nawaz Dhandala
bc05f75304 feat: Refactor LlmLog model by removing input and output tokens, and update related migrations and table display 2025-12-15 21:38:27 +00:00
Nawaz Dhandala
60955f0e1c fix: Update error message for missing payment methods to provide clearer instructions 2025-12-15 21:35:12 +00:00
Nawaz Dhandala
863737c2a3 feat: Conditionally display cost column in LlmLogsTable based on billing configuration 2025-12-15 21:32:06 +00:00
Nawaz Dhandala
cac0ef7155 feat: Update cost display in LlmLogsTable to show USD instead of cents 2025-12-15 21:30:59 +00:00
Nawaz Dhandala
b361d854bb feat: Add LlmLog API integration to BaseAPIFeatureSet for enhanced logging capabilities 2025-12-15 21:29:07 +00:00
Nawaz Dhandala
ee83583044 fix: Add public access modifier to name property in MigrationName1765830758857 class 2025-12-15 20:33:42 +00:00
Nawaz Dhandala
632849b334 feat: Add LlmLog table and related constraints for enhanced logging functionality 2025-12-15 20:33:09 +00:00
Nawaz Dhandala
17ba51a359 feat: Enhance type definitions and improve type safety in various components and services 2025-12-15 20:30:33 +00:00
Nawaz Dhandala
bb485070af style: Improve code formatting and readability in AILogs components 2025-12-15 20:19:06 +00:00
Nawaz Dhandala
393e01eb9e feat: Update AILogService and IncidentAPI to handle optional userId and improve logging in LlmLogsTable 2025-12-15 20:18:17 +00:00
Nawaz Dhandala
035edaf435 feat: Add AI Logs functionality with LLM logging and management
- Introduced LlmLog model to track AI API calls, including details like provider, tokens used, cost, and status.
- Implemented AILogService to handle AI log creation and management, including billing checks and log updates.
- Created LlmLogsTable component for displaying AI logs in the dashboard with filtering and modal views for request/response details.
- Added new routes and pages for viewing AI logs in the context of incidents, alerts, and settings.
- Updated PageMap and RouteMap to include new AI log views.
- Enhanced error handling and logging for AI API interactions.
2025-12-15 20:13:36 +00:00
Nawaz Dhandala
8fda0325d9 feat: Integrate AI template fetching and handling in IncidentPostmortem component 2025-12-15 19:03:26 +00:00
Nawaz Dhandala
93d9c045e2 style: Improve code formatting and readability across multiple files 2025-12-15 19:01:02 +00:00
Nawaz Dhandala
db895a0f11 feat: Enhance channel message retrieval for Slack and Microsoft Teams 2025-12-15 19:00:36 +00:00
Nawaz Dhandala
ab1d357625 feat: Add data source items for AI generation in IncidentPostmortem 2025-12-15 18:46:38 +00:00
Nawaz Dhandala
2515da12aa feat: Add AI generation functionality for postmortem notes in IncidentPostmortem 2025-12-15 18:42:30 +00:00
Nawaz Dhandala
ac12a33405 feat: Refactor AI context handling by introducing IncidentAIContextBuilder 2025-12-15 18:41:12 +00:00
Nawaz Dhandala
4cfebb5e49 feat: Add LLMService for handling multiple LLM provider completions 2025-12-15 18:38:17 +00:00
Nawaz Dhandala
b9ae827c29 feat: Implement AI-driven postmortem generation endpoint in IncidentAPI 2025-12-15 18:38:02 +00:00
Nawaz Dhandala
f69c81e815 feat: Add AI postmortem generation method to IncidentService 2025-12-15 18:37:15 +00:00
Nawaz Dhandala
012228d9d1 feat: Add telemetry capture to getLLMProviderForProject method 2025-12-15 18:28:45 +00:00
Nawaz Dhandala
8efe2284f9 feat: Rename "AI Billing" to "AI Credits" in SettingsRoutePath 2025-12-15 16:52:49 +00:00
Nawaz Dhandala
530a5b4f12 feat: Update "AI Billing" to "AI Credits" in SideMenu and Breadcrumbs 2025-12-15 16:51:28 +00:00
Nawaz Dhandala
9fe3209db6 feat: Add GitHub App configuration variables to docker-compose 2025-12-15 14:57:30 +00:00
Nawaz Dhandala
11087350de feat: Add migration for AI-related fields in Project and OnCallDutyPolicyScheduleLayer 2025-12-15 14:52:06 +00:00
Nawaz Dhandala
aebe606374 feat: Add migration for new AI-related fields in Project and OnCallDutyPolicyScheduleLayer 2025-12-15 14:51:12 +00:00
Nawaz Dhandala
37b492beb2 Merge branch 'master' of https://github.com/OneUptime/oneuptime 2025-12-15 14:49:14 +00:00
Nawaz Dhandala
95136cd3c0 Refactor code structure for improved readability and maintainability 2025-12-15 14:48:51 +00:00
Simon Larsen
1653e7626c Merge pull request #2181 from omri-shilton/master
Added nginx service annotations and load balancer class
2025-12-15 14:46:19 +00:00
Nawaz Dhandala
33f7ce129d chore: Bump version to 9.2.17 2025-12-15 13:35:12 +00:00
Nawaz Dhandala
464a4ff46a feat: Add complete guide for OneUptime Terraform Provider with installation, configuration, and best practices 2025-12-15 13:26:38 +00:00
Nawaz Dhandala
8491c89a0b fix: Remove unnecessary line breaks in descriptions for AIBillingSettings component 2025-12-15 13:12:37 +00:00
Nawaz Dhandala
0f7ffb7a66 feat: Implement AI Billing feature with recharge functionality and UI integration 2025-12-15 12:57:32 +00:00
omrishilton
b53aae5516 Added nginx service annotations and load balancer class for use in AWS NLB 2025-12-15 14:48:26 +02:00
Nawaz Dhandala
2c7d3562f6 feat: Update publish script to handle existing tags gracefully and improve user feedback 2025-12-15 12:41:02 +00:00
Nawaz Dhandala
9d95232e69 feat: Enhance footer design with gradient background, updated social links, and improved accessibility 2025-12-15 12:29:17 +00:00
Nawaz Dhandala
62e5c944dd feat: Add enableAutomaticImprovements and maxOpenPullRequests fields to ServiceCatalogCodeRepository model and update related migrations and UI 2025-12-15 12:29:03 +00:00
Nawaz Dhandala
af21ea967a feat: Refactor migration for ServiceCatalogCodeRepository and update related routes 2025-12-15 10:35:29 +00:00
Nawaz Dhandala
a9046071cf feat: Add ServiceCatalogCodeRepositoryService and integrate with BaseAPI 2025-12-13 14:32:09 +00:00
Nawaz Dhandala
0b6a59ce1d feat: Implement Service Catalog Code Repository model and related routes 2025-12-13 13:47:22 +00:00
Nawaz Dhandala
f1c7f0a32e feat: Add base64 decoding for GitHub App private key 2025-12-13 12:42:56 +00:00
Nawaz Dhandala
78c6bb82aa feat: Add migration for CodeRepository and CodeRepositoryLabel tables 2025-12-13 12:28:52 +00:00
Nawaz Dhandala
fc259cb0b2 docs: Update GitHub integration instructions to use base64 encoded private key 2025-12-13 12:26:25 +00:00
Nawaz Dhandala
b0f5db650c docs: Update GitHub integration documentation for clarity and completeness 2025-12-13 12:24:14 +00:00
Nawaz Dhandala
229987db94 chore: Update CodeRepository component for better performance 2025-12-13 12:24:09 +00:00
Nawaz Dhandala
e53af4d49e feat: Add Code Repository API integration 2025-12-13 12:15:05 +00:00
Nawaz Dhandala
962398a947 fix: Remove unnecessary background gradient from introduction section 2025-12-13 12:08:49 +00:00
Nawaz Dhandala
8d6f301075 Refactor code structure for improved readability and maintainability 2025-12-13 12:06:47 +00:00
Nawaz Dhandala
3a93181e89 Merge branch 'master' into code-repo 2025-12-13 09:22:34 +00:00
Nawaz Dhandala
518fe45c4b chore: Bump version to 9.2.16 2025-12-13 09:22:09 +00:00
Nawaz Dhandala
488a30a2c1 feat: Add migration for CodeRepository and CodeRepositoryLabel tables 2025-12-12 22:56:57 +00:00
Nawaz Dhandala
ffcfa93ed3 fix: Update GitHub callback URL in documentation and API to use state parameter 2025-12-12 22:55:28 +00:00
Nawaz Dhandala
467d35889f feat: Add GitHub Integration documentation and navigation link 2025-12-12 22:44:02 +00:00
Nawaz Dhandala
6681640b5f refactor: Clean up code formatting and improve readability in GitHub API and related files 2025-12-12 22:38:58 +00:00
Nawaz Dhandala
f65197a0bf feat: Add Code Repository management features
- Implement CodeRepositoryService for database interactions.
- Enhance GitHub utility functions for app authentication and repository management.
- Introduce new permissions for Code Repository actions (create, delete, edit, read).
- Create Code Repository pages and routes in the dashboard.
- Add side menu and breadcrumbs for Code Repository navigation.
- Implement settings and delete functionality for Code Repositories.
- Update Helm chart to include GitHub App configuration options.
- Modify example environment configuration to include GitHub App credentials.
2025-12-12 22:37:01 +00:00
Nawaz Dhandala
7c06b22e9d feat: Update example secret value in MonitorSecret model for clarity 2025-12-12 22:28:04 +00:00
Nawaz Dhandala
bb2bd2dde9 feat: Update subject line formatting for incident notifications 2025-12-12 22:25:06 +00:00
Nawaz Dhandala
7d468be1e3 feat: Add previous state duration details to alert, incident, and scheduled maintenance notifications 2025-12-12 21:57:50 +00:00
Nawaz Dhandala
2b0b66a606 feat: Add conditional rendering for table permissions in model view 2025-12-12 21:31:31 +00:00
Nawaz Dhandala
aa0105a8e2 Refactor example formatting in database models for consistency
- Updated example strings in various database model files to use consistent line breaks for improved readability.
- Ensured that all example properties are formatted uniformly across models, enhancing maintainability and clarity.
2025-12-12 21:23:31 +00:00
Nawaz Dhandala
ca5c31fc32 Add example values to various fields in Telemetry and User models for better documentation
- Updated TelemetryException model with example values for Project, Telemetry Service, Exception Message, Stack Trace, Exception Type, Finger Print, Created by User, and more.
- Enhanced TelemetryIngestionKey model with example values for Project, Name, Description, Created by User, and more.
- Improved TelemetryUsageBilling model with example values for Project, Day, Product Type, Data Ingested, Total Cost, and more.
- Added example values to UserCall model for Project ID, Phone, User ID, Created by User ID, and more.
- Included example values in UserEmail model for Project ID, Email, User ID, Created by User ID, and more.
- Updated UserNotificationRule model with example values for Project ID, User ID, Created by User ID, and various notification types.
- Enhanced UserNotificationSetting model with example values for Project ID, User ID, and various notification settings.
- Improved UserOnCallLog model with example values for User ID, Project ID, On-Call Policy ID, and more.
- Added example values to UserSMS model for Project ID, Phone, User ID, Created by User ID, and more.
2025-12-12 21:10:10 +00:00
Nawaz Dhandala
e928328bbb Add example values to various database models for improved API documentation
- Updated MonitorStatus, OnCallDutyPolicy, Probe, Project, ScheduledMaintenance, ScheduledMaintenanceInternalNote, ServiceCatalog, StatusPage, StatusPageAnnouncement, StatusPageDomain, StatusPageGroup, StatusPageHeaderLink, StatusPageResource, StatusPageSubscriber, Team, TelemetryService, User, and Workflow models to include example values for better clarity in API documentation.
- Added example fields to TableColumnMetadata interface to support documentation generation.
2025-12-12 20:49:28 +00:00
Nawaz Dhandala
f502548dff Implement feature X to enhance user experience and optimize performance 2025-12-12 19:31:50 +00:00
Nawaz Dhandala
7c05566167 fix: Update footer layout for improved responsiveness and consistency
feat: Add conditional rendering for API permissions in model documentation
2025-12-12 19:11:48 +00:00
Nawaz Dhandala
9803872917 feat: Enhance mobile navigation with toggle functionality and improved layout 2025-12-12 19:07:39 +00:00
Nawaz Dhandala
698d4c020a fix: Update footer and navigation for improved accessibility and visual consistency 2025-12-12 19:00:18 +00:00
Nawaz Dhandala
e69f32e244 Refactor API documentation layout and styles
- Updated the permissions page to enhance the layout with a hero section and improved typography.
- Refined the index page structure for better responsiveness and alignment.
- Enhanced code block presentation with a copy button and improved styling.
- Redesigned the footer to include a more visually appealing open-source section and updated social media links.
- Improved the head partial with updated styles and scripts for better performance and aesthetics.
- Revamped the navigation bar for a cleaner look and better user experience, including updated links and hover effects.
2025-12-12 18:54:06 +00:00
Nawaz Dhandala
04e07da274 feat: Update color scheme to use indigo for improved visual consistency across components 2025-12-12 17:58:13 +00:00
Nawaz Dhandala
a015869447 Enhance documentation UI and error handling
- Improved the layout and styling of the main documentation page, including a custom scrollbar for the sidebar and a copy button for code blocks.
- Updated the mobile navigation for better accessibility and user experience.
- Redesigned the 404 Not Found and 500 Server Error pages with clearer messaging and improved visuals.
- Enhanced the content presentation in the articles with better typography and spacing.
- Added new meta tags for improved SEO in the head section.
- Refined the header and navigation components for a more cohesive look and feel.
2025-12-12 17:57:00 +00:00
Nawaz Dhandala
cab5630ab3 feat: Update LLM Providers page for improved clarity and consistency in incident notes 2025-12-12 17:15:49 +00:00
Nawaz Dhandala
41f25269dc feat: Update description for Global LLM Providers to clarify usage 2025-12-12 15:05:18 +00:00
Nawaz Dhandala
fdb33d9375 feat: Remove unused Pill component and related status fields in LLM Providers settings 2025-12-12 14:44:16 +00:00
Nawaz Dhandala
1aa5074ca2 feat: Update icon for Global LLM Providers in SideMenu to improve clarity 2025-12-12 14:42:34 +00:00
Nawaz Dhandala
92d316d557 feat: Replace Icon with Pill component for default indicators in LLM Provider views 2025-12-12 14:32:06 +00:00
Nawaz Dhandala
e56fe553d3 feat: Replace Pill components with Icon for default indicators and add a Card for LLM Providers description 2025-12-12 14:28:31 +00:00
Nawaz Dhandala
e4736c4f45 feat: Add new migration and update open-source indicators in index.ejs for consistency 2025-12-12 14:15:30 +00:00
Nawaz Dhandala
145f164c21 feat: Update APM icon in product-tabs.ejs for improved visual representation 2025-12-12 14:07:56 +00:00
Nawaz Dhandala
c9382817e3 feat: Update APM description in features-table.ejs for improved clarity 2025-12-12 14:06:16 +00:00
Nawaz Dhandala
8709120d66 feat: Update APM icon in index.ejs for improved visual representation 2025-12-12 14:01:47 +00:00
Nawaz Dhandala
722a74f46b feat: Update feature descriptions in index.ejs for improved clarity and engagement 2025-12-12 14:00:04 +00:00
Nawaz Dhandala
0e2629473a feat: Update feature descriptions in index.ejs for enhanced clarity and engagement 2025-12-12 13:58:44 +00:00
Nawaz Dhandala
98031222bc feat: Update main headline and subheadline in index.ejs for improved clarity and engagement 2025-12-12 13:56:12 +00:00
Nawaz Dhandala
db3871aab6 feat: Update feature labels and descriptions in index.ejs for clarity and consistency 2025-12-12 13:05:51 +00:00
Nawaz Dhandala
a892c38905 refactor: Add public access modifier to 'name' property in migration classes and specify type for itemsToUpdate in LlmProviderService 2025-12-12 12:57:15 +00:00
Nawaz Dhandala
06d3614bc8 refactor: Simplify array syntax for 'AI' links in DocsNav 2025-12-12 12:55:18 +00:00
Nawaz Dhandala
3f651d52a3 feat: Refactor LlmProvider to rename 'isEnabled' to 'isDefault' and remove related fields from UI 2025-12-12 12:54:12 +00:00
Nawaz Dhandala
dcf00d313c feat: Add 'isDefault' field to LlmProvider and implement logic for default provider handling 2025-12-12 12:51:42 +00:00
Nawaz Dhandala
e6f9f2fe59 feat: Remove unused fields from LlmProvider selection in API 2025-12-12 12:43:16 +00:00
Nawaz Dhandala
fa29b32cf0 feat: Update LlmPage to replace 'Provider' and 'Model' titles with 'Description' 2025-12-12 12:41:48 +00:00
Nawaz Dhandala
7dc229bf7e feat: Enhance LLM provider documentation with detailed capabilities and setup instructions 2025-12-12 12:31:57 +00:00
Nawaz Dhandala
8db2f4a962 feat: Update Icon component SVG path for improved rendering 2025-12-12 12:29:45 +00:00
Nawaz Dhandala
ddd372a9b0 feat: Add migration to drop Copilot and CodeRepository related tables 2025-12-12 11:57:33 +00:00
Nawaz Dhandala
7f41ebe697 feat: Add LlmProvider migration and update OnCallDutyPolicyScheduleLayer defaults 2025-12-12 11:52:52 +00:00
Nawaz Dhandala
e8d282ec06 feat: Update GitHub stars fetching logic and improve rendering in homepage 2025-12-12 11:31:10 +00:00
Nawaz Dhandala
0eeea3b76c fix: Correct string quotes and improve formatting in LLM provider settings 2025-12-12 11:28:21 +00:00
Nawaz Dhandala
b5eee5968d Merge branch 'master' of https://github.com/OneUptime/oneuptime 2025-12-12 11:14:53 +00:00
Nawaz Dhandala
02b6ee5985 feat: Add GitHub stars count feature to homepage 2025-12-12 11:14:45 +00:00
Simon Larsen
fea6bf2196 Merge pull request #2177 from OneUptime/chore/npm-audit-fix
chore: npm audit fix
2025-12-12 11:11:49 +00:00
Nawaz Dhandala
6a9a9bcba6 refactor: Improve code formatting and readability across multiple files 2025-12-12 11:09:02 +00:00
Nawaz Dhandala
775d875174 Refactor LLM settings to LLM Providers
- Updated terminology from "LLMs" to "LLM Providers" across the application for clarity.
- Renamed related routes and page maps to reflect the new terminology.
- Removed deprecated LlmView and Llms components, replacing them with LlmProviderView and LlmProviders components.
- Introduced new settings page for managing global LLM Providers with appropriate UI components.
- Updated side menu and routing to accommodate the changes in naming and structure.
2025-12-12 11:07:53 +00:00
Nawaz Dhandala
165952255c feat: Refactor LLM to LLM Provider
- Replaced all instances of LLM with LLM Provider in the codebase.
- Created a new LlmProvider model to manage LLM Provider configurations.
- Updated API endpoints and services to handle LLM Providers instead of LLMs.
- Modified UI components to reflect the changes from LLM to LLM Provider, including table names, descriptions, and messages.
- Removed the old LLM model and service files to streamline the codebase.
2025-12-12 11:04:59 +00:00
simlarsen
5dbef764df chore: npm audit fix 2025-12-12 01:53:37 +00:00
Nawaz Dhandala
60a2a76469 Merge branch 'master' of https://github.com/OneUptime/oneuptime 2025-12-11 23:11:04 +00:00
Nawaz Dhandala
3387f3ddfc fix: Update wording for clarity in contributing and support sections 2025-12-11 23:06:24 +00:00
Nawaz Dhandala
2a172bfcf7 feat: Add new migration for LLM table to schema 2025-12-11 22:40:34 +00:00
Nawaz Dhandala
431d49f547 feat: Add migration for LLM table with necessary constraints 2025-12-11 22:39:56 +00:00
Nawaz Dhandala
4dd806eaf8 feat: Add new features to the homepage grid for enhanced service visibility 2025-12-11 22:28:42 +00:00
Nawaz Dhandala
1f9805441e feat: Enhance homepage layout and content for improved user engagement 2025-12-11 22:25:58 +00:00
Nawaz Dhandala
b72c9bf087 refactor: Rename menu items in SideMenu for clarity and reorganization 2025-12-11 22:18:49 +00:00
Simon Larsen
ef537ea791 Merge pull request #2175 from OneUptime/ai-llm
docs: Update quick start instructions in README to use 'npm run start…
2025-12-11 22:13:36 +00:00
Nawaz Dhandala
37ee6eb74a docs: Update quick start instructions in README to use 'npm run start' instead of 'docker compose up -d' 2025-12-11 22:12:31 +00:00
Simon Larsen
e72af99a39 Merge pull request #2174 from OneUptime/ai-llm
Ai llm
2025-12-11 22:11:06 +00:00
Nawaz Dhandala
f1004d2d75 chore: Update license references from MIT to Apache 2.0 in footer, contributing guide, and README 2025-12-11 22:04:19 +00:00
Nawaz Dhandala
73225a06d6 docs: Revise README to enhance clarity and structure, adding new sections and updating features 2025-12-11 22:00:24 +00:00
Nawaz Dhandala
355c351203 docs: Update README to rename 'Coming Soon' section to 'Error Tracking' and provide description 2025-12-11 21:58:44 +00:00
Nawaz Dhandala
8f8704e2d0 Remove AI Copilot feature and related components
- Deleted the CodeRepositoryPage component and its associated routes.
- Removed AI Copilot breadcrumbs and references from the PageMap and RouteMap.
- Eliminated the LLM Server deployment documentation and introduction content.
- Cleaned up related data migrations and jobs for Copilot actions.
- Updated navigation to exclude Copilot links.
2025-12-11 21:52:49 +00:00
Nawaz Dhandala
c617372e37 feat: Add repository field to package.json files across the project 2025-12-11 21:31:52 +00:00
Nawaz Dhandala
27a2fdc794 feat: Add Brain icon to IconProp and update SideMenu to use it 2025-12-11 20:47:26 +00:00
Nawaz Dhandala
94b107beb3 feat: Add LLM (Large Language Model) settings and management features
- Introduced new settings page for managing global LLM configurations.
- Added routes and permissions for LLM management in the admin dashboard.
- Implemented LLM model with necessary fields and access controls.
- Created API endpoints for fetching global LLMs.
- Developed UI components for displaying and editing LLM details.
- Integrated LLM settings into the existing admin dashboard structure.
- Added support for multiple LLM providers including OpenAI, Anthropic, and Ollama.
2025-12-11 20:45:23 +00:00
Nawaz Dhandala
abc0446c3a feat: improve logging and error handling in Microsoft Teams user token retrieval 2025-12-11 19:20:13 +00:00
Nawaz Dhandala
6e5e0b4a0a feat: remove unused endpoint for team selection in Microsoft Teams API 2025-12-11 19:07:05 +00:00
Simon Larsen
b04e639864 Merge pull request #2173 from OneUptime/slack-pushpin
Slack pushpin
2025-12-11 18:34:02 +00:00
Simon Larsen
d30e06c740 Merge pull request #2099 from tollercode/feat/msteams-userscope
feat(MicrosoftTeams): enhance refreshTeams to support user-scoped tokens
2025-12-11 18:33:30 +00:00
Nawaz Dhandala
221b70a5cf feat: add postedFromSlackMessageId to multiple note models and create migration for database updates 2025-12-11 18:25:34 +00:00
Nawaz Dhandala
60f292048d feat: add postedFromSlackMessageId to internal and public note models and services for duplicate prevention 2025-12-11 18:22:04 +00:00
Nawaz Dhandala
efc7a99982 feat: optimize emoji reaction handling by checking supported emojis before database queries 2025-12-11 18:03:19 +00:00
Nawaz Dhandala
ab4e3d9aa8 feat: add type annotations for reaction and user authentication data in Slack actions 2025-12-11 15:46:40 +00:00
Nawaz Dhandala
e21c26f2e0 refactor: clean up code formatting and improve debug logging in Slack actions 2025-12-11 15:38:55 +00:00
Nawaz Dhandala
4d1c687412 feat: add WorkspaceNotificationRuleTable for alerts, incidents, and scheduled maintenance in Slack 2025-12-11 15:21:23 +00:00
Nawaz Dhandala
7b2636f46a feat: add tips for using emoji reactions in Slack for alerts, incidents, and scheduled maintenance 2025-12-11 15:19:55 +00:00
Nawaz Dhandala
aa60206beb feat: update confirmation messages to use Slack's link formatting for alerts, incidents, and scheduled maintenance 2025-12-11 13:31:01 +00:00
Nawaz Dhandala
524f0cc867 feat: refactor Slack user ID retrieval to use WorkspaceUserAuthTokenService 2025-12-11 13:27:50 +00:00
Nawaz Dhandala
08c960ba89 feat: enhance Slack request handling by adding raw body support for signature verification 2025-12-11 13:19:37 +00:00
Nawaz Dhandala
4dbb24de77 feat: implement Slack emoji reaction handling for alerts, incidents, and scheduled maintenance 2025-12-11 13:16:57 +00:00
Simon Larsen
7d0d3c31b0 Merge pull request #2172 from tollercode/fix/incident-root-cause-edit-modal
fix: Change form field from description to rootCause
2025-12-11 12:34:38 +00:00
Nils T
32463b370e fix: Change form field from description to rootCause
RootCause Edit Modal wrongly fetched the Incident description in the form and also updates the wrong field.
2025-12-11 12:47:17 +01:00
Nawaz Dhandala
d7d382bcf6 feat: update npm authentication process for OIDC trusted publishing 2025-12-10 15:42:51 +00:00
Nawaz Dhandala
8079f5b74d feat: include status page group name in resource selection 2025-12-10 12:42:27 +00:00
Nawaz Dhandala
a08b551139 fix: allow default behavior for opening links in a new tab 2025-12-10 12:38:43 +00:00
Nawaz Dhandala
4f73e60d9b chore: bump version to 9.2.14 2025-12-10 12:34:20 +00:00
Nawaz Dhandala
f163390970 feat: include status page group name in event resource display for announcements, incidents, and scheduled events 2025-12-10 12:34:08 +00:00
Nawaz Dhandala
eea9c2788b Refactor: Remove Copilot tools and related utilities
- Deleted RunCommandTool, SearchWorkspaceTool, WriteFileTool, and their associated interfaces and implementations.
- Removed Tool, ToolRegistry, and AgentLogger classes, along with their dependencies.
- Eliminated utility functions for workspace path management and secret sanitization.
- Cleaned up TypeScript configuration and example environment variables related to Copilot.
- Updated Docker Compose files to remove references to Copilot services.
2025-12-10 11:42:31 +00:00
Nawaz Dhandala
210eb82369 fix: update resource grouping output to use <br/> for HTML rendering 2025-12-10 11:36:42 +00:00
Nawaz Dhandala
e9a02b5579 chore: bump version to 9.2.13 2025-12-10 11:28:47 +00:00
Nawaz Dhandala
34cc0af99e fix: update resource grouping logic to display ungrouped resources on separate lines without "Other" label 2025-12-10 11:28:10 +00:00
Nawaz Dhandala
c2a8431624 feat: implement StatusPageResourceUtil for grouping resources by their group name 2025-12-10 11:24:51 +00:00
Nawaz Dhandala
05b6a1b33b fix: reset log file on each command run to ensure fresh logging 2025-12-09 14:18:50 +00:00
Nawaz Dhandala
de6a58009a fix: handle grep command errors and return user-friendly message for no matches 2025-12-09 14:16:28 +00:00
Nawaz Dhandala
cc9e8f174a fix: add completion requirements to system prompt for improved task execution 2025-12-09 14:15:05 +00:00
Nawaz Dhandala
15026fdc0a fix: add peer flag to dependencies in package-lock.json for better compatibility 2025-12-09 13:32:00 +00:00
Nawaz Dhandala
c6c39d92ac fix: prevent default behavior for middle click and onClick event in Link component 2025-12-09 12:41:54 +00:00
Nawaz Dhandala
e01d67a7d9 fix: improve layout and styling for various account-related pages for better user experience 2025-12-09 12:31:20 +00:00
Simon Larsen
fd5d828a6d Merge pull request #2169 from OneUptime/synthetic-retry-count
Synthetic retry count
2025-12-09 12:23:48 +00:00
Nawaz Dhandala
7a9b46cede fix: remove unnecessary return statement in setTimeout for retry logic 2025-12-09 12:19:25 +00:00
Nawaz Dhandala
f44435e44c fix: format description for retry count on error for better readability; adjust state initialization for advanced options 2025-12-09 12:17:49 +00:00
Nawaz Dhandala
10e1f5b411 chore: bump version to 9.2.12 2025-12-09 12:17:42 +00:00
Nawaz Dhandala
28de37dc1a fix: update retry count label and description for clarity; refine interval filtering logic 2025-12-09 12:17:24 +00:00
Nawaz Dhandala
5e445f918b feat: add advanced options for retry count configuration in synthetic monitors 2025-12-09 12:15:34 +00:00
Nawaz Dhandala
7dd2a7e61d feat: add retry count on error for synthetic monitors 2025-12-09 12:11:05 +00:00
Nawaz Dhandala
c41b74070b chore: bump version to 9.2.11 2025-12-09 11:40:06 +00:00
Nawaz Dhandala
d4a0b2689d refactor: improve formatting and readability of the redactSecrets function in SecretSanitizer 2025-12-09 11:39:40 +00:00
Nawaz Dhandala
e272215c9e refactor: improve code readability by formatting and restructuring functions in OpenAIClient and ApplyPatchTool 2025-12-09 11:38:13 +00:00
Nawaz Dhandala
2ec80061c8 feat: add Discord integration with SendMessageToChannel component 2025-12-09 11:36:52 +00:00
Nawaz Dhandala
f085caed43 fix: update installation instructions for OneUptime app in Microsoft TeamsIntegration 2025-12-09 10:56:26 +00:00
Simon Larsen
c8acc720cf Merge pull request #2168 from OneUptime/chore/npm-audit-fix
chore: npm audit fix
2025-12-09 09:02:17 +00:00
simlarsen
4fd5420ddc chore: npm audit fix 2025-12-09 01:51:25 +00:00
Simon Larsen
83a3ecb217 feat: add jest for testing and enhance patch handling in ApplyPatchTool
feat: improve search functionality by excluding specific directories and files
feat: implement output sanitization to redact sensitive information
feat: add secret redaction utility to mask known secret patterns
2025-12-08 21:07:51 +00:00
Simon Larsen
777f45dd96 fix: remove temperature from ResponsesRequestPayload and related methods 2025-12-08 20:01:25 +00:00
Simon Larsen
896801dcb0 feat: enhance tool mapping in OpenAIClient and update ResponsesRequestPayload type 2025-12-08 19:58:35 +00:00
Simon Larsen
e1d94955c3 Merge branch 'master' of github.com:OneUptime/oneuptime 2025-12-08 19:54:32 +00:00
Simon Larsen
c30a4d0ed6 fix: update ResponsesRequestPayload to explicitly allow undefined for tool_choice and tools 2025-12-08 19:54:29 +00:00
Simon Larsen
0cc97ca25c refactor: simplify response handling and enhance payload construction in OpenAIClient 2025-12-08 19:51:33 +00:00
Simon Larsen
ec5f7b081d Merge pull request #2166 from OneUptime/snyk-upgrade-bfb9122e9f65a4b4c901546b27a39e9e
[Snyk] Upgrade react-router-dom from 6.30.1 to 6.30.2
2025-12-08 19:47:50 +00:00
Simon Larsen
fda52266ee Merge pull request #2165 from OneUptime/chore/npm-audit-fix
chore: npm audit fix
2025-12-08 19:47:43 +00:00
Simon Larsen
7d893bed2e Merge pull request #2167 from OneUptime/sub-templates
Sub templates
2025-12-08 19:47:31 +00:00
Nawaz Dhandala
5c96f160ea fix: remove empty onTabChange handler in subscriber settings 2025-12-08 19:47:16 +00:00
Simon Larsen
a0cc36715e refactor: remove OpenAIResponsesClient and streamline OpenAIClient for improved API handling 2025-12-08 19:46:33 +00:00
Simon Larsen
fca7bac461 feat: implement OpenAIResponsesClient and update CopilotAgent to utilize new API for OpenAI responses 2025-12-08 19:39:24 +00:00
Simon Larsen
a0d15a4c75 feat: enhance model URL resolution for OpenAI and add support for model name in CLI options 2025-12-08 19:36:32 +00:00
Simon Larsen
41a2b5f3d6 feat: rename CLI command and update package dependencies in Copilot 2025-12-08 19:32:10 +00:00
Nawaz Dhandala
455d6dc4a6 fix: remove unused refreshCount state and related logic in subscriber settings 2025-12-08 19:26:06 +00:00
Nawaz Dhandala
2119689c8b fix: remove unnecessary useMemo for modelId string conversion in subscriber settings 2025-12-08 19:25:24 +00:00
Simon Larsen
46e6a37d71 feat: rename CLI command from oneuptime-copilot-agent to oneuptime-copilot 2025-12-08 19:20:09 +00:00
Simon Larsen
11ae53b6de fix: format code for better readability in AnthropicClient.ts 2025-12-08 19:15:36 +00:00
Simon Larsen
a4a2d118e4 feat: add publish workflow for Copilot agent and update package name 2025-12-08 19:15:01 +00:00
Simon Larsen
0ac884900d feat: add support for Ollama model in Copilot agent and update documentation 2025-12-08 19:08:44 +00:00
Nawaz Dhandala
231cee0c9f fix: optimize modelId string conversion in subscriber settings 2025-12-08 19:08:09 +00:00
Simon Larsen
b87f4d0893 feat: enhance model URL handling and tool metadata in Copilot agent 2025-12-08 19:04:36 +00:00
Simon Larsen
b4a43cca0f feat: add support for OpenAI and Anthropic models in Copilot agent 2025-12-08 19:02:28 +00:00
Nawaz Dhandala
c8995aa057 fix: correct singular and plural names in status page subscriber notification template metadata 2025-12-08 18:34:39 +00:00
Nawaz Dhandala
6062e7cd24 feat: refresh status page data on tab change in subscriber settings 2025-12-08 18:33:57 +00:00
Nawaz Dhandala
21ba2d0939 feat: add loading state and warning alerts for custom SMTP and Twilio configuration in subscriber settings 2025-12-08 18:28:10 +00:00
Nawaz Dhandala
84c7e5fc3a feat: simplify SMS notification message format for scheduled maintenance 2025-12-08 17:30:21 +00:00
Nawaz Dhandala
607bdaecbc feat: enhance notification templates to use custom configurations for SMS and email 2025-12-08 17:23:25 +00:00
Nawaz Dhandala
8d9d1b9182 refactor: clean up notification templates and improve code readability 2025-12-08 16:14:44 +00:00
Nawaz Dhandala
a1999f12e7 Enhance notification system with custom templates for incident notes, state changes, and scheduled maintenance
- Integrated custom notification templates for email, SMS, Slack, and Microsoft Teams in IncidentPublicNote, IncidentStateTimeline, ScheduledMaintenancePublicNote, and ScheduledMaintenanceStateTimeline jobs.
- Added logic to fetch and compile templates based on notification method and event type.
- Improved message formatting by including dynamic variables such as incident details, resources affected, and unsubscribe links.
- Updated email sending logic to utilize custom templates where available, falling back to default messages when necessary.
- Enhanced logging for better tracking of notification dispatches.
2025-12-08 16:11:12 +00:00
Nawaz Dhandala
e4d9263b9f feat: add support for postmortem published event in notification templates 2025-12-08 15:22:44 +00:00
Nawaz Dhandala
4b15893f12 Merge branch 'master' into sub-templates 2025-12-08 14:56:54 +00:00
Nawaz Dhandala
9e72288885 chore: bump version to 9.2.10 2025-12-08 14:56:25 +00:00
Nawaz Dhandala
403f4a1c5b fix: ensure browser session is disposed to prevent zombie processes 2025-12-08 14:55:54 +00:00
Nawaz Dhandala
e328dca641 fix: add tini for proper zombie process reaping in Dockerfile 2025-12-08 14:54:50 +00:00
Nawaz Dhandala
eb7db11cd6 refactor: Remove StatusPageSubscriberNotification utility functions and related types 2025-12-08 14:37:50 +00:00
Nawaz Dhandala
42314e4e3f fix: Update singular and plural names in StatusPageSubscriberNotificationTemplateStatusPage for clarity and link context in SubscriberSettings 2025-12-08 14:03:30 +00:00
Nawaz Dhandala
48ffea35c4 fix: Update singular and plural names in TableMetadata for clarity in StatusPageSubscriberNotificationTemplateStatusPage 2025-12-08 14:02:10 +00:00
Nawaz Dhandala
e2fe58f9cd feat: Add type annotations for function signatures in SubscriberNotificationTemplateView, SubscriberNotificationTemplates, and SubscriberNotificationTemplateVariables for improved type safety 2025-12-08 13:50:52 +00:00
Nawaz Dhandala
3a858e81eb refactor: Improve code formatting and readability in SubscriberNotificationTemplateView and SubscriberNotificationTemplates 2025-12-08 13:48:29 +00:00
Nawaz Dhandala
4d9fd5ee1d feat: Update SubscriberSettings to use Element type for template name and event type fields with custom rendering 2025-12-08 13:47:55 +00:00
Nawaz Dhandala
7ca91c848b feat: Simplify notification templates description for clarity and conciseness 2025-12-08 13:44:59 +00:00
Nawaz Dhandala
424b57db65 feat: Simplify SubscriberNotificationTemplateView by removing unused form steps and fields for improved clarity 2025-12-08 13:42:17 +00:00
Nawaz Dhandala
ac09d45a61 feat: Refactor template variable documentation retrieval to a dedicated utility function for improved maintainability 2025-12-08 13:36:31 +00:00
Nawaz Dhandala
3c7b9dc9ea feat: Enhance SubscriberNotificationTemplateView with detailed event-specific variable documentation and improved template content structure 2025-12-08 13:31:36 +00:00
Nawaz Dhandala
31f73ec551 feat: Add createEditModalWidth prop to SubscriberNotificationTemplates for improved modal sizing 2025-12-08 13:21:04 +00:00
Nawaz Dhandala
b2ca376520 feat: Update template variable documentation for Subscriber Notification Templates to enhance clarity and consistency 2025-12-08 13:20:48 +00:00
Nawaz Dhandala
5fede38237 feat: Refactor variable documentation in Subscriber Notification Templates for improved clarity and structure 2025-12-08 13:18:27 +00:00
Nawaz Dhandala
521cd911ee feat: Remove Card component from Subscriber Notification Templates for cleaner layout 2025-12-08 13:13:21 +00:00
Nawaz Dhandala
c43b191b2e feat: Enhance Subscriber Notification Templates with tabbed interface for notification methods 2025-12-08 13:09:33 +00:00
Nawaz Dhandala
c8e9b7d6cf feat: Add getFooterElement to Field interface and implement in SubscriberNotificationTemplates 2025-12-08 13:06:16 +00:00
Nawaz Dhandala
7ebc0ee4a5 feat: Add status page subscriber notification template status page linking table to API 2025-12-08 12:57:30 +00:00
Nawaz Dhandala
6dceb063f0 feat: Add status page subscriber notification templates to API 2025-12-08 12:55:05 +00:00
Nawaz Dhandala
7c291b58df feat: Update icon in DashboardSideMenu from Email to Bell 2025-12-08 12:52:34 +00:00
Nawaz Dhandala
5759328d6a feat: Enhance documentation for available template variables in subscriber notifications 2025-12-08 12:50:49 +00:00
Nawaz Dhandala
f79b1cec03 feat: Add type annotations for improved type safety in notification services and templates 2025-12-08 12:12:24 +00:00
Nawaz Dhandala
cbe2777e7d feat: Refactor notification template models and services for improved readability and maintainability 2025-12-08 12:10:35 +00:00
Nawaz Dhandala
308efbbddc feat: Add migration for Status Page Subscriber Notification Template and related tables 2025-12-08 12:08:09 +00:00
Nawaz Dhandala
e481cf3488 feat: Enhance Subscriber Settings with Notification Templates and Methods 2025-12-08 11:48:55 +00:00
Nawaz Dhandala
5172dd8e1d feat: Add Subscriber Notification Templates and Views to Settings 2025-12-08 11:43:15 +00:00
Nawaz Dhandala
ec10cefbb2 feat: Implement Status Page Subscriber Notification utilities and templates 2025-12-08 11:34:55 +00:00
Nawaz Dhandala
0933f01082 feat: Add Status Page Subscriber Notification Template and related services
- Introduced `StatusPageSubscriberNotificationTemplate` model for managing custom notification templates for status page subscribers.
- Created `StatusPageSubscriberNotificationTemplateStatusPage` model to link notification templates to specific status pages.
- Implemented services for managing notification templates and their associations with status pages.
- Added permissions for creating, reading, updating, and deleting notification templates and their links.
- Developed frontend component for displaying and managing subscriber notification templates in the dashboard.
- Defined enums for notification event types and methods to standardize template usage.
2025-12-08 11:33:06 +00:00
snyk-bot
bdd3c5fc40 fix: upgrade react-router-dom from 6.30.1 to 6.30.2
Snyk has created this PR to upgrade react-router-dom from 6.30.1 to 6.30.2.

See this package in npm:
react-router-dom

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/11bb5528-45f9-473c-a635-dc097fd03b3c?utm_source=github&utm_medium=referral&page=upgrade-pr
2025-12-08 09:59:11 +00:00
simlarsen
1e953feeb8 chore: npm audit fix 2025-12-08 01:52:06 +00:00
Simon Larsen
48f86579be Merge pull request #2164 from OneUptime/snyk-upgrade-2d5ead31cbe58e2bd5c3f9e186213162
[Snyk] Upgrade react-router-dom from 6.30.1 to 6.30.2
2025-12-07 20:27:33 +00:00
Simon Larsen
34e1ceec33 Merge pull request #2163 from OneUptime/snyk-upgrade-42f7d10f38ab259b26178999a6727268
[Snyk] Upgrade react-router-dom from 6.30.1 to 6.30.2
2025-12-07 20:27:26 +00:00
Simon Larsen
edba39d475 Merge pull request #2162 from OneUptime/chore/npm-audit-fix
chore: npm audit fix
2025-12-07 20:27:21 +00:00
snyk-bot
5385eb2076 fix: upgrade react-router-dom from 6.30.1 to 6.30.2
Snyk has created this PR to upgrade react-router-dom from 6.30.1 to 6.30.2.

See this package in npm:
react-router-dom

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/40b17bc5-1bd4-48b1-88f1-5b4dc1400e80?utm_source=github&utm_medium=referral&page=upgrade-pr
2025-12-07 10:15:16 +00:00
snyk-bot
40597b7647 fix: upgrade react-router-dom from 6.30.1 to 6.30.2
Snyk has created this PR to upgrade react-router-dom from 6.30.1 to 6.30.2.

See this package in npm:
react-router-dom

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/8ca4ee75-8bc5-43a1-a3bc-244ceebf1437?utm_source=github&utm_medium=referral&page=upgrade-pr
2025-12-07 10:15:12 +00:00
simlarsen
2e5cc47522 chore: npm audit fix 2025-12-06 01:45:01 +00:00
Nawaz Dhandala
e6c7eceb57 fix: streamline SMS notification messages for various job handlers 2025-12-05 21:27:07 +00:00
Nawaz Dhandala
ef2bb2f7b6 fix: update Loader component test IDs and change test environment to jsdom 2025-12-05 21:05:11 +00:00
Nawaz Dhandala
049dc02a5f fix: bump version to 9.2.9 2025-12-05 20:39:33 +00:00
Nawaz Dhandala
100f46ab3c fix: update badge styles for previous and current state indicators in StateTransition template 2025-12-05 19:02:52 +00:00
Nawaz Dhandala
e21d080e6f fix: add previous status and color to notification data in SendStatusChangeNotification 2025-12-05 18:55:49 +00:00
Nawaz Dhandala
3740382e76 fix: enhance status badge display with color indicators in StatusTransition template 2025-12-05 18:53:41 +00:00
Nawaz Dhandala
d3864e268b fix: improve table styling and layout in StatusPageSubscriberReport template 2025-12-05 17:42:29 +00:00
Nawaz Dhandala
d3db3fd174 fix: remove outdated reliability copilot workflow file 2025-12-05 13:52:27 +00:00
Nawaz Dhandala
9f9e337350 chore: update version number to 9.2.8 2025-12-05 13:45:39 +00:00
Nawaz Dhandala
1e84ece07e fix: simplify import statements in Queue.ts for better clarity 2025-12-05 13:32:17 +00:00
Nawaz Dhandala
ee4981bd19 fix: enhance job handling in Queue class to manage repeatable jobs 2025-12-05 13:31:25 +00:00
Nawaz Dhandala
f8802eea24 fix: format code for better readability in Landing.spec.ts 2025-12-05 11:10:15 +00:00
Nawaz Dhandala
5b45cab822 fix: update link selector for OneUptime in Landing.spec.ts 2025-12-05 11:03:33 +00:00
Simon Larsen
908f16d769 Merge pull request #2159 from OneUptime/snyk-upgrade-2036816bc1d34768c430f289cb384bca
[Snyk] Upgrade react-router-dom from 6.30.1 to 6.30.2
2025-12-05 08:41:21 +00:00
Simon Larsen
e4852e5799 Merge pull request #2160 from OneUptime/chore/npm-audit-fix
chore: npm audit fix
2025-12-05 08:41:14 +00:00
simlarsen
06e672abdd chore: npm audit fix 2025-12-05 01:51:29 +00:00
snyk-bot
efed184276 fix: upgrade react-router-dom from 6.30.1 to 6.30.2
Snyk has created this PR to upgrade react-router-dom from 6.30.1 to 6.30.2.

See this package in npm:
react-router-dom

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/5dd2ef9c-1270-4729-aff4-e407805f7a9c?utm_source=github&utm_medium=referral&page=upgrade-pr
2025-12-05 00:44:09 +00:00
Simon Larsen
9bd14ec3f3 Merge pull request #2158 from OneUptime/monitor-more-info
refactor: implement detailed error handling for request failures acro…
2025-12-04 22:00:18 +00:00
Nawaz Dhandala
9950f1502e refactor: enhance promise handling and error rejection in DNS and traceroute operations 2025-12-04 21:57:42 +00:00
Nawaz Dhandala
43432261e1 refactor: improve formatting and readability in error handling and network monitoring code 2025-12-04 21:54:13 +00:00
Nawaz Dhandala
bd2b8ba1fb refactor: add detailed logging for request failure scenarios in monitor response 2025-12-04 21:48:27 +00:00
Nawaz Dhandala
03742ab6f4 refactor: implement detailed error handling for request failures across monitors 2025-12-04 20:25:55 +00:00
Nawaz Dhandala
7324bff68b refactor: add NetworkPathTrace and NetworkPathMonitor for comprehensive network diagnostics 2025-12-04 19:46:34 +00:00
Nawaz Dhandala
8dbfa524e5 refactor: enhance error message validation in API error handling 2025-12-04 18:15:50 +00:00
Nawaz Dhandala
b2ef34f45f refactor: improve error handling in API class for more meaningful messages 2025-12-04 18:14:54 +00:00
Nawaz Dhandala
1ec9c885f3 refactor: enhance type annotations for SEO-related functions and improve sitemap entry configuration 2025-12-04 15:20:23 +00:00
Nawaz Dhandala
007973aa86 refactor: improve code formatting for better readability in Routes and Sitemap 2025-12-04 15:10:49 +00:00
Nawaz Dhandala
500101350f refactor: update version check logic to prevent re-releasing existing versions 2025-12-04 15:01:36 +00:00
Nawaz Dhandala
524fcae430 chore: update version number to 9.2.7 2025-12-04 15:00:26 +00:00
Nawaz Dhandala
7ec8fc5b1c chore: revert version number to 9.2.5 2025-12-04 15:00:09 +00:00
Nawaz Dhandala
6af3daa98e chore: update version number to 9.2.7 2025-12-04 14:41:16 +00:00
Nawaz Dhandala
1d35614cd3 refactor: correct grammar in the blog call-to-action header for clarity 2025-12-04 14:40:34 +00:00
Nawaz Dhandala
91219c9a96 refactor: correct grammar and improve consistency in meta descriptions and content across multiple views 2025-12-04 14:29:32 +00:00
Nawaz Dhandala
65ca7623d5 refactor: correct pluralization in product descriptions for consistency 2025-12-04 14:29:29 +00:00
Nawaz Dhandala
c569977b45 refactor: enhance sitemap configuration with detailed priority and change frequency settings 2025-12-04 14:28:47 +00:00
Nawaz Dhandala
2263916a9f refactor: implement SEO enhancements with structured metadata and dynamic canonical URLs 2025-12-04 14:26:47 +00:00
Nawaz Dhandala
2cca728dfc refactor: improve accessibility by enhancing skip link and alt text for logo 2025-12-04 14:20:58 +00:00
Nawaz Dhandala
ed687a1639 refactor: enhance alt text for images and wrap main content in <main> tags for improved accessibility 2025-12-04 14:17:52 +00:00
Nawaz Dhandala
270199806c refactor: remove LLM-related Docker workflows and associated files 2025-12-04 13:47:12 +00:00
Nawaz Dhandala
30a3c5e1b2 refactor: improve type definition for getMetricChartType in DashboardChartComponent 2025-12-04 13:38:55 +00:00
Nawaz Dhandala
0c5bd31023 refactor: remove unused chart type determination logic in MonitorMetrics 2025-12-04 13:32:44 +00:00
Nawaz Dhandala
84a75b7af6 chore: bump version to 9.2.6 2025-12-04 13:30:27 +00:00
Nawaz Dhandala
e25be96040 feat: add rounded corners to BarChart rendering for improved aesthetics 2025-12-04 13:29:48 +00:00
Nawaz Dhandala
7777f7d9aa feat: add syncid prop to BarChart component for synchronized chart rendering 2025-12-04 13:15:09 +00:00
Nawaz Dhandala
8e37df3fc0 feat: add dropdown support for chart type selection in Dashboard components 2025-12-04 12:43:55 +00:00
Nawaz Dhandala
88c9e0beb5 feat: add BarChart component and integrate chart type handling in MetricCharts and MonitorMetrics 2025-12-04 12:36:41 +00:00
Nawaz Dhandala
d751537473 feat: add migration for postmortemPostedAt column in Incident table 2025-12-04 12:22:50 +00:00
Nawaz Dhandala
60be6c00e9 chore: bump version to 9.2.5 2025-12-04 11:45:50 +00:00
Nawaz Dhandala
91bf55dc20 refactor: simplify logging for previous status duration and improve code formatting 2025-12-04 09:17:31 +00:00
Nawaz Dhandala
d20a125742 refactor: update previous status duration handling in notification template and logging 2025-12-04 09:14:41 +00:00
Nawaz Dhandala
d10bcd2edd refactor: enhance code readability by adding comments for previous status duration calculation 2025-12-04 08:59:04 +00:00
Nawaz Dhandala
0b32408bf2 refactor: update notification template and improve duration calculation logic 2025-12-04 08:58:42 +00:00
Nawaz Dhandala
269fbd3f24 feat: add dep-check script and remove tsconfig-paths from devDependencies 2025-12-04 08:51:40 +00:00
Nawaz Dhandala
2640ea8c10 refactor: streamline previous status duration calculation in notification 2025-12-03 23:21:07 +00:00
Nawaz Dhandala
f3180d3a83 feat: add previous status duration calculation to status change notification 2025-12-03 23:18:35 +00:00
Nawaz Dhandala
7727fe835f refactor: improve parameter destructuring for createIncidentStateChangedNotification method 2025-12-03 23:17:23 +00:00
Nawaz Dhandala
00fbfbc08e chore: bump version to 9.2.4 2025-12-03 23:08:21 +00:00
Nawaz Dhandala
44d1183066 feat: add monitor destination and request type details to notification templates and services 2025-12-03 23:08:04 +00:00
Nawaz Dhandala
0ccef797ab chore: bump version to 9.2.3 2025-12-03 22:44:46 +00:00
Nawaz Dhandala
9914fb905f fix: update background color for previous and current state/status badges to transparent 2025-12-03 22:43:03 +00:00
Nawaz Dhandala
35ecc19ceb fix: update background color for current state/status badge in notification templates 2025-12-03 22:37:01 +00:00
Nawaz Dhandala
fa0362f739 feat: update notification templates to include state transition details for alerts, incidents, monitors, and scheduled maintenance 2025-12-03 22:36:09 +00:00
Nawaz Dhandala
8ea9084d9e feat: enhance notification templates and logic to include previous state information for alerts, incidents, monitors, and scheduled maintenance 2025-12-03 22:25:45 +00:00
Simon Larsen
eeb31a2250 Merge pull request #2154 from OneUptime/email-improve
Email improve
2025-12-03 21:40:46 +00:00
Nawaz Dhandala
b58c91dbab fix: update version number to 9.2.2 2025-12-03 21:40:11 +00:00
Nawaz Dhandala
868bf4d3e1 fix: remove unnecessary empty row from DetailBoxEnd template for improved clarity 2025-12-03 21:37:20 +00:00
Nawaz Dhandala
a3fc20b393 fix: update incident and event title fields for improved clarity in email templates 2025-12-03 21:14:32 +00:00
Nawaz Dhandala
c8dad04b5c fix: add border-radius to logo images for improved aesthetics 2025-12-03 21:10:15 +00:00
Nawaz Dhandala
ee7db393f8 fix: update email templates to remove empty fields for improved clarity 2025-12-03 21:06:09 +00:00
Nawaz Dhandala
e52da9fef2 fix: remove emojis from email titles for consistency 2025-12-03 21:00:19 +00:00
Nawaz Dhandala
9332df5648 Refactor email templates for improved styling and structure
- Updated EmailTitle template to enhance title styling and added a title block comment.
- Adjusted spacing in End and Footer templates for better layout.
- Enhanced Footer template with new styling and added a powered by link.
- Modified InfoBlock template for improved text styling and added an info block comment.
- Refined Start template with new background color and added a top spacer.
- Updated Style template with new link and badge styles for better visual consistency.
- Enhanced SupportBlock template with a more engaging support message.
- Improved Thanks template with a more personalized closing message.
- Added TitleBlock comments for better organization.
- Updated UnsubscribeBlock for clearer subscription management options.
- Replaced VerticalSpace with a table-based spacer for consistent spacing.
- Enhanced SignupWelcomeEmail with improved messaging and button text.
- Updated SubscriberAnnouncementCreated template for better clarity and button integration.
- Refined SubscriberIncidentCreated template for improved incident details presentation.
- Enhanced SubscriberIncidentPostmortemCreated template for better postmortem details.
- Updated SubscriberIncidentStateChanged template for clearer incident state updates.
- Refined SubscriberScheduledMaintenanceEventCreated template for better event details.
- Introduced StatusBadge template for consistent incident status representation.
2025-12-03 20:40:46 +00:00
Nawaz Dhandala
120fc2ad71 fix: change field type for subscriber notification from Toggle to Checkbox 2025-12-03 19:35:49 +00:00
Nawaz Dhandala
1a7672748f fix: update title for status page visibility and add conditional display for subscriber notification 2025-12-03 19:35:07 +00:00
Nawaz Dhandala
4868e285b0 fix: simplify description for postmortem published timestamp field 2025-12-03 19:30:08 +00:00
Nawaz Dhandala
f572eb6f93 feat: add subscriber notification fields and migration for postmortem 2025-12-03 19:18:43 +00:00
Nawaz Dhandala
a0868e2f75 feat: add subscriber notification status and resend functionality in postmortem 2025-12-03 19:16:49 +00:00
Nawaz Dhandala
3dfd7a9206 feat: set subscriber notification status to Pending on postmortem published 2025-12-03 19:12:42 +00:00
Nawaz Dhandala
d7582337bf fix: remove ignoreHooks option from incident status update in postmortem notification 2025-12-03 19:11:00 +00:00
Nawaz Dhandala
23043462d7 fix: correct incident number retrieval in postmortem notification logic 2025-12-03 19:08:29 +00:00
Nawaz Dhandala
76d53c53c8 feat: add notifySubscribersOnPostmortemPublished toggle to postmortem form 2025-12-03 19:06:40 +00:00
Nawaz Dhandala
4437e912a3 feat: add notifySubscribersOnPostmortemPublished field and update notification logic 2025-12-03 19:05:28 +00:00
Nawaz Dhandala
937d4675a8 feat: add postmortem notification system for subscribers 2025-12-03 19:03:02 +00:00
Nawaz Dhandala
3cc984f149 Merge branch 'master' into release 2025-12-03 18:53:12 +00:00
Nawaz Dhandala
991928a5a5 fix: update version to 9.2.1 2025-12-03 18:53:05 +00:00
Nawaz Dhandala
6f46812418 fix: remove welcome message sending on bot installation 2025-12-03 18:52:18 +00:00
Nawaz Dhandala
6e20e7f08f fix: correct typo in debug log message for sleep duration in FetchListAndProbe 2025-12-03 18:45:25 +00:00
Nawaz Dhandala
ae406d8ee1 fix: update QEMU setup to use tonistiigi/binfmt:qemu-v10.0.4 in release workflows 2025-12-03 18:42:01 +00:00
Nawaz Dhandala
05920d5b99 fix: improve error logging for Playwright resource closure 2025-12-03 18:33:27 +00:00
Nawaz Dhandala
3a309aabcf fix: enhance browser context closure handling in SyntheticMonitor 2025-12-03 18:31:12 +00:00
Nawaz Dhandala
22a3004a3f fix: simplify error logging in safeCloseBrowserContext and adjust formatting in safeCloseBrowser 2025-12-03 18:27:09 +00:00
Nawaz Dhandala
b8f69fbea3 fix: refactor browser session management in SyntheticMonitor for improved clarity and error handling 2025-12-03 18:25:37 +00:00
Nawaz Dhandala
888aff6392 fix: format migration queries and update index for new migration 2025-12-03 14:42:10 +00:00
Nawaz Dhandala
234de977c4 fix: prevent rendering icon for non-highlighted timeline items 2025-12-03 14:41:39 +00:00
Nawaz Dhandala
fa5f606709 Merge branch 'master' of https://github.com/OneUptime/oneuptime 2025-12-03 14:20:38 +00:00
Nawaz Dhandala
b889611d16 fix: update postmortem attachment message for improved visibility and change version to 9.2.0 2025-12-03 14:04:09 +00:00
Nawaz Dhandala
43f0eeb0f8 fix: improve clarity in postmortem status page description and enhance attachment handling messages 2025-12-03 13:57:40 +00:00
Nawaz Dhandala
be311dd8b5 feat: add default value for Postmortem Published At field 2025-12-03 13:56:30 +00:00
Nawaz Dhandala
29428bf660 fix: update placeholder for Postmortem Published At field to improve clarity 2025-12-03 13:55:58 +00:00
Simon Larsen
9eebbe9dfb feat: implement retry logic with configurable attempts and delay for LMStudioClient 2025-12-03 13:51:30 +00:00
Nawaz Dhandala
0dc3bb4f33 feat: add MigrationName1764767371788 for updating OnCallDutyPolicyScheduleLayer defaults 2025-12-03 13:10:12 +00:00
Nawaz Dhandala
adf5a9c1f3 feat: add postmortemPostedAt field and update related components for incident tracking 2025-12-03 13:09:23 +00:00
Nawaz Dhandala
faaded049a feat: add DocumentCheck icon to IconProp and update incident postmortem note icon 2025-12-03 12:58:27 +00:00
Nawaz Dhandala
d02e3882be fix: adjust font size classes for TimelineItem highlight to improve readability 2025-12-03 12:52:20 +00:00
Nawaz Dhandala
e1af84fafa feat: enhance EventItem styling with conditional highlight for improved visibility 2025-12-03 12:51:03 +00:00
Nawaz Dhandala
c371f0a25f feat: add title and highlight properties to TimelineItem for enhanced event display 2025-12-03 12:42:17 +00:00
Nawaz Dhandala
c86d2c2a4a refactor: streamline API route registration and improve code readability 2025-12-03 11:50:17 +00:00
Nawaz Dhandala
a807cc10ab feat: add migration for IncidentPostmortemAttachmentFile table and related constraints 2025-12-03 11:43:31 +00:00
Nawaz Dhandala
6cc480744d Merge branch 'master' of https://github.com/OneUptime/oneuptime 2025-12-03 11:42:07 +00:00
Nawaz Dhandala
7cb6104795 feat: enhance postmortem functionality with attachment handling and status page visibility 2025-12-03 11:42:05 +00:00
Nawaz Dhandala
49dd315501 feat: implement postmortem attachment handling in Incident and StatusPage APIs 2025-12-03 11:34:00 +00:00
Simon Larsen
9ec2b458ed style: remove unnecessary first-letter styling from blog post body 2025-12-03 11:14:50 +00:00
Nawaz Dhandala
702b5811a9 fix: add missing line continuation for workspace-path in usage example 2025-12-02 22:25:59 +00:00
Nawaz Dhandala
7dc7255790 feat: add alias normalization for historical argument names in ReadFileTool 2025-12-02 22:22:19 +00:00
Nawaz Dhandala
1f620e7092 feat: update default max iterations for tool-calling rounds to 100 2025-12-02 21:48:32 +00:00
Nawaz Dhandala
87466246fa Revert "feat: enhance log file path resolution in CLI to support home directory and relative paths"
This reverts commit 12eaa17859.
2025-12-02 21:34:16 +00:00
Nawaz Dhandala
12eaa17859 feat: enhance log file path resolution in CLI to support home directory and relative paths 2025-12-02 21:31:20 +00:00
Nawaz Dhandala
e782ae6b3c feat: enhance logging in CopilotAgent and WorkspaceContext with detailed message contents 2025-12-02 21:17:34 +00:00
Nawaz Dhandala
9ad87328c2 feat: add detailed JSDoc comments for Copilot agent and tools 2025-12-02 21:04:08 +00:00
Nawaz Dhandala
8279294d15 feat: implement oneuptime-copilot-agent CLI with logging and configuration options 2025-12-02 20:52:15 +00:00
Nawaz Dhandala
8c6da51d58 Adopt PascalCase paths in Copilot 2025-12-02 20:34:27 +00:00
Nawaz Dhandala
6d114e3ac4 chore: bump version to 9.1.3 2025-12-02 20:18:07 +00:00
Nawaz Dhandala
44427d3ee7 feat: enhance ReadFileTool with optional line start and end parameters 2025-12-02 14:52:07 +00:00
Nawaz Dhandala
09b0c3b1ef feat: add debug logging instructions and example to README 2025-12-02 14:42:08 +00:00
Nawaz Dhandala
ad597fe5dd feat: update model name and workspace path in usage examples 2025-12-02 14:39:36 +00:00
Nawaz Dhandala
74f17fa45c fix: handle notification skipping for already notified scheduled maintenance events 2025-12-02 14:22:10 +00:00
Nawaz Dhandala
b19a5fa58a feat: add isCreatedState and isScheduledState checks to skip notifications for already notified incidents 2025-12-02 14:21:52 +00:00
Nawaz Dhandala
57abffa113 Merge branch 'master' of https://github.com/OneUptime/oneuptime 2025-12-02 13:06:53 +00:00
Nawaz Dhandala
e8e493ee5a Refactor code structure for improved readability and maintainability 2025-12-02 13:06:50 +00:00
Simon Larsen
e065ebdddc Merge branch 'copilot-v2' 2025-12-02 13:02:32 +00:00
Simon Larsen
39da442892 style: update blog post first paragraph styling for improved readability 2025-12-02 13:02:18 +00:00
Simon Larsen
45b02b30e3 Merge pull request #2152 from OneUptime/chore/npm-audit-fix
chore: npm audit fix
2025-12-02 11:46:04 +00:00
Nawaz Dhandala
30414327f9 feat: add Dockerfile for OneUptime-copilot setup 2025-12-02 11:05:16 +00:00
simlarsen
b99a20a588 chore: npm audit fix 2025-12-02 01:50:48 +00:00
Nawaz Dhandala
22178c282d fix: format command descriptions for consistency in MicrosoftTeamsAPI 2025-12-01 17:13:11 +00:00
Nawaz Dhandala
30389a8d49 feat: add command lists for improved interaction with OneUptime bot in Microsoft Teams 2025-12-01 17:11:37 +00:00
Nawaz Dhandala
7b73cc2ea7 fix: remove trailing spaces in action type definitions 2025-12-01 17:05:30 +00:00
Nawaz Dhandala
6d2c331216 feat: update command triggers for incident and maintenance actions 2025-12-01 17:05:05 +00:00
Nawaz Dhandala
624e4c2296 chore: update version to 9.1.2 2025-12-01 16:38:51 +00:00
Simon Larsen
5e901ee973 Merge pull request #2151 from OneUptime/copilot-v2
Copilot v2
2025-12-01 16:25:22 +00:00
Simon Larsen
a103abc7a9 fix: simplify boolean expression for hasProgressedBeyondScheduledState 2025-12-01 15:45:35 +00:00
Simon Larsen
a7dda0bd53 feat: add logic to update nextSubscriberNotificationBeforeTheEventAt for progressed scheduled maintenance events 2025-12-01 15:45:15 +00:00
Simon Larsen
6948754c86 Merge pull request #2147 from OneUptime/copilot-v2
Copilot v2
2025-12-01 15:21:05 +00:00
Simon Larsen
cc5731bb6d feat: add error handling and logging for missing tool calls and directory entries 2025-12-01 15:20:44 +00:00
Simon Larsen
6761a8a686 Merge pull request #2148 from OneUptime/snyk-upgrade-240d43adaab510cce84165a4f1ccf9b5
[Snyk] Upgrade mailparser from 3.7.5 to 3.9.0
2025-12-01 13:42:14 +00:00
Simon Larsen
6e487199aa refactor: add type annotations and improve type safety across multiple files 2025-12-01 13:41:34 +00:00
snyk-bot
cda5de92ec fix: upgrade mailparser from 3.7.5 to 3.9.0
Snyk has created this PR to upgrade mailparser from 3.7.5 to 3.9.0.

See this package in npm:
mailparser

See this project in Snyk:
https://app.snyk.io/org/oneuptime-RsC2nshvQ2Vnr35jHvMnMP/project/c3622982-05c8-495c-809c-20f301c75f92?utm_source=github&utm_medium=referral&page=upgrade-pr
2025-11-29 12:10:48 +00:00
Simon Larsen
33349341a9 refactor: improve code formatting and readability across multiple files 2025-11-28 21:53:50 +00:00
Simon Larsen
db81fdd3e7 feat: enhance logging throughout the Copilot agent and tools for better traceability 2025-11-28 21:52:33 +00:00
Simon Larsen
d71eba91dd chore: remove vscode-copilot-chat subproject reference 2025-11-28 21:45:07 +00:00
Simon Larsen
682bb805f3 feat: implement AgentLogger for file-based logging with exit handlers 2025-11-28 21:43:15 +00:00
Simon Larsen
7f38e3d417 docs: add usage example for running the agent in development mode 2025-11-28 21:31:08 +00:00
Simon Larsen
559985e93b feat: add tsconfig-paths for improved module resolution in development 2025-11-28 21:28:19 +00:00
Simon Larsen
43588cbe5a refactor: update optional properties to include 'undefined' type in various interfaces 2025-11-28 20:57:17 +00:00
Simon Larsen
0772fce477 refactor: update Telemetry class to use type assertions for loggerProviderConfig and nodeSdkConfiguration
chore: remove unused common type definitions and clean up tsconfig.json
2025-11-28 20:20:09 +00:00
Simon Larsen
78107d8b1c chore: remove unused type definitions and clean up tsconfig.json 2025-11-28 20:06:43 +00:00
Simon Larsen
078af43b0c chore: remove tsconfig.json for OneUptime Copilot Agent 2025-11-28 19:58:11 +00:00
Simon Larsen
9b9aeb2f40 feat: Implement OneUptime Copilot Agent with workspace tools
- Added SystemPrompt for guiding the agent's behavior.
- Created WorkspaceContextBuilder to gather workspace information.
- Developed main entry point in index.ts for agent execution.
- Implemented LMStudioClient for interacting with the LM Studio API.
- Added ApplyPatchTool for applying code changes via patches.
- Created ListDirectoryTool for listing files and directories.
- Implemented ReadFileTool for reading file contents.
- Developed RunCommandTool for executing shell commands.
- Added SearchWorkspaceTool for searching files in the workspace.
- Created WriteFileTool for writing content to files.
- Established ToolRegistry for managing and executing tools.
- Defined types for chat messages and tool calls.
- Added utility classes for logging and executing commands.
- Implemented WorkspacePaths for managing file paths within the workspace.
- Configured TypeScript settings in tsconfig.json.
2025-11-28 19:57:52 +00:00
Nawaz Dhandala
67577f5a2b refactor: improve formatting and readability in Incident migration and MonitorService 2025-11-28 17:42:22 +00:00
Nawaz Dhandala
4e808cf382 feat: enhance monitor deletion process to include MetricService cleanup 2025-11-28 17:40:31 +00:00
Nawaz Dhandala
c993b33dab feat: add projectId to MetricService deletion query in incident handling 2025-11-28 17:35:23 +00:00
Nawaz Dhandala
3c5a64024b feat: include projectId in MetricService deletion query for incidents 2025-11-28 17:34:30 +00:00
Nawaz Dhandala
86efe54a29 refactor: remove unused favicon handling from DashboardMasterPage 2025-11-28 17:29:43 +00:00
Simon Larsen
17bf568428 feat: Implement OneUptime Copilot Agent with core functionalities
- Add SystemPrompt to define agent behavior and principles.
- Create WorkspaceContextBuilder for workspace snapshot and Git status.
- Initialize main entry point with command-line options for agent configuration.
- Develop LMStudioClient for chat completion requests to LM Studio.
- Implement tools for file operations: ApplyPatchTool, ListDirectoryTool, ReadFileTool, RunCommandTool, SearchWorkspaceTool, WriteFileTool.
- Establish ToolRegistry for managing and executing tools.
- Define types for chat messages, tool calls, and execution results.
- Set up workspace path utilities for file management and validation.
- Configure TypeScript settings for the project.
2025-11-28 16:49:46 +00:00
Simon Larsen
26ac698cc7 Remove Copilot package configuration files 2025-11-28 15:43:36 +00:00
Simon Larsen
72bb25e036 chore: migrate VERSION_PREFIX to VERSION and update related workflows 2025-11-28 15:40:24 +00:00
Nawaz Dhandala
1f23742c1f chore: remove vscode-copilot-chat subproject 2025-11-28 14:12:12 +00:00
Nawaz Dhandala
ac66cee4aa feat: add declaredAt field to Incident model with migration and default value 2025-11-28 10:12:43 +00:00
Nawaz Dhandala
66efe2d2fa feat: add declaredAt field to Incident model and update related services and components 2025-11-28 10:10:05 +00:00
Nils T
fb761438ab feat(MicrosoftTeams): enhance refreshTeams to support user-scoped tokens 2025-11-11 10:29:22 +00:00
755 changed files with 40788 additions and 55573 deletions

View File

@@ -220,29 +220,6 @@ jobs:
command: sudo docker build --no-cache -f ./App/Dockerfile .
docker-build-copilot:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Preinstall
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 3
command: npm run prerun
# build image for accounts service
- name: build docker image
uses: nick-fields/retry@v3
with:
timeout_minutes: 45
max_attempts: 3
command: sudo docker build --no-cache -f ./Copilot/Dockerfile .
docker-build-e2e:
runs-on: ubuntu-latest
env:

View File

@@ -162,23 +162,6 @@ jobs:
max_attempts: 3
command: cd Docs && npm install && npm run compile && npm run dep-check
compile-copilot:
runs-on: ubuntu-latest
env:
CI_PIPELINE_ID: ${{github.run_number}}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: latest
- run: cd Common && npm install
- name: Compile Copilot
uses: nick-fields/retry@v3
with:
timeout_minutes: 30
max_attempts: 3
command: cd Copilot && npm install && npm run compile && npm run dep-check
compile-nginx:
runs-on: ubuntu-latest
env:

File diff suppressed because it is too large Load Diff

View File

@@ -1,32 +0,0 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
name: "OneUptime Reliability Copilot"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
# Run every day at midnight UTC
- cron: '0 0 * * *'
jobs:
analyze:
name: Analyze Code
runs-on: ubuntu-latest
steps:
# Run Reliability Copilot in Docker Container
- name: Run Copilot
run: |
docker run --rm \
-e ONEUPTIME_URL="https://test.oneuptime.com" \
-e ONEUPTIME_REPOSITORY_SECRET_KEY="${{ secrets.COPILOT_ONEUPTIME_REPOSITORY_SECRET_KEY }}" \
-e CODE_REPOSITORY_PASSWORD="${{ github.token }}" \
-e CODE_REPOSITORY_USERNAME="simlarsen" \
-e OPENAI_API_KEY="${{ secrets.OPENAI_API_KEY }}" \
--net=host oneuptime/copilot:test

File diff suppressed because it is too large Load Diff

1
.gitignore vendored
View File

@@ -128,3 +128,4 @@ MCP/.env
MCP/node_modules
Dashboard/public/sw.js
.claude/settings.local.json
Common/.claude/settings.local.json

View File

@@ -1,15 +0,0 @@
## OneUptime Copilot
This folder contains the configuration files for the OneUptime Copilot. The Copilot is a tool that automatically improves your code. It can fix issues, improve code quality, and help you ship faster.
This folder has the following structure:
- `config.js`: The configuration file for the Copilot. You can customize the Copilot's behavior by changing this file.
- `scripts`: A folder containing scripts that the Copilot runs. These are hooks that run at different stages of the Copilot's process.
- `on-after-clone.sh`: A script that runs after the Copilot clones your repository.
- `on-before-code-change.sh`: A script that runs before the Copilot makes changes to your code.
- `on-after-code-change.sh`: A script that runs after the Copilot makes changes to your code.
- `on-before-commit.sh`: A script that runs before the Copilot commits changes to your repository.
- `on-after-commit.sh`: A script that runs after the Copilot commits changes to your repository.

View File

@@ -1,10 +0,0 @@
// This is the configuration file for the oneuptime copilot.
const getCopilotConfig = () => {
return {
// The version of the schema for this configuration file.
schemaVersion: '1.0',
}
}
export default getCopilotConfig;

View File

@@ -1,16 +0,0 @@
# Description: Copilot clones your repository and to improve your code.
# This scirpt runs after the clone process is completed.
# Some of the common tasks you can do here are:
# 1. Install dependencies
# 2. Run linting
# 3. Run tests
# 4. Run build
# 5. Run any other command that you want to run after the clone process is completed.
# If this script fails, copilot will not proceed with the next steps to improve your code.
# This step is to ensure that the code is in a good state before we start improving it.
# If you want to skip this script, you can keep this file empty.
# It's highly recommended to run linting and tests in this script to ensure the code is in a good state.
# This scirpt will run on ubuntu machine. So, make sure the commands you run are compatible with ubuntu.
npm install
npm run lint

View File

@@ -1,13 +0,0 @@
# Description: Copilot will run this script after we make improvements to your code and write it to disk.
# Some of the common tasks you can do here are:
# 1. Run linting
# 2. Run tests
# 3. Run build
# 4. Run any other command that you want to run after the code is changed.
# If this script fails, copilot will not commit the changes to your repository.
# This step is to ensure that the code is in a good state before we commit the changes.
# If you want to skip this script, you can keep this file empty.
# It's highly recommended to run linting and tests in this script to ensure the code is in a good state.
# This scirpt will run on ubuntu machine. So, make sure the commands you run are compatible with ubuntu.
npm run fix

View File

@@ -1 +0,0 @@
# Description: Copilot will run this script after the commit process is completed.

View File

@@ -1,9 +0,0 @@
# Description: Copilot will run this script before we make changes to your code.
# Some of the common tasks you can do here are:
# 1. Install dependencies
# 2. Run any other command that you want to run before the code is changed.
# If this script fails, copilot will not make any changes to the code.
# This step is to ensure that the code is in a good state before we start making changes.
# If you want to skip this script, you can keep this file empty.
# It's highly recommended to run things like installing dependencies in this script.
# This scirpt will run on ubuntu machine. So, make sure the commands you run are compatible with ubuntu.

View File

@@ -1 +0,0 @@
# Description: Copilot will run this script before we commit the changes to your repository.

14
.vscode/launch.json vendored
View File

@@ -19,20 +19,6 @@
}
],
"configurations": [
{
"address": "127.0.0.1",
"localRoot": "${workspaceFolder}/TestServer",
"name": "Copilot: Debug with Docker",
"port": 9985,
"remoteRoot": "/usr/src/app",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node",
"restart": true,
"autoAttachChildProcesses": true
},
{
"name": "Debug Infrastructure Agent",
"type": "go",

View File

@@ -7,8 +7,8 @@ FROM public.ecr.aws/docker/library/node:24.9-alpine3.21
RUN mkdir /tmp/npm && chmod 2777 /tmp/npm && chown 1000:1000 /tmp/npm && npm config set cache /tmp/npm --global
RUN npm config set fetch-retries 5
RUN npm config set fetch-retry-mintimeout 100000
RUN npm config set fetch-retry-maxtimeout 600000
RUN npm config set fetch-retry-mintimeout 20000
RUN npm config set fetch-retry-maxtimeout 60000

View File

@@ -1,4 +1,7 @@
import { CodeExamplesPath, ViewsPath } from "../Utils/Config";
import CodeExampleGenerator, {
CodeExamples,
} from "../Utils/CodeExampleGenerator";
import ResourceUtil, { ModelDocumentation } from "../Utils/Resources";
import PageNotFoundServiceHandler from "./PageNotFound";
import { AppApiRoute } from "Common/ServiceRoute";
@@ -8,6 +11,7 @@ import {
TableColumnMetadata,
} from "Common/Types/Database/TableColumn";
import Dictionary from "Common/Types/Dictionary";
import { JSONObject, JSONValue } from "Common/Types/JSON";
import ObjectID from "Common/Types/ObjectID";
import Permission, {
PermissionHelper,
@@ -18,6 +22,296 @@ import { ExpressRequest, ExpressResponse } from "Common/Server/Utils/Express";
import LocalFile from "Common/Server/Utils/LocalFile";
import { IsBillingEnabled } from "Common/Server/EnvironmentConfig";
interface ExampleObjects {
simpleSelectExample: JSONObject;
simpleQueryExample: JSONObject;
simpleSortExample: JSONObject;
simpleCreateExample: JSONObject;
simpleUpdateExample: JSONObject;
simpleResponseExample: JSONObject;
simpleListResponseExample: Array<JSONObject>;
}
interface ApiCodeExamples {
list: CodeExamples;
getItem: CodeExamples;
count: CodeExamples;
create: CodeExamples;
update: CodeExamples;
delete: CodeExamples;
}
// Helper function to get a default example value based on column type
function getDefaultExampleForType(
columnType: string | undefined,
columnTitle: string | undefined,
): JSONValue {
const typeStr: string = (columnType || "").toLowerCase();
const title: string = (columnTitle || "").toLowerCase();
if (typeStr.includes("objectid") || typeStr.includes("id")) {
return "550e8400-e29b-41d4-a716-446655440000";
}
if (typeStr.includes("boolean") || typeStr.includes("bool")) {
return true;
}
if (
typeStr.includes("number") ||
typeStr.includes("int") ||
typeStr.includes("decimal")
) {
return 100;
}
if (typeStr.includes("date") || typeStr.includes("time")) {
return "2024-01-15T10:30:00.000Z";
}
if (typeStr.includes("email")) {
return "user@example.com";
}
if (typeStr.includes("phone")) {
return "+1-555-123-4567";
}
if (typeStr.includes("url") || typeStr.includes("link")) {
return "https://example.com";
}
if (typeStr.includes("color")) {
return "#3498db";
}
if (
typeStr.includes("markdown") ||
typeStr.includes("longtext") ||
typeStr.includes("description")
) {
return `Example ${title || "text"} content`;
}
if (typeStr.includes("json") || typeStr.includes("object")) {
return { key: "value" };
}
if (typeStr.includes("array")) {
return [];
}
// Default for text fields
return `Example ${title || "value"}`;
}
// Helper function to generate example objects from column metadata
function generateExampleObjects(
tableColumns: Dictionary<TableColumnMetadata>,
exampleObjectID: string,
): ExampleObjects {
const simpleSelectExample: JSONObject = {};
const simpleQueryExample: JSONObject = {};
const simpleSortExample: JSONObject = {};
const simpleCreateExample: JSONObject = {};
const simpleUpdateExample: JSONObject = {};
const simpleResponseExample: JSONObject = {
_id: exampleObjectID,
};
// Sort columns: prioritize fields with examples, then required, then alphabetically
const sortedColumnKeys: Array<string> = Object.keys(tableColumns).sort(
(a: string, b: string) => {
const aHasExample: boolean = tableColumns[a]?.example !== undefined;
const bHasExample: boolean = tableColumns[b]?.example !== undefined;
const aRequired: boolean = tableColumns[a]?.required || false;
const bRequired: boolean = tableColumns[b]?.required || false;
// Prioritize fields with examples
if (aHasExample && !bHasExample) {
return -1;
}
if (!aHasExample && bHasExample) {
return 1;
}
// Then prioritize required fields
if (aRequired && !bRequired) {
return -1;
}
if (!aRequired && bRequired) {
return 1;
}
return a.localeCompare(b);
},
);
let selectCount: number = 0;
let createCount: number = 0;
let updateCount: number = 0;
for (const key of sortedColumnKeys) {
const column: TableColumnMetadata | undefined = tableColumns[key];
if (!column) {
continue;
}
const accessControl: ColumnAccessControl | undefined = (
column as unknown as JSONObject
)["permissions"] as ColumnAccessControl | undefined;
// Get the example value - use defined example or generate a default
const exampleValue: JSONValue =
column.example !== undefined
? (column.example as JSONValue)
: getDefaultExampleForType(column.type?.toString(), column.title);
/*
* Add to select example (limit to 5 fields for readability)
* Also add the field to response example so response matches select
*/
if (
selectCount < 5 &&
accessControl?.read &&
accessControl.read.length > 0
) {
simpleSelectExample[key] = true;
simpleResponseExample[key] = exampleValue;
selectCount++;
}
// Add to create example (only fields with create permission)
if (
createCount < 5 &&
accessControl?.create &&
accessControl.create.length > 0 &&
!column.computed
) {
simpleCreateExample[key] = exampleValue;
createCount++;
}
// Add to update example (only fields with update permission)
if (
updateCount < 3 &&
accessControl?.update &&
accessControl.update.length > 0 &&
!column.computed
) {
simpleUpdateExample[key] = exampleValue;
updateCount++;
}
}
// Add a query example using the first string/text field with an example
for (const key of sortedColumnKeys) {
const column: TableColumnMetadata | undefined = tableColumns[key];
if (column) {
const exampleValue: JSONValue =
column.example !== undefined
? (column.example as JSONValue)
: getDefaultExampleForType(column.type?.toString(), column.title);
if (
typeof exampleValue === "string" &&
column.type?.toString().toLowerCase().includes("text")
) {
simpleQueryExample[key] = exampleValue;
break;
}
}
}
// Add sort example - sort by createdAt descending if available
simpleSortExample["createdAt"] = -1;
// Generate list response with 3 sample items
const simpleListResponseExample: Array<JSONObject> = [
{ ...simpleResponseExample, _id: exampleObjectID },
{
...simpleResponseExample,
_id: ObjectID.generate().toString(),
},
{
...simpleResponseExample,
_id: ObjectID.generate().toString(),
},
];
return {
simpleSelectExample,
simpleQueryExample,
simpleSortExample,
simpleCreateExample,
simpleUpdateExample,
simpleResponseExample,
simpleListResponseExample,
};
}
// Helper function to generate code examples for all API operations
function generateApiCodeExamples(
apiPath: string,
exampleObjects: ExampleObjects,
exampleObjectID: string,
): ApiCodeExamples {
// List endpoint
const listExamples: CodeExamples = CodeExampleGenerator.generate({
method: "POST",
endpoint: `${apiPath}/get-list?skip=0&limit=10`,
body: {
select: exampleObjects.simpleSelectExample,
query: exampleObjects.simpleQueryExample,
sort: exampleObjects.simpleSortExample,
},
description: "List items with pagination",
});
// Get item endpoint
const getItemExamples: CodeExamples = CodeExampleGenerator.generate({
method: "POST",
endpoint: `${apiPath}/${exampleObjectID}/get-item`,
body: {
select: exampleObjects.simpleSelectExample,
},
description: "Get a single item by ID",
});
// Count endpoint
const countExamples: CodeExamples = CodeExampleGenerator.generate({
method: "POST",
endpoint: `${apiPath}/count`,
body: {
query: exampleObjects.simpleQueryExample,
},
description: "Count items matching a query",
});
// Create endpoint
const createExamples: CodeExamples = CodeExampleGenerator.generate({
method: "POST",
endpoint: apiPath,
body: {
data: exampleObjects.simpleCreateExample,
},
description: "Create a new item",
});
// Update endpoint
const updateExamples: CodeExamples = CodeExampleGenerator.generate({
method: "PUT",
endpoint: `${apiPath}/${exampleObjectID}`,
body: {
data: exampleObjects.simpleUpdateExample,
},
description: "Update an existing item",
});
// Delete endpoint
const deleteExamples: CodeExamples = CodeExampleGenerator.generate({
method: "DELETE",
endpoint: `${apiPath}/${exampleObjectID}`,
description: "Delete an item by ID",
});
return {
list: listExamples,
getItem: getItemExamples,
count: countExamples,
create: createExamples,
update: updateExamples,
delete: deleteExamples,
};
}
// Get all resources and resource dictionary
const Resources: Array<ModelDocumentation> = ResourceUtil.getResources();
const ResourceDictionary: Dictionary<ModelDocumentation> =
@@ -261,11 +555,28 @@ export default class ServiceHandler {
);
// Generate a unique ID for the example object
pageData["exampleObjectID"] = ObjectID.generate();
const exampleObjectID: string = ObjectID.generate().toString();
pageData["exampleObjectID"] = exampleObjectID;
// Generate dynamic example objects from column metadata
const exampleObjects: ExampleObjects = generateExampleObjects(
tableColumns,
exampleObjectID,
);
pageData["exampleObjects"] = exampleObjects;
// Construct the API path for the current resource
pageData["apiPath"] =
const apiPath: string =
AppApiRoute.toString() + currentResource.model.crudApiPath?.toString();
pageData["apiPath"] = apiPath;
// Generate code examples for all languages
const codeExamples: ApiCodeExamples = generateApiCodeExamples(
apiPath,
exampleObjects,
exampleObjectID,
);
pageData["codeExamples"] = codeExamples;
// Check if the current resource is a master admin API
pageData["isMasterAdminApiDocs"] =

View File

@@ -0,0 +1,771 @@
import { JSONObject } from "Common/Types/JSON";
export interface RequestPreview {
headers: string;
body: string;
}
export interface CodeExamples {
requestPreview: RequestPreview;
curl: string;
javascript: string;
typescript: string;
python: string;
go: string;
java: string;
csharp: string;
php: string;
ruby: string;
rust: string;
powershell: string;
}
export interface ApiRequestParams {
method: "GET" | "POST" | "PUT" | "DELETE";
endpoint: string;
body?: JSONObject;
description?: string;
}
export default class CodeExampleGenerator {
private static readonly API_KEY_PLACEHOLDER: string = "YOUR_API_KEY";
private static readonly BASE_URL: string = "https://oneuptime.com";
public static generate(params: ApiRequestParams): CodeExamples {
return {
requestPreview: this.generateRequestPreview(params),
curl: this.generateCurl(params),
javascript: this.generateJavaScript(params),
typescript: this.generateTypeScript(params),
python: this.generatePython(params),
go: this.generateGo(params),
java: this.generateJava(params),
csharp: this.generateCSharp(params),
php: this.generatePHP(params),
ruby: this.generateRuby(params),
rust: this.generateRust(params),
powershell: this.generatePowerShell(params),
};
}
private static generateRequestPreview(
params: ApiRequestParams,
): RequestPreview {
const { body } = params;
const headers: string = `Content-Type: application/json
ApiKey: ${this.API_KEY_PLACEHOLDER}`;
const bodyStr: string =
body && Object.keys(body).length > 0 ? JSON.stringify(body, null, 2) : "";
return {
headers,
body: bodyStr,
};
}
private static generateCurl(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let curlCmd: string = `curl -X ${method} "${url}"`;
curlCmd += ` \\\n -H "Content-Type: application/json"`;
curlCmd += ` \\\n -H "ApiKey: ${this.API_KEY_PLACEHOLDER}"`;
if (body && Object.keys(body).length > 0) {
const jsonBody: string = JSON.stringify(body, null, 2)
.split("\n")
.map((line: string, index: number) => {
return index === 0 ? line : ` ${line}`;
})
.join("\n");
curlCmd += ` \\\n -d '${jsonBody}'`;
}
return curlCmd;
}
private static generateJavaScript(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let code: string = `const axios = require('axios');
const response = await axios({
method: '${method.toLowerCase()}',
url: '${url}',
headers: {
'Content-Type': 'application/json',
'ApiKey': '${this.API_KEY_PLACEHOLDER}'
}`;
if (body && Object.keys(body).length > 0) {
const jsonBody: string = JSON.stringify(body, null, 2)
.split("\n")
.map((line: string, index: number) => {
return index === 0 ? line : ` ${line}`;
})
.join("\n");
code += `,\n data: ${jsonBody}`;
}
code += `
});
console.log(response.data);`;
return code;
}
private static generateTypeScript(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let code: string = `import axios, { AxiosResponse } from 'axios';
interface ApiResponse {
// Define your response type here
[key: string]: unknown;
}
const response: AxiosResponse<ApiResponse> = await axios({
method: '${method.toLowerCase()}',
url: '${url}',
headers: {
'Content-Type': 'application/json',
'ApiKey': '${this.API_KEY_PLACEHOLDER}'
}`;
if (body && Object.keys(body).length > 0) {
const jsonBody: string = JSON.stringify(body, null, 2)
.split("\n")
.map((line: string, index: number) => {
return index === 0 ? line : ` ${line}`;
})
.join("\n");
code += `,\n data: ${jsonBody}`;
}
code += `
});
console.log(response.data);`;
return code;
}
private static generatePython(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let code: string = `import requests
url = "${url}"
headers = {
"Content-Type": "application/json",
"ApiKey": "${this.API_KEY_PLACEHOLDER}"
}`;
if (body && Object.keys(body).length > 0) {
const pythonBody: string = this.jsonToPython(body);
code += `
payload = ${pythonBody}
response = requests.${method.toLowerCase()}(url, json=payload, headers=headers)`;
} else {
code += `
response = requests.${method.toLowerCase()}(url, headers=headers)`;
}
code += `
print(response.json())`;
return code;
}
private static generateGo(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let code: string = `package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {`;
if (body && Object.keys(body).length > 0) {
code += `
payload := map[string]interface{}{`;
const entries: Array<string> = Object.entries(body).map(
([key, value]: [string, unknown]) => {
return ` "${key}": ${this.goValue(value)}`;
},
);
code += `\n${entries.join(",\n")},
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("${method}", "${url}", bytes.NewBuffer(jsonData))`;
} else {
code += `
req, _ := http.NewRequest("${method}", "${url}", nil)`;
}
code += `
req.Header.Set("Content-Type", "application/json")
req.Header.Set("ApiKey", "${this.API_KEY_PLACEHOLDER}")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}`;
return code;
}
private static generateJava(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let code: string = `import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ApiRequest {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
`;
if (body && Object.keys(body).length > 0) {
const jsonBody: string = JSON.stringify(body, null, 12).replace(
/"/g,
'\\"',
);
code += `
String jsonBody = "${jsonBody.replace(/\n/g, "\\n")}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("${url}"))
.header("Content-Type", "application/json")
.header("ApiKey", "${this.API_KEY_PLACEHOLDER}")
.method("${method}", HttpRequest.BodyPublishers.ofString(jsonBody))
.build();`;
} else {
code += `
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("${url}"))
.header("Content-Type", "application/json")
.header("ApiKey", "${this.API_KEY_PLACEHOLDER}")
.method("${method}", HttpRequest.BodyPublishers.noBody())
.build();`;
}
code += `
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}`;
return code;
}
private static generateCSharp(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let code: string = `using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("ApiKey", "${this.API_KEY_PLACEHOLDER}");
`;
if (body && Object.keys(body).length > 0) {
const jsonBody: string = JSON.stringify(body, null, 8);
code += `
var json = @"${jsonBody.replace(/"/g, '""')}";
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.${this.csharpMethod(method)}Async(
"${url}"${method !== "GET" && method !== "DELETE" ? ", content" : ""});`;
} else {
code += `
var response = await client.${this.csharpMethod(method)}Async("${url}");`;
}
code += `
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}`;
return code;
}
private static generatePHP(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let code: string = `<?php
$url = "${url}";
$headers = [
"Content-Type: application/json",
"ApiKey: ${this.API_KEY_PLACEHOLDER}"
];
`;
if (body && Object.keys(body).length > 0) {
code += `
$data = ${this.jsonToPhp(body)};
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "${method}");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));`;
} else {
code += `
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "${method}");`;
}
code += `
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result);
?>`;
return code;
}
private static generateRuby(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let code: string = `require 'net/http'
require 'uri'
require 'json'
uri = URI.parse("${url}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::${this.rubyMethodClass(method)}.new(uri.request_uri)
request["Content-Type"] = "application/json"
request["ApiKey"] = "${this.API_KEY_PLACEHOLDER}"`;
if (body && Object.keys(body).length > 0) {
const rubyBody: string = this.jsonToRuby(body);
code += `
request.body = ${rubyBody}.to_json`;
}
code += `
response = http.request(request)
puts JSON.parse(response.body)`;
return code;
}
private static generateRust(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let code: string = `use reqwest::header::{HeaderMap, HeaderValue, CONTENT_TYPE};
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::new();
let mut headers = HeaderMap::new();
headers.insert(CONTENT_TYPE, HeaderValue::from_static("application/json"));
headers.insert("ApiKey", HeaderValue::from_static("${this.API_KEY_PLACEHOLDER}"));`;
if (body && Object.keys(body).length > 0) {
const rustBody: string = this.jsonToRust(body);
code += `
let body = ${rustBody};
let response = client
.${method.toLowerCase()}("${url}")
.headers(headers)
.json(&body)
.send()
.await?;`;
} else {
code += `
let response = client
.${method.toLowerCase()}("${url}")
.headers(headers)
.send()
.await?;`;
}
code += `
let result: serde_json::Value = response.json().await?;
println!("{:#?}", result);
Ok(())
}`;
return code;
}
private static generatePowerShell(params: ApiRequestParams): string {
const { method, endpoint, body } = params;
const url: string = `${this.BASE_URL}${endpoint}`;
let code: string = `$headers = @{
"Content-Type" = "application/json"
"ApiKey" = "${this.API_KEY_PLACEHOLDER}"
}`;
if (body && Object.keys(body).length > 0) {
const psBody: string = this.jsonToPowerShell(body);
code += `
$body = ${psBody} | ConvertTo-Json -Depth 10
$response = Invoke-RestMethod -Uri "${url}" -Method ${method} -Headers $headers -Body $body`;
} else {
code += `
$response = Invoke-RestMethod -Uri "${url}" -Method ${method} -Headers $headers`;
}
code += `
$response | ConvertTo-Json -Depth 10`;
return code;
}
// Helper methods for language-specific formatting
private static jsonToPython(obj: JSONObject, indent: number = 0): string {
const spaces: string = " ".repeat(indent);
const innerSpaces: string = " ".repeat(indent + 1);
if (Array.isArray(obj)) {
if (obj.length === 0) {
return "[]";
}
const items: Array<string> = obj.map((item: unknown) => {
return this.jsonToPython(item as JSONObject, indent + 1);
});
return `[\n${innerSpaces}${items.join(`,\n${innerSpaces}`)}\n${spaces}]`;
}
if (typeof obj === "object" && obj !== null) {
const entries: Array<string> = Object.entries(obj).map(
([key, value]: [string, unknown]) => {
return `${innerSpaces}"${key}": ${this.pythonValue(value, indent + 1)}`;
},
);
return `{\n${entries.join(",\n")}\n${spaces}}`;
}
return this.pythonValue(obj, indent);
}
private static pythonValue(value: unknown, indent: number = 0): string {
if (value === null) {
return "None";
}
if (typeof value === "boolean") {
return value ? "True" : "False";
}
if (typeof value === "string") {
return `"${value}"`;
}
if (typeof value === "number") {
return String(value);
}
if (typeof value === "object") {
return this.jsonToPython(value as JSONObject, indent);
}
return String(value);
}
private static goValue(value: unknown): string {
if (value === null) {
return "nil";
}
if (typeof value === "boolean") {
return value ? "true" : "false";
}
if (typeof value === "string") {
return `"${value}"`;
}
if (typeof value === "number") {
return String(value);
}
if (Array.isArray(value)) {
return `[]interface{}{${value
.map((v: unknown) => {
return this.goValue(v);
})
.join(", ")}}`;
}
if (typeof value === "object") {
const entries: Array<string> = Object.entries(
value as Record<string, unknown>,
).map(([k, v]: [string, unknown]) => {
return `"${k}": ${this.goValue(v)}`;
});
return `map[string]interface{}{${entries.join(", ")}}`;
}
return String(value);
}
private static jsonToRuby(obj: JSONObject, indent: number = 0): string {
const spaces: string = " ".repeat(indent);
const innerSpaces: string = " ".repeat(indent + 1);
if (Array.isArray(obj)) {
if (obj.length === 0) {
return "[]";
}
const items: Array<string> = obj.map((item: unknown) => {
return this.jsonToRuby(item as JSONObject, indent + 1);
});
return `[\n${innerSpaces}${items.join(`,\n${innerSpaces}`)}\n${spaces}]`;
}
if (typeof obj === "object" && obj !== null) {
const entries: Array<string> = Object.entries(obj).map(
([key, value]: [string, unknown]) => {
return `${innerSpaces}"${key}" => ${this.rubyValue(value, indent + 1)}`;
},
);
return `{\n${entries.join(",\n")}\n${spaces}}`;
}
return this.rubyValue(obj, indent);
}
private static rubyValue(value: unknown, indent: number = 0): string {
if (value === null) {
return "nil";
}
if (typeof value === "boolean") {
return value ? "true" : "false";
}
if (typeof value === "string") {
return `"${value}"`;
}
if (typeof value === "number") {
return String(value);
}
if (typeof value === "object") {
return this.jsonToRuby(value as JSONObject, indent);
}
return String(value);
}
private static rubyMethodClass(method: string): string {
const methodMap: Record<string, string> = {
GET: "Get",
POST: "Post",
PUT: "Put",
DELETE: "Delete",
};
return methodMap[method] || "Get";
}
private static csharpMethod(method: string): string {
const methodMap: Record<string, string> = {
GET: "Get",
POST: "Post",
PUT: "Put",
DELETE: "Delete",
};
return methodMap[method] || "Get";
}
private static jsonToRust(obj: JSONObject, indent: number = 0): string {
const spaces: string = " ".repeat(indent);
const innerSpaces: string = " ".repeat(indent + 1);
if (Array.isArray(obj)) {
if (obj.length === 0) {
return "json!([])";
}
const items: Array<string> = obj.map((item: unknown) => {
return this.rustInnerValue(item, indent + 1);
});
return `json!([\n${innerSpaces}${items.join(`,\n${innerSpaces}`)}\n${spaces}])`;
}
if (typeof obj === "object" && obj !== null) {
const entries: Array<string> = Object.entries(obj).map(
([key, value]: [string, unknown]) => {
return `${innerSpaces}"${key}": ${this.rustInnerValue(value, indent + 1)}`;
},
);
return `json!({\n${entries.join(",\n")}\n${spaces}})`;
}
return `json!(${this.rustInnerValue(obj, indent)})`;
}
private static rustInnerValue(value: unknown, indent: number = 0): string {
if (value === null) {
return "null";
}
if (typeof value === "boolean") {
return value ? "true" : "false";
}
if (typeof value === "string") {
return `"${value}"`;
}
if (typeof value === "number") {
return String(value);
}
if (Array.isArray(value)) {
const spaces: string = " ".repeat(indent);
const innerSpaces: string = " ".repeat(indent + 1);
const items: Array<string> = value.map((v: unknown) => {
return this.rustInnerValue(v, indent + 1);
});
return `[\n${innerSpaces}${items.join(`,\n${innerSpaces}`)}\n${spaces}]`;
}
if (typeof value === "object") {
const spaces: string = " ".repeat(indent);
const innerSpaces: string = " ".repeat(indent + 1);
const entries: Array<string> = Object.entries(
value as Record<string, unknown>,
).map(([k, v]: [string, unknown]) => {
return `${innerSpaces}"${k}": ${this.rustInnerValue(v, indent + 1)}`;
});
return `{\n${entries.join(",\n")}\n${spaces}}`;
}
return String(value);
}
private static jsonToPowerShell(obj: JSONObject, indent: number = 0): string {
const spaces: string = " ".repeat(indent);
const innerSpaces: string = " ".repeat(indent + 1);
if (Array.isArray(obj)) {
if (obj.length === 0) {
return "@()";
}
const items: Array<string> = obj.map((item: unknown) => {
return this.jsonToPowerShell(item as JSONObject, indent + 1);
});
return `@(\n${innerSpaces}${items.join(`,\n${innerSpaces}`)}\n${spaces})`;
}
if (typeof obj === "object" && obj !== null) {
const entries: Array<string> = Object.entries(obj).map(
([key, value]: [string, unknown]) => {
return `${innerSpaces}${key} = ${this.psValue(value, indent + 1)}`;
},
);
return `@{\n${entries.join("\n")}\n${spaces}}`;
}
return this.psValue(obj, indent);
}
private static psValue(value: unknown, indent: number = 0): string {
if (value === null) {
return "$null";
}
if (typeof value === "boolean") {
return value ? "$true" : "$false";
}
if (typeof value === "string") {
return `"${value}"`;
}
if (typeof value === "number") {
return String(value);
}
if (typeof value === "object") {
return this.jsonToPowerShell(value as JSONObject, indent);
}
return String(value);
}
private static jsonToPhp(obj: JSONObject, indent: number = 0): string {
const spaces: string = " ".repeat(indent);
const innerSpaces: string = " ".repeat(indent + 1);
if (Array.isArray(obj)) {
if (obj.length === 0) {
return "[]";
}
const items: Array<string> = obj.map((item: unknown) => {
return this.jsonToPhp(item as JSONObject, indent + 1);
});
return `[\n${innerSpaces}${items.join(`,\n${innerSpaces}`)}\n${spaces}]`;
}
if (typeof obj === "object" && obj !== null) {
const entries: Array<string> = Object.entries(obj).map(
([key, value]: [string, unknown]) => {
return `${innerSpaces}"${key}" => ${this.phpValue(value, indent + 1)}`;
},
);
return `[\n${entries.join(",\n")}\n${spaces}]`;
}
return this.phpValue(obj, indent);
}
private static phpValue(value: unknown, indent: number = 0): string {
if (value === null) {
return "null";
}
if (typeof value === "boolean") {
return value ? "true" : "false";
}
if (typeof value === "string") {
return `"${value}"`;
}
if (typeof value === "number") {
return String(value);
}
if (typeof value === "object") {
return this.jsonToPhp(value as JSONObject, indent);
}
return String(value);
}
}

View File

@@ -2,6 +2,10 @@
"name": "@oneuptime/api-reference",
"version": "1.0.0",
"description": "",
"repository": {
"type": "git",
"url": "https://github.com/OneUptime/oneuptime"
},
"main": "Index.ts",
"scripts": {
"start": "export NODE_OPTIONS='--max-old-space-size=8096' && node --require ts-node/register Index.ts",

View File

@@ -1,15 +1,19 @@
<main class="py-16">
<article class="prose">
<div>
<div>
<h1 class="next-error-h1" style="display:inline-block;margin:0;margin-right:20px;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1>
<div style="display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle">
<h2 style="font-size:14px;font-weight:normal;line-height:49px;margin:0;padding:0">
This page could not be found<!-- -->.
</h2>
</div>
</div>
</div>
</article>
</main>
<main class="py-12">
<article class="prose">
<div class="text-center py-20">
<div class="flex items-center justify-center w-16 h-16 rounded-2xl bg-indigo-100 mx-auto mb-6">
<svg class="w-8 h-8 text-indigo-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
</div>
<h1 class="text-7xl font-bold text-slate-900 tracking-tight mb-4">404</h1>
<p class="text-xl text-slate-600 mb-8">This page could not be found.</p>
<a href="/reference" class="inline-flex items-center gap-2 rounded-lg bg-indigo-600 px-5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 transition-colors">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path>
</svg>
Back to API Reference
</a>
</div>
</article>
</main>

View File

@@ -1,39 +1,51 @@
<main class="py-16">
<main class="py-12">
<article class="prose">
<h1>Authentication</h1>
<p class="lead">You'll need to authenticate your requests to access any of the endpoints in the OneUptime API. In
this guide, we'll look at how authentication works. OneUptime offers one way to authenticate your API requests
- by using an API Key.</p>
<!-- Hero Section -->
<div class="mb-10">
<div class="flex items-center gap-3 mb-4">
<div class="flex items-center justify-center w-10 h-10 rounded-xl bg-indigo-600 shadow-lg shadow-indigo-500/30">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"></path>
</svg>
</div>
<span class="text-xs font-semibold text-indigo-600 uppercase tracking-wider">Guide</span>
</div>
<h1 class="font-bold text-3xl text-slate-900 tracking-tight mb-3">Authentication</h1>
<p class="text-lg text-slate-600 leading-relaxed max-w-2xl">You'll need to authenticate your requests to access any of the endpoints in the OneUptime API. In this guide, we'll look at how authentication works. OneUptime offers one way to authenticate your API requests - by using an API Key.</p>
</div>
<h2 id="basic-authentication" class="mb-5 scroll-mt-24 mt-24 font-bold text-lg">
<h2 id="generate-api-key" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-4 mt-12">
Generate an API Key
</h2>
<p> Please head over to <b>Project Settings</b> > <b>API Keys</b>. Create a new API Key. Please note: New API Keys
have no permissions assigned to them, so you will have to assign a permission before you can use it.</p>
<a class="mt-5 inline-flex gap-0.5 justify-center overflow-hidden font-medium transition text-emerald-500 hover:text-emerald-600 "
href="/reference/permissions">
<p class="text-slate-600 leading-relaxed">Please head over to <strong class="text-slate-800">Project Settings</strong> > <strong class="text-slate-800">API Keys</strong>. Create a new API Key. Please note: New API Keys have no permissions assigned to them, so you will have to assign a permission before you can use it.</p>
<a class="mt-4 inline-flex gap-1 items-center font-medium text-indigo-600 hover:text-indigo-700 transition-colors" href="/reference/permissions">
Read more about permissions
<svg viewBox="0 0 20 20" fill="none" aria-hidden="true" class="mt-0.5 h-5 w-5 relative top-px -mr-1">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
d="m11.5 6.5 3 3.5m0 0-3 3.5m3-3.5h-9"></path>
<svg viewBox="0 0 20 20" fill="none" aria-hidden="true" class="h-5 w-5">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="m11.5 6.5 3 3.5m0 0-3 3.5m3-3.5h-9"></path>
</svg>
</a>
<h2 id="basic-authentication" class="mb-5 scroll-mt-24 mt-24 font-bold text-lg">
<h2 id="project-id" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-4 mt-12">
Project ID
</h2>
<p> Please head over to <b>Project Settings</b> > <b>Project</b>. You should see your Project ID there.</p>
<p class="text-slate-600 leading-relaxed">Please head over to <strong class="text-slate-800">Project Settings</strong> > <strong class="text-slate-800">Project</strong>. You should see your Project ID there.</p>
<h2 id="basic-authentication">
<h2 id="auth-with-api-key" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-4 mt-12">
Authentication with API Key
</h2>
<p>You can use OneUptime API Key on Request Header when you're making a request. You can use <code
class="rounded p-0.5 px-1 text-sm text-gray-500 bg-gray-100 border-2 border-gray-200">Authorization</code>
header with your API Key when you make a request.</p>
<p class="text-slate-600 leading-relaxed mb-6">You can use OneUptime API Key on Request Header when you're making a request. You can use <code class="inline-code">ApiKey</code> header with your API Key when you make a request.</p>
<%- include('../partials/code', {title: "Example request with API Key" , requestUrl: "" , requestType: "" , code: "curl --header \"ApiKey: {secret-api-key}\" https://oneuptime.com/api/\<path\>" }) -%>
<p class="text-sm">Please don't commit your OneUptime API Key to GitHub, or on any other source control
project. Please regenerate a new API Key, if your API Key is committed by mistake.</p>
<div class="mt-6 rounded-xl border border-amber-200 bg-amber-50 p-4">
<div class="flex gap-3">
<div class="flex-shrink-0">
<svg class="h-5 w-5 text-amber-500" viewBox="0 0 20 20" fill="currentColor">
<path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd" />
</svg>
</div>
<p class="text-sm text-amber-800">Please don't commit your OneUptime API Key to GitHub, or on any other source control project. Please regenerate a new API Key if your API Key is committed by mistake.</p>
</div>
</div>
</article>
</main>
</main>

View File

@@ -1,14 +1,22 @@
<main class="py-16">
<article class="prose ">
<h1>Data Types</h1>
<p class="lead">In this guide, we will look at how to work with OneUptime Data Types when querying the OneUptime
API. </p>
<main class="py-12">
<article class="prose">
<!-- Hero Section -->
<div class="mb-10">
<div class="flex items-center gap-3 mb-4">
<div class="flex items-center justify-center w-10 h-10 rounded-xl bg-indigo-600 shadow-lg shadow-indigo-500/30">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path>
</svg>
</div>
<span class="text-xs font-semibold text-indigo-600 uppercase tracking-wider">Guide</span>
</div>
<h1 class="font-bold text-3xl text-slate-900 tracking-tight mb-3">Data Types</h1>
<p class="text-lg text-slate-600 leading-relaxed max-w-2xl">In this guide, we will look at how to work with OneUptime Data Types when querying the OneUptime API.</p>
</div>
<a href="#select" class="cursor-default">
<h2 id="example-using-cursors" class="scroll-mt-24">
Select
</h2>
</a>
<h2 id="select" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-4 mt-12">
Select
</h2>
<div class="grid grid-cols-1 items-start gap-x-16 gap-y-10 xl:max-w-none xl:grid-cols-2">
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Select can be used to select fields from an Object in List or Get Item API. By default only ID's
@@ -16,13 +24,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Select</dt>
<dd><code class="inline-code">select</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Select</dd>
<dd class="font-mono text-xs text-slate-500 ">Select</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Dictionary of fieldName - boolean as JSON Object. Here's an example. If the
@@ -46,11 +54,9 @@
<a href="#sort" class="cursor-default">
<h2 id="example-using-cursors" class="scroll-mt-24">
Sort
</h2>
</a>
<h2 id="sort" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-4 mt-12 pt-8 border-t border-slate-200">
Sort
</h2>
<div class="grid grid-cols-1 items-start gap-x-16 gap-y-10 xl:max-w-none xl:grid-cols-2">
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Sort can be used to sort list by fields in List API. By default objects are sorted by their createdAt
@@ -59,13 +65,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Sort</dt>
<dd><code class="inline-code">sort</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Sort</dd>
<dd class="font-mono text-xs text-slate-500 ">Sort</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Dictionary of fieldName - 'DESC' / 'ASC' as JSON Object. Here's an example. If
@@ -87,11 +93,9 @@
</div>
<a href="#queries" class="cursor-default">
<h2 id="example-using-cursors" class="scroll-mt-24">
Query
</h2>
</a>
<h2 id="queries" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-4 mt-12 pt-8 border-t border-slate-200">
Query
</h2>
<h3 id="example-using-cursors" class="scroll-mt-24">
@@ -106,13 +110,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Query</dt>
<dd><code class="inline-code">query</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Query</dd>
<dd class="font-mono text-xs text-slate-500 ">Query</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Here is an example of an Equal To Query</p>
@@ -144,13 +148,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Query</dt>
<dd><code class="inline-code">query</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Query</dd>
<dd class="font-mono text-xs text-slate-500 ">Query</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Here is an example of a Not Equal To Query</p>
@@ -182,13 +186,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Query</dt>
<dd><code class="inline-code">query</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Query</dd>
<dd class="font-mono text-xs text-slate-500 ">Query</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Here is an example of an is null query</p>
@@ -220,13 +224,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Query</dt>
<dd><code class="inline-code">query</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Query</dd>
<dd class="font-mono text-xs text-slate-500 ">Query</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Here is an example of an is not null query</p>
@@ -257,13 +261,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Query</dt>
<dd><code class="inline-code">query</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Query</dd>
<dd class="font-mono text-xs text-slate-500 ">Query</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Here is an example of a greater than query</p>
@@ -295,13 +299,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Query</dt>
<dd><code class="inline-code">query</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Query</dd>
<dd class="font-mono text-xs text-slate-500 ">Query</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Here is an example of a greater than or equal query</p>
@@ -333,13 +337,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Query</dt>
<dd><code class="inline-code">query</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Query</dd>
<dd class="font-mono text-xs text-slate-500 ">Query</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Here is an example of a less than query</p>
@@ -371,13 +375,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Query</dt>
<dd><code class="inline-code">query</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Query</dd>
<dd class="font-mono text-xs text-slate-500 ">Query</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Here is an example of a less than or equal query</p>
@@ -410,13 +414,13 @@
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-slate-100 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Query</dt>
<dd><code class="inline-code">query</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Query</dd>
<dd class="font-mono text-xs text-slate-500 ">Query</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Here is an example of a less than or equal query</p>

View File

@@ -1,90 +1,77 @@
<main class="py-16">
<article class="prose ">
<h1 class="font-bold text-xl mb-5">Errors</h1>
<p class="lead">In this guide, we will talk about what happens when something goes wrong while you work with the API. Mistakes happen, and mostly they will be yours, not ours. Let's look at some status codes and error types you might encounter.</p>
<p>You can tell if your request was successful by checking the status code when receiving an API response. If a response comes back unsuccessful, you can use the status code and error message to figure out what has gone wrong and do some rudimentary debugging (before contacting support).</p>
<div class="my-6 flex gap-2.5 rounded-2xl border border-emerald-500/20 bg-emerald-50/50 p-4 leading-6 text-emerald-900 ">
<svg viewBox="0 0 16 16" aria-hidden="true" class="mt-1 h-4 w-4 flex-none fill-emerald-500 stroke-white ">
<circle cx="8" cy="8" r="8" stroke-width="0"></circle>
<path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M6.75 7.75h1.5v3.5"></path>
<circle cx="8" cy="4" r=".5" fill="none"></circle>
</svg>
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Before reaching out to support with an error, please be aware that 99% of all
reported errors are, in fact, user errors. Therefore, please carefully check
your code before contacting OneUptime support.
</p>
</div>
</div>
<hr>
<h2 id="status-codes" class="mb-5 scroll-mt-24 mt-24 font-bold text-lg">
<main class="py-12">
<article class="prose">
<!-- Hero Section -->
<div class="mb-10">
<div class="flex items-center gap-3 mb-4">
<div class="flex items-center justify-center w-10 h-10 rounded-xl bg-indigo-600 shadow-lg shadow-indigo-500/30">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
</div>
<span class="text-xs font-semibold text-indigo-600 uppercase tracking-wider">Guide</span>
</div>
<h1 class="font-bold text-3xl text-slate-900 tracking-tight mb-3">Errors</h1>
<p class="text-lg text-slate-600 leading-relaxed max-w-2xl">In this guide, we will talk about what happens when something goes wrong while you work with the API. Mistakes happen, and mostly they will be yours, not ours. Let's look at some status codes and error types you might encounter.</p>
</div>
<p class="text-slate-600 leading-relaxed">You can tell if your request was successful by checking the status code when receiving an API response. If a response comes back unsuccessful, you can use the status code and error message to figure out what has gone wrong and do some rudimentary debugging (before contacting support).</p>
<div class="my-6 flex gap-3 rounded-xl border border-indigo-500/20 bg-indigo-50/50 p-4">
<div class="flex-shrink-0">
<svg viewBox="0 0 16 16" aria-hidden="true" class="h-5 w-5 fill-indigo-500 stroke-white">
<circle cx="8" cy="8" r="8" stroke-width="0"></circle>
<path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M6.75 7.75h1.5v3.5"></path>
<circle cx="8" cy="4" r=".5" fill="none"></circle>
</svg>
</div>
<p class="text-sm text-indigo-900">Before reaching out to support with an error, please be aware that 99% of all reported errors are, in fact, user errors. Therefore, please carefully check your code before contacting OneUptime support.</p>
</div>
<h2 id="status-codes" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-4 mt-12 pt-8 border-t border-slate-200">
Status codes
</h2>
<p>Here is a list of the different categories of status codes returned by the OneUptime API. Use these to understand if a request was successful.</p>
<div class="my-6">
<ul role="list" class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code">2xx</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 "></dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>A 2xx status code indicates a successful response.</p>
</dd>
</dl>
</li>
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code">4xx</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 "></dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>A 4xx status code indicates a client error — this means it's a <em>you</em>
problem.
</p>
</dd>
</dl>
</li>
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
</h2>
<p class="text-slate-600 leading-relaxed mb-6">Here is a list of the different categories of status codes returned by the OneUptime API. Use these to understand if a request was successful.</p>
<div class="rounded-xl border border-slate-200 bg-white overflow-hidden">
<ul role="list" class="m-0 list-none divide-y divide-slate-100 p-0">
<li class="m-0 px-5 py-4">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code">429</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 "></dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p> Request limit exceeded. Request limits are 100 operations per second per project (this includes all the API keys in the project).
</p>
</dd>
<dd><code class="inline-flex items-center rounded-md bg-emerald-50 px-2 py-1 text-xs font-medium text-emerald-700 ring-1 ring-inset ring-emerald-600/20">2xx</code></dd>
<dd class="w-full flex-none text-sm text-slate-600 mt-1">A 2xx status code indicates a successful response.</dd>
</dl>
</li>
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code">5xx</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 "></dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>A 5xx status code indicates a server error — you won't be seeing a lot of these.</p>
</dd>
</dl>
</li>
</ul>
</div>
<hr>
<h2 id="error-types" class="mb-5 scroll-mt-24 mt-24 font-bold text-lg">Error Messages</h2>
<div class="grid grid-cols-1 items-start gap-x-16 gap-y-10 xl:max-w-none xl:grid-cols-2">
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Whenever a request is unsuccessful, the OneUptime API will return an error response with an error message. You can use this information to understand better what has gone wrong and how to fix it. Most of the error messages are pretty helpful and actionable.</p>
<p>Here is an example of an error message: </p>
</div>
<%- include('../partials/code', {title: "Example error response", requestUrl: "", requestType: "", code: "{ \"message\": \"Name is required\" }" }) -%>
</div>
</article>
</main>
<li class="m-0 px-5 py-4">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dd><code class="inline-flex items-center rounded-md bg-amber-50 px-2 py-1 text-xs font-medium text-amber-700 ring-1 ring-inset ring-amber-600/20">4xx</code></dd>
<dd class="w-full flex-none text-sm text-slate-600 mt-1">A 4xx status code indicates a client error - this means it's a <em>you</em> problem.</dd>
</dl>
</li>
<li class="m-0 px-5 py-4">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dd><code class="inline-flex items-center rounded-md bg-orange-50 px-2 py-1 text-xs font-medium text-orange-700 ring-1 ring-inset ring-orange-600/20">429</code></dd>
<dd class="w-full flex-none text-sm text-slate-600 mt-1">Request limit exceeded. Request limits are 100 operations per second per project (this includes all the API keys in the project).</dd>
</dl>
</li>
<li class="m-0 px-5 py-4">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dd><code class="inline-flex items-center rounded-md bg-red-50 px-2 py-1 text-xs font-medium text-red-700 ring-1 ring-inset ring-red-600/20">5xx</code></dd>
<dd class="w-full flex-none text-sm text-slate-600 mt-1">A 5xx status code indicates a server error - you won't be seeing a lot of these.</dd>
</dl>
</li>
</ul>
</div>
<h2 id="error-types" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-4 mt-12 pt-8 border-t border-slate-200">
Error Messages
</h2>
<div class="grid grid-cols-1 items-start gap-x-16 gap-y-10 xl:max-w-none xl:grid-cols-2">
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p class="text-slate-600 leading-relaxed">Whenever a request is unsuccessful, the OneUptime API will return an error response with an error message. You can use this information to understand better what has gone wrong and how to fix it. Most of the error messages are pretty helpful and actionable.</p>
<p class="text-slate-600 leading-relaxed">Here is an example of an error message:</p>
</div>
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0 xl:sticky xl:top-24">
<%- include('../partials/code', {title: "Example error response", requestUrl: "", requestType: "", code: "{ \"message\": \"Name is required\" }" }) -%>
</div>
</div>
</article>
</main>

View File

@@ -1,198 +1,87 @@
<main class="py-16">
<article class="prose ">
<div class="absolute inset-0 -z-10 mx-0 max-w-none overflow-hidden">
<div
class="absolute left-1/2 top-0 ml-[-38rem] h-[25rem] w-[81.25rem]">
<div
class="absolute inset-0 bg-gradient-to-r from-[#36b49f] to-[#DBFF75] opacity-40 [mask-image:radial-gradient(farthest-side_at_top,white,transparent)]">
<svg aria-hidden="true"
class="absolute inset-x-0 inset-y-[-50%] h-[200%] w-full skew-y-[-18deg] fill-black/40 stroke-black/50 mix-blend-overlay /5">
<defs>
<pattern id=":r6s:" width="72" height="56" patternUnits="userSpaceOnUse" x="-12"
y="4">
<path d="M.5 56V.5H72" fill="none"></path>
</pattern>
</defs>
<rect width="100%" height="100%" stroke-width="0" fill="url(#:r6s:)"></rect>
<svg x="-12" y="4" class="overflow-visible">
<rect stroke-width="0" width="73" height="57" x="288" y="168"></rect>
<rect stroke-width="0" width="73" height="57" x="144" y="56"></rect>
<rect stroke-width="0" width="73" height="57" x="504" y="168"></rect>
<rect stroke-width="0" width="73" height="57" x="720" y="336"></rect>
</svg>
<main class="py-12">
<article class="prose">
<!-- Hero Section -->
<div class="relative mb-12">
<div class="flex items-center gap-3 mb-4">
<div class="flex items-center justify-center w-10 h-10 rounded-xl bg-indigo-600 shadow-lg shadow-indigo-500/30">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
</svg>
</div>
<svg viewBox="0 0 1113 440" aria-hidden="true"
class="absolute top-0 left-1/2 ml-[-19rem] w-[69.5625rem] fill-white blur-[26px] ">
<path d="M.016 439.5s-9.5-300 434-300S882.516 20 882.516 20V0h230.004v439.5H.016Z">
</path>
</svg>
<span class="text-xs font-semibold text-indigo-600 uppercase tracking-wider">REST API</span>
</div>
<h1 class="font-bold text-3xl text-slate-900 tracking-tight mb-4">API Reference</h1>
<p class="text-lg text-slate-600 leading-relaxed max-w-2xl">
Use the OneUptime API to access any resource in your projects, create automated workflows,
and seamlessly integrate with the tools and services your organization uses.
</p>
</div>
<h1 class="font-bold text-xl">API Reference</h1>
<p class="lead">Use the OneUptime API to access any resource in your projects, create automated
workflows, and more
and
seamlessly integrate your project into the other tools and services you use in your
organization.</p>
<div class="my-16 xl:max-w-none">
<h2 id="guides" class="scroll-mt-24 font-bold">
<span class="group text-inherit no-underline hover:text-inherit">
<div
class="absolute mt-1 ml-[calc(-1*var(--width))] hidden w-[var(--width)] opacity-0 transition [--width:calc(2.625rem+0.5px+50%-min(50%,calc(theme(maxWidth.lg)+theme(spacing.8))))] group-hover:opacity-100 group-focus:opacity-100 md:block lg:z-50 2xl:[--width:theme(spacing.10)]">
<div
class="group/anchor block h-5 w-5 rounded-lg bg-zinc-50 ring-1 ring-inset ring-zinc-300 transition hover:ring-zinc-500 ">
<svg viewBox="0 0 20 20" fill="none" stroke-linecap="round" aria-hidden="true"
class="h-5 w-5 stroke-zinc-500 transition ">
<path
d="m6.5 11.5-.964-.964a3.535 3.535 0 1 1 5-5l.964.964m2 2 .964.964a3.536 3.536 0 0 1-5 5L8.5 13.5m0-5 3 3">
</path>
</svg>
</div>
</div>
Guides
</span>
<!-- Guides Section -->
<div class="my-12 xl:max-w-none">
<h2 id="guides" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-6">
Getting Started
</h2>
<div
class="not-prose mt-4 grid grid-cols-1 gap-8 border-t border-zinc-900/5 pt-10 sm:grid-cols-2 xl:grid-cols-4">
<div>
<h3 class="text-sm font-semibold text-zinc-900 ">Authentication</h3>
<p class="mt-1 text-sm text-zinc-600 ">Learn how to authenticate your
API
requests.</p>
<p class="mt-4">
<a class="inline-flex gap-0.5 justify-center overflow-hidden font-medium transition text-emerald-500 hover:text-emerald-600 "
href="/reference/authentication">
Read more
<svg viewBox="0 0 20 20" fill="none" aria-hidden="true"
class="mt-0.5 h-5 w-5 relative top-px -mr-1">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
d="m11.5 6.5 3 3.5m0 0-3 3.5m3-3.5h-9"></path>
</svg>
</a>
</p>
</div>
<div>
<h3 class="text-sm font-semibold text-zinc-900 ">Pagination</h3>
<p class="mt-1 text-sm text-zinc-600 ">Understand how to work with
paginated responses.</p>
<p class="mt-4">
<a class="inline-flex gap-0.5 justify-center overflow-hidden font-medium transition text-emerald-500 hover:text-emerald-600 "
href="/reference/pagination">
Read more
<svg viewBox="0 0 20 20" fill="none" aria-hidden="true"
class="mt-0.5 h-5 w-5 relative top-px -mr-1">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
d="m11.5 6.5 3 3.5m0 0-3 3.5m3-3.5h-9"></path>
</svg>
</a>
</p>
</div>
<div>
<h3 class="text-sm font-semibold text-zinc-900 ">Errors</h3>
<p class="mt-1 text-sm text-zinc-600 ">Read about the different types
of
errors returned by the API.</p>
<p class="mt-4">
<a class="inline-flex gap-0.5 justify-center overflow-hidden font-medium transition text-emerald-500 hover:text-emerald-600 "
href="/reference/errors">
Read more
<svg viewBox="0 0 20 20" fill="none" aria-hidden="true"
class="mt-0.5 h-5 w-5 relative top-px -mr-1">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
d="m11.5 6.5 3 3.5m0 0-3 3.5m3-3.5h-9"></path>
</svg>
</a>
</p>
</div>
<div>
<h3 class="text-sm font-semibold text-zinc-900 ">Permissions</h3>
<p class="mt-1 text-sm text-zinc-600 ">Learn how API Key Permissions
work.</p>
<p class="mt-4">
<a class="inline-flex gap-0.5 justify-center overflow-hidden font-medium transition text-emerald-500 hover:text-emerald-600 "
href="/reference/permissions">
Read more
<svg viewBox="0 0 20 20" fill="none" aria-hidden="true"
class="mt-0.5 h-5 w-5 relative top-px -mr-1">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
d="m11.5 6.5 3 3.5m0 0-3 3.5m3-3.5h-9"></path>
</svg>
</a>
</p>
</div>
<div class="not-prose grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
<a href="/reference/authentication" class="group relative rounded-xl border border-slate-200 bg-white p-5 hover:border-indigo-300 hover:shadow-md hover:shadow-indigo-100/50 transition-all">
<div class="flex items-center justify-center w-10 h-10 rounded-lg bg-indigo-50 text-indigo-600 mb-4 group-hover:bg-indigo-100 transition-colors">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"></path>
</svg>
</div>
<h3 class="text-sm font-semibold text-slate-900 group-hover:text-indigo-600 transition-colors">Authentication</h3>
<p class="mt-1.5 text-sm text-slate-500 leading-relaxed">Learn how to authenticate your API requests.</p>
</a>
<a href="/reference/pagination" class="group relative rounded-xl border border-slate-200 bg-white p-5 hover:border-indigo-300 hover:shadow-md hover:shadow-indigo-100/50 transition-all">
<div class="flex items-center justify-center w-10 h-10 rounded-lg bg-indigo-50 text-indigo-600 mb-4 group-hover:bg-indigo-100 transition-colors">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 10h16M4 14h16M4 18h16"></path>
</svg>
</div>
<h3 class="text-sm font-semibold text-slate-900 group-hover:text-indigo-600 transition-colors">Pagination</h3>
<p class="mt-1.5 text-sm text-slate-500 leading-relaxed">Understand how to work with paginated responses.</p>
</a>
<a href="/reference/errors" class="group relative rounded-xl border border-slate-200 bg-white p-5 hover:border-indigo-300 hover:shadow-md hover:shadow-indigo-100/50 transition-all">
<div class="flex items-center justify-center w-10 h-10 rounded-lg bg-indigo-50 text-indigo-600 mb-4 group-hover:bg-indigo-100 transition-colors">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
</div>
<h3 class="text-sm font-semibold text-slate-900 group-hover:text-indigo-600 transition-colors">Errors</h3>
<p class="mt-1.5 text-sm text-slate-500 leading-relaxed">Read about the different types of errors returned.</p>
</a>
<a href="/reference/permissions" class="group relative rounded-xl border border-slate-200 bg-white p-5 hover:border-indigo-300 hover:shadow-md hover:shadow-indigo-100/50 transition-all">
<div class="flex items-center justify-center w-10 h-10 rounded-lg bg-indigo-50 text-indigo-600 mb-4 group-hover:bg-indigo-100 transition-colors">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path>
</svg>
</div>
<h3 class="text-sm font-semibold text-slate-900 group-hover:text-indigo-600 transition-colors">Permissions</h3>
<p class="mt-1.5 text-sm text-slate-500 leading-relaxed">Learn how API Key Permissions work.</p>
</a>
</div>
</div>
<div class="my-16 xl:max-w-none">
<h2 id="resources" class="scroll-mt-24 font-bold"><span
class="group text-inherit no-underline hover:text-inherit">Featured Resources</span>
</h2>
<div
class="not-prose mt-4 grid grid-cols-1 gap-8 border-t border-zinc-900/5 pt-10 sm:grid-cols-2 xl:grid-cols-4">
<% for(var i=0; i<pageData.featuredResources.length; i++) {%>
<div
class="cursor-pointer group relative flex rounded-2xl bg-zinc-50 transition-shadow hover:shadow-md hover:shadow-zinc-900/5 ">
<div class="pointer-events-none">
<div
class="absolute inset-0 rounded-2xl transition duration-300 [mask-image:linear-gradient(white,transparent)] group-hover:opacity-50">
<svg aria-hidden="true"
class="absolute inset-x-0 inset-y-[-30%] h-[160%] w-full skew-y-[-18deg] fill-black/[0.02] stroke-black/5 /2.5">
<defs>
<pattern id=":r6t:" width="72" height="56" patternUnits="userSpaceOnUse"
x="50%" y="16">
<path d="M.5 56V.5H72" fill="none"></path>
</pattern>
</defs>
<rect width="100%" height="100%" stroke-width="0" fill="url(#:r6t:)"></rect>
<svg x="50%" y="16" class="overflow-visible">
<rect stroke-width="0" width="73" height="57" x="0" y="56"></rect>
<rect stroke-width="0" width="73" height="57" x="72" y="168"></rect>
</svg>
</svg>
</div>
<div
class="absolute inset-0 rounded-2xl bg-gradient-to-r from-[#D7EDEA] to-[#F4FBDF] opacity-0 transition duration-300 group-hover:opacity-100"
data-projection-id="35"
style="-webkit-mask-image: radial-gradient(180px at 0px 0px, white, transparent);">
</div>
<div
class="absolute inset-0 rounded-2xl opacity-0 mix-blend-overlay transition duration-300 group-hover:opacity-100"
data-projection-id="36"
style="-webkit-mask-image: radial-gradient(180px at 0px 0px, white, transparent);">
<svg aria-hidden="true"
class="absolute inset-x-0 inset-y-[-30%] h-[160%] w-full skew-y-[-18deg] fill-black/50 stroke-black/70 /10">
<defs>
<pattern id=":r6u:" width="72" height="56" patternUnits="userSpaceOnUse"
x="50%" y="16">
<path d="M.5 56V.5H72" fill="none"></path>
</pattern>
</defs>
<rect width="100%" height="100%" stroke-width="0" fill="url(#:r6u:)"></rect>
<svg x="50%" y="16" class="overflow-visible">
<rect stroke-width="0" width="73" height="57" x="0" y="56"></rect>
<rect stroke-width="0" width="73" height="57" x="72" y="168"></rect>
</svg>
</svg>
</div>
</div>
<div
class="absolute inset-0 rounded-2xl ring-1 ring-inset ring-zinc-900/7.5 group-hover:ring-zinc-900/10 ">
</div>
<div class="relative rounded-2xl px-4 pt-16 pb-4">
<h3 class="mt-4 text-sm font-semibold leading-7 text-zinc-900 "><a
href="/reference/<%= pageData.featuredResources[i].path -%>"><span
class="absolute inset-0 rounded-2xl"></span> <%= pageData.featuredResources[i].name -%></a>
</h3>
<p class="mt-1 text-sm text-zinc-600 "><%= pageData.featuredResources[i].description -%></p>
</div>
</div>
<% } %>
<!-- Featured Resources Section -->
<div class="my-12 xl:max-w-none">
<h2 id="resources" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-6">
Featured Resources
</h2>
<div class="not-prose grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
<% for(var i=0; i<pageData.featuredResources.length; i++) {%>
<a href="/reference/<%= pageData.featuredResources[i].path -%>"
class="group relative rounded-xl border border-slate-200 bg-white p-5 hover:border-indigo-300 hover:shadow-md hover:shadow-indigo-100/50 transition-all">
<div class="flex items-center justify-center w-10 h-10 rounded-lg bg-slate-100 text-slate-600 mb-4 group-hover:bg-indigo-100 group-hover:text-indigo-600 transition-colors">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"></path>
</svg>
</div>
<h3 class="text-sm font-semibold text-slate-900 group-hover:text-indigo-600 transition-colors"><%= pageData.featuredResources[i].name -%></h3>
<p class="mt-1.5 text-sm text-slate-500 leading-relaxed"><%= pageData.featuredResources[i].description -%></p>
</a>
<% } %>
</div>
</div>
</article>
</main>
</main>

File diff suppressed because it is too large Load Diff

View File

@@ -1,113 +1,83 @@
<main class="py-16">
<article class="prose ">
<h1>Pagination</h1>
<p class="lead">In this guide, we will look at how to work with paginated responses when querying the OneUptime
API. By default, all responses limit results to ten. </p>
<p>When an API response returns a list of objects, no matter the amount, pagination is supported. In paginated
responses, objects are nested in a <code class="inline-code">data</code> attribute. The API response also has
<code class="inline-code">count</code> attribute that indicates total count in the list with that query. You
can use the <code class="inline-code">limit</code> and <code class="inline-code">skip</code> query parameters
to query pages.</p>
<h2 id="example-using-cursors" class="scroll-mt-24">
<main class="py-12">
<article class="prose">
<!-- Hero Section -->
<div class="mb-10">
<div class="flex items-center gap-3 mb-4">
<div class="flex items-center justify-center w-10 h-10 rounded-xl bg-indigo-600 shadow-lg shadow-indigo-500/30">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 10h16M4 14h16M4 18h16"></path>
</svg>
</div>
<span class="text-xs font-semibold text-indigo-600 uppercase tracking-wider">Guide</span>
</div>
<h1 class="font-bold text-3xl text-slate-900 tracking-tight mb-3">Pagination</h1>
<p class="text-lg text-slate-600 leading-relaxed max-w-2xl">In this guide, we will look at how to work with paginated responses when querying the OneUptime API. By default, all responses limit results to ten.</p>
</div>
<p class="text-slate-600 leading-relaxed">When an API response returns a list of objects, no matter the amount, pagination is supported. In paginated responses, objects are nested in a <code class="inline-code">data</code> attribute. The API response also has <code class="inline-code">count</code> attribute that indicates total count in the list with that query. You can use the <code class="inline-code">limit</code> and <code class="inline-code">skip</code> query parameters to query pages.</p>
<h2 id="example-using-cursors" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-6 mt-12">
Pagination Example
</h2>
<div class="grid grid-cols-1 items-start gap-x-16 gap-y-10 xl:max-w-none xl:grid-cols-2">
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>In this example, we request the list of monitors. As a result, we get a list of three monitors and can
tell by the <code class="inline-code">count</code> attribute that we have reached the end of the
result set</p>
<h2 id="example-using-cursors" class="scroll-mt-24">
Query Parameters
</h2>
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<p class="text-slate-600 leading-relaxed">In this example, we request the list of monitors. As a result, we get a list of three monitors and can tell by the <code class="inline-code">count</code> attribute that we have reached the end of the result set</p>
<h3 class="text-base font-semibold text-slate-800 mt-8 mb-3">Query Parameters</h3>
<div class="rounded-lg border border-slate-200 bg-white overflow-hidden">
<ul role="list" class="m-0 list-none divide-y divide-slate-100 p-0">
<li class="m-0 px-4 py-3">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code">limit</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Number</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Number of items you need to fetch. More items will lead to slower responses. Max limit is
100.</p>
</dd>
<dd class="font-mono text-xs text-slate-500">Number</dd>
<dd class="w-full flex-none text-sm text-slate-600">Number of items you need to fetch. More items will lead to slower responses. Max limit is 100.</dd>
</dl>
</li>
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<li class="m-0 px-4 py-3">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code">skip</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Number</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Number of items to skip. This can be useful when you are paginating items.</p>
</dd>
<dd class="font-mono text-xs text-slate-500">Number</dd>
<dd class="w-full flex-none text-sm text-slate-600">Number of items to skip. This can be useful when you are paginating items.</dd>
</dl>
</li>
</ul>
</div>
<h3 class="text-base font-semibold text-slate-800 mt-8 mb-3">Response Body</h3>
<div class="rounded-lg border border-slate-200 bg-white overflow-hidden">
<ul role="list" class="m-0 list-none divide-y divide-slate-100 p-0">
<li class="m-0 px-4 py-3">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dd><code class="inline-code">data</code></dd>
<dd class="font-mono text-xs text-slate-500">JSON Array</dd>
<dd class="w-full flex-none text-sm text-slate-600">List of items fetched.</dd>
</dl>
</li>
<li class="m-0 px-4 py-3">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dd><code class="inline-code">count</code></dd>
<dd class="font-mono text-xs text-slate-500">Number</dd>
<dd class="w-full flex-none text-sm text-slate-600">Total number of items in the database</dd>
</dl>
</li>
<li class="m-0 px-4 py-3">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dd><code class="inline-code">limit</code></dd>
<dd class="font-mono text-xs text-slate-500">Number</dd>
<dd class="w-full flex-none text-sm text-slate-600">Number of items you need to fetch. More items will lead to slower responses. Max limit is 100.</dd>
</dl>
</li>
<li class="m-0 px-4 py-3">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dd><code class="inline-code">skip</code></dd>
<dd class="font-mono text-xs text-slate-500">Number</dd>
<dd class="w-full flex-none text-sm text-slate-600">Number of items to skip. This can be useful when you are paginating items.</dd>
</dl>
</li>
</ul>
</div>
<h2 id="example-using-cursors" class="scroll-mt-24">
Response Body
</h2>
<div class="my-6">
<ul role="list"
class="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 ">
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code">data</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">JSON Array</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>List of items fetched.</p>
</dd>
</dl>
</li>
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code">count</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Number</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Total number of items in the database</p>
</dd>
</dl>
</li>
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code">limit</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Number</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Number of items you need to fetch. More items will lead to slower responses. Max limit is
100.</p>
</dd>
</dl>
</li>
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code">skip</code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 ">Number</dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p>Number of items to skip. This can be useful when you are paginating items.</p>
</dd>
</dl>
</li>
</ul>
</div>
</div>
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0 xl:sticky xl:top-24">
<%- include('../partials/code', {title: "Example Pagination Request", requestUrl: "/api/monitors/get-list?skip=0&limit=3", requestType: "POST", code: pageData.requestCode }) -%>
<%- include('../partials/code', {title: "Example Pagination Response" , requestUrl: "", requestType: "", code: pageData.responseCode }) -%>
</div>

View File

@@ -1,38 +1,36 @@
<main class="py-16">
<article class="prose ">
<h1>Permissions</h1>
<p class="lead"> Your API Token needs permissions to create, update, read or delete any resource. If you do not have permissions to make a request a <code class="inline-code">4xx</code> status will be sent as response. You can manage permissions for your API Key in Project Settings > API Keys. </p>
<h2 id="consuming-webhooks" >
Permissions List
</h2>
<p>Here is a list of all the permissions:</p>
<div class="grid grid-cols-1 items-start gap-x-16 gap-y-10 xl:max-w-none xl:grid-cols-2">
<div class="[&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<div class="my-6">
<ul role="list" class="m-0 w-full">
<% for(var i=0; i<pageData.permissions.length; i++) {%>
<li class="m-0 px-0 py-4 first:pt-0 last:pb-0">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dt class="sr-only">Name</dt>
<dd><code class="inline-code"> <%= pageData.permissions[i].permission -%></code></dd>
<dt class="sr-only">Type</dt>
<dd class="font-mono text-xs text-zinc-400 "><%= pageData.permissions[i].title -%></dd>
<dt class="sr-only">Description</dt>
<dd class="w-full flex-none [&amp;>:first-child]:mt-0 [&amp;>:last-child]:mb-0">
<p><%= pageData.permissions[i].description -%></p>
</dd>
</dl>
</li>
<% } %>
<main class="py-12">
<article class="prose">
<!-- Hero Section -->
<div class="mb-10">
<div class="flex items-center gap-3 mb-4">
<div class="flex items-center justify-center w-10 h-10 rounded-xl bg-indigo-600 shadow-lg shadow-indigo-500/30">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path>
</svg>
</div>
<span class="text-xs font-semibold text-indigo-600 uppercase tracking-wider">Guide</span>
</div>
<h1 class="font-bold text-3xl text-slate-900 tracking-tight mb-3">Permissions</h1>
<p class="text-lg text-slate-600 leading-relaxed max-w-2xl">Your API Token needs permissions to create, update, read or delete any resource. If you do not have permissions to make a request a <code class="inline-code">4xx</code> status will be sent as response. You can manage permissions for your API Key in Project Settings > API Keys.</p>
</div>
</ul>
</div>
</div>
</div>
</article>
</main>
<h2 id="consuming-webhooks" class="scroll-mt-24 text-xl font-semibold text-slate-900 mb-6 mt-12">
Permissions List
</h2>
<p class="text-slate-600 leading-relaxed mb-6">Here is a list of all the permissions:</p>
<div class="rounded-xl border border-slate-200 bg-white overflow-hidden">
<ul role="list" class="m-0 divide-y divide-slate-100 p-0">
<% for(var i=0; i<pageData.permissions.length; i++) {%>
<li class="m-0 px-5 py-4 hover:bg-slate-50/50 transition-colors">
<dl class="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
<dd><code class="inline-code"><%= pageData.permissions[i].permission -%></code></dd>
<dd class="font-mono text-xs text-slate-500"><%= pageData.permissions[i].title -%></dd>
<dd class="w-full flex-none text-sm text-slate-600 mt-1"><%= pageData.permissions[i].description -%></dd>
</dl>
</li>
<% } %>
</ul>
</div>
</article>
</main>

View File

@@ -1,16 +1,14 @@
<html lang="en" class="js-focus-visible ctshmsrlsm idc0_345">
<html lang="en" class="h-full antialiased scroll-smooth" style="color-scheme: light;">
<%- include('../partials/head', {
enableGoogleTagManager: typeof enableGoogleTagManager !== 'undefined' ? enableGoogleTagManager : false,
}) -%>
<body onload="applyStyles()" class="bg-white antialiased " data-new-gr-c-s-check-loaded="14.1095.0"
data-gr-ext-installed="">
<div id="__next">
<body onload="applyStyles()" class="flex min-h-full bg-white">
<div id="__next" class="w-full">
<div class="lg:ml-72 xl:ml-80">
<%- include('../partials/nav') -%>
<div class="flex justify-center">
<div class="relative px-4 pt-14 sm:px-6 lg:px-8 max-w-5xl ">
<div>
<div class="relative px-4 pt-14 sm:px-6 lg:px-8 max-w-5xl w-full">
<div class="flex justify-center">
<%- include('../main/'+page) -%>
</div>
@@ -18,7 +16,6 @@
<%- include('../partials/footer') -%>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,276 @@
<%
const uniqueId = 'code-tabs-' + Math.random().toString(36).substr(2, 9);
const tabs = [
{ id: 'preview', name: 'Request', icon: 'preview', isPreview: true },
{ id: 'curl', name: 'cURL', icon: 'terminal' },
{ id: 'javascript', name: 'JavaScript', icon: 'js' },
{ id: 'typescript', name: 'TypeScript', icon: 'ts' },
{ id: 'python', name: 'Python', icon: 'python' },
{ id: 'go', name: 'Go', icon: 'go' },
{ id: 'java', name: 'Java', icon: 'java' },
{ id: 'csharp', name: 'C#', icon: 'csharp' },
{ id: 'php', name: 'PHP', icon: 'php' },
{ id: 'ruby', name: 'Ruby', icon: 'ruby' },
{ id: 'rust', name: 'Rust', icon: 'rust' },
{ id: 'powershell', name: 'PowerShell', icon: 'powershell' }
];
%>
<div class="code-tabs-container my-6 w-full max-w-full overflow-hidden" id="<%= uniqueId %>">
<!-- Header with title and endpoint -->
<div class="rounded-t-xl bg-slate-900 border border-slate-700/50 border-b-0">
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 px-4 py-3 border-b border-slate-700/50">
<h4 class="text-sm font-semibold text-slate-200 tracking-wide"><%= title %></h4>
<div class="flex items-center gap-2">
<% if(requestType === "GET"){ %>
<span class="inline-flex items-center rounded-md bg-emerald-500/15 px-2.5 py-1 text-xs font-bold text-emerald-400 ring-1 ring-inset ring-emerald-500/30 uppercase tracking-wide">GET</span>
<% } else if(requestType === "POST"){ %>
<span class="inline-flex items-center rounded-md bg-indigo-500/15 px-2.5 py-1 text-xs font-bold text-indigo-400 ring-1 ring-inset ring-indigo-500/30 uppercase tracking-wide">POST</span>
<% } else if(requestType === "DELETE"){ %>
<span class="inline-flex items-center rounded-md bg-red-500/15 px-2.5 py-1 text-xs font-bold text-red-400 ring-1 ring-inset ring-red-500/30 uppercase tracking-wide">DELETE</span>
<% } else if(requestType === "PUT"){ %>
<span class="inline-flex items-center rounded-md bg-amber-500/15 px-2.5 py-1 text-xs font-bold text-amber-400 ring-1 ring-inset ring-amber-500/30 uppercase tracking-wide">PUT</span>
<% } %>
</div>
</div>
<% if(requestUrl){ %>
<div class="px-4 py-2.5 bg-slate-800/40 border-b border-slate-700/30">
<code class="font-mono text-sm text-slate-300 break-all"><%= requestUrl %></code>
</div>
<% } %>
<!-- Language Tabs -->
<div class="relative">
<div class="flex overflow-x-auto scrollbar-hide border-b border-slate-700/50" role="tablist">
<% tabs.forEach((tab, index) => { %>
<button
type="button"
role="tab"
aria-selected="<%= index === 0 ? 'true' : 'false' %>"
aria-controls="<%= uniqueId %>-panel-<%= tab.id %>"
id="<%= uniqueId %>-tab-<%= tab.id %>"
data-tab-id="<%= tab.id %>"
onclick="switchCodeTab('<%= uniqueId %>', '<%= tab.id %>')"
class="code-tab relative flex items-center gap-2 px-4 py-3 text-sm font-medium whitespace-nowrap transition-all duration-200 <%= index === 0 ? 'text-indigo-400 bg-slate-800/50' : 'text-slate-400 hover:text-slate-300 hover:bg-slate-800/30' %>"
>
<span class="lang-icon w-4 h-4 flex items-center justify-center">
<% if(tab.icon === 'preview'){ %>
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path></svg>
<% } else if(tab.icon === 'terminal'){ %>
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"></path></svg>
<% } else if(tab.icon === 'js'){ %>
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="currentColor"><path d="M0 0h24v24H0V0zm22.034 18.276c-.175-1.095-.888-2.015-3.003-2.873-.736-.345-1.554-.585-1.797-1.14-.091-.33-.105-.51-.046-.705.15-.646.915-.84 1.515-.66.39.12.75.42.976.9 1.034-.676 1.034-.676 1.755-1.125-.27-.42-.405-.585-.585-.765-.63-.63-1.47-.93-2.835-.885l-.705.09c-.676.165-1.32.525-1.71 1.005-1.14 1.29-.81 3.54.57 4.47 1.365 1.035 3.369 1.26 3.629 2.235.225 1.17-.87 1.545-1.966 1.41-.811-.18-1.26-.63-1.755-1.455l-1.83 1.05c.21.48.45.689.81 1.109 1.74 1.756 6.09 1.665 6.871-1.004.029-.09.24-.705.074-1.65l.046.067zm-8.983-7.245h-2.248c0 1.938-.009 3.864-.009 5.805 0 1.232.063 2.363-.138 2.711-.33.689-1.18.601-1.566.48-.396-.196-.597-.466-.83-.855-.063-.105-.11-.196-.127-.196l-1.825 1.125c.305.63.75 1.172 1.324 1.517.855.51 2.004.675 3.207.405.783-.226 1.458-.691 1.811-1.411.51-.93.402-2.07.397-3.346.012-2.054 0-4.109 0-6.179l.004-.056z"/></svg>
<% } else if(tab.icon === 'ts'){ %>
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="currentColor"><path d="M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75c.612 0 1.154.037 1.627.111a6.38 6.38 0 0 1 1.306.34v2.458a3.95 3.95 0 0 0-.643-.361 5.093 5.093 0 0 0-.717-.26 5.453 5.453 0 0 0-1.426-.2c-.3 0-.573.028-.819.086a2.1 2.1 0 0 0-.623.242c-.17.104-.3.229-.393.374a.888.888 0 0 0-.14.49c0 .196.053.373.156.529.104.156.252.304.443.444s.423.276.696.41c.273.135.582.274.926.416.47.197.892.407 1.266.628.374.222.695.473.963.753.268.279.472.598.614.957.142.359.214.776.214 1.253 0 .657-.125 1.21-.373 1.656a3.033 3.033 0 0 1-1.012 1.085 4.38 4.38 0 0 1-1.487.596c-.566.12-1.163.18-1.79.18a9.916 9.916 0 0 1-1.84-.164 5.544 5.544 0 0 1-1.512-.493v-2.63a5.033 5.033 0 0 0 3.237 1.2c.333 0 .624-.03.872-.09.249-.06.456-.144.623-.25.166-.108.29-.234.373-.38a1.023 1.023 0 0 0-.074-1.089 2.12 2.12 0 0 0-.537-.5 5.597 5.597 0 0 0-.807-.444 27.72 27.72 0 0 0-1.007-.436c-.918-.383-1.602-.852-2.053-1.405-.45-.553-.676-1.222-.676-2.005 0-.614.123-1.141.369-1.582.246-.441.58-.804 1.004-1.089a4.494 4.494 0 0 1 1.47-.629 7.536 7.536 0 0 1 1.77-.201zm-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z"/></svg>
<% } else if(tab.icon === 'python'){ %>
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="currentColor"><path d="M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.17l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05-.05-1.23.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02 1.27.05zm-6.3 1.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09zm13.09 3.95l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14 1.04.05 1.23-.06 1.23-.16 1.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01 2.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01zm-6.47 14.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08z"/></svg>
<% } else if(tab.icon === 'go'){ %>
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="currentColor"><path d="M1.811 10.231c-.047 0-.058-.023-.035-.059l.246-.315c.023-.035.081-.058.128-.058h4.172c.046 0 .058.035.035.07l-.199.303c-.023.036-.082.07-.117.07zM.047 11.306c-.047 0-.059-.023-.035-.058l.245-.316c.023-.035.082-.058.129-.058h5.328c.047 0 .07.035.058.07l-.093.28c-.012.047-.058.07-.105.07zm2.828 1.075c-.047 0-.059-.035-.035-.07l.163-.292c.023-.035.07-.07.117-.07h2.337c.047 0 .07.035.07.082l-.023.28c0 .047-.047.082-.082.082zm12.129-2.36c-.736.187-1.239.327-1.963.514c-.176.046-.187.058-.34-.117c-.174-.199-.303-.327-.548-.444c-.737-.362-1.45-.257-2.115.175c-.795.514-1.204 1.274-1.192 2.22c.011.935.654 1.706 1.577 1.835c.795.105 1.46-.175 1.987-.77c.105-.13.198-.27.315-.434H10.47c-.245 0-.304-.152-.222-.35c.152-.362.432-.97.596-1.274a.32.32 0 0 1 .292-.187h4.253c-.023.316-.023.631-.07.947a5 5 0 0 1-.958 2.29c-.841 1.11-1.94 1.8-3.33 1.986c-1.145.152-2.209-.07-3.143-.77c-.865-.655-1.356-1.52-1.484-2.595c-.152-1.274.222-2.419.993-3.424c.83-1.086 1.928-1.776 3.272-2.02c1.098-.2 2.15-.07 3.096.571c.62.41 1.063.97 1.356 1.648c.07.105.023.164-.117.2m3.868 6.461c-1.064-.024-2.034-.328-2.852-1.029a3.67 3.67 0 0 1-1.262-2.255c-.21-1.32.152-2.489.947-3.529c.853-1.122 1.881-1.706 3.272-1.95c1.192-.21 2.314-.095 3.33.595c.923.63 1.496 1.484 1.648 2.605c.198 1.578-.257 2.863-1.344 3.962c-.771.783-1.718 1.273-2.805 1.495c-.315.06-.63.07-.934.106m2.78-4.72c-.011-.153-.011-.27-.034-.387c-.21-1.157-1.274-1.81-2.384-1.554c-1.087.245-1.788.935-2.045 2.033c-.21.912.234 1.835 1.075 2.21c.643.28 1.285.244 1.905-.07c.923-.48 1.425-1.228 1.484-2.233z"/></svg>
<% } else if(tab.icon === 'java'){ %>
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="currentColor"><path d="M8.851 18.56s-.917.534.653.714c1.902.218 2.874.187 4.969-.211 0 0 .552.346 1.321.646-4.699 2.013-10.633-.118-6.943-1.149M8.276 15.933s-1.028.761.542.924c2.032.209 3.636.227 6.413-.308 0 0 .384.389.987.602-5.679 1.661-12.007.13-7.942-1.218M13.116 11.475c1.158 1.333-.304 2.533-.304 2.533s2.939-1.518 1.589-3.418c-1.261-1.772-2.228-2.652 3.007-5.688 0-.001-8.216 2.051-4.292 6.573M19.33 20.504s.679.559-.747.991c-2.712.822-11.288 1.069-13.669.033-.856-.373.75-.89 1.254-.998.527-.114.828-.093.828-.093-.953-.671-6.156 1.317-2.643 1.887 9.58 1.553 17.462-.7 14.977-1.82M9.292 13.21s-4.362 1.036-1.544 1.412c1.189.159 3.561.123 5.77-.062 1.806-.152 3.618-.477 3.618-.477s-.637.272-1.098.587c-4.429 1.165-12.986.623-10.522-.568 2.082-1.006 3.776-.892 3.776-.892M17.116 17.584c4.503-2.34 2.421-4.589.968-4.285-.355.074-.515.138-.515.138s.132-.207.385-.297c2.875-1.011 5.086 2.981-.928 4.562 0-.001.07-.062.09-.118M14.401 0s2.494 2.494-2.365 6.33c-3.896 3.077-.888 4.832-.001 6.836-2.274-2.053-3.943-3.858-2.824-5.539 1.644-2.469 6.197-3.665 5.19-7.627M9.734 23.924c4.322.277 10.959-.153 11.116-2.198 0 0-.302.775-3.572 1.391-3.688.694-8.239.613-10.937.168 0-.001.553.457 3.393.639"/></svg>
<% } else if(tab.icon === 'csharp'){ %>
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="currentColor"><path d="M11.5 15.97l.41 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96C2.56 15.77 2 14.16 2 12.21c.05-2.31.72-4.08 2-5.32C5.32 5.64 6.96 5 8.94 5c.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.58 2.49-1.06-.34c-.4-.1-.86-.15-1.39-.15-1.16-.01-2.12.36-2.87 1.1-.76.73-1.15 1.85-1.18 3.34 0 1.36.37 2.42 1.08 3.2.71.77 1.71 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.1-.32zm5.5-5.48h3.5v1.33H17v3.45l2 .1v1.27l-3.5-.1v-4.72H14v-1.33h3zm-1 0v1.33h-2v-1.33h2zm0 2.66v1.34h-2v-1.34h2zm0 2.67V17h-2v-1.18h2z"/></svg>
<% } else if(tab.icon === 'php'){ %>
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="currentColor"><path d="M7.01 10.207h-.944l-.515 2.648h.838c.556 0 .97-.105 1.242-.314.272-.21.455-.559.55-1.049.092-.47.05-.802-.124-.995-.175-.193-.523-.29-1.047-.29zM12 5.688C5.373 5.688 0 8.514 0 12s5.373 6.313 12 6.313S24 15.486 24 12c0-3.486-5.373-6.312-12-6.312zm-3.26 7.451c-.261.25-.575.438-.917.551-.336.108-.765.164-1.285.164H5.357l-.327 1.681H3.652l1.23-6.326h2.65c.797 0 1.378.209 1.744.628.366.418.476 1.002.33 1.752a2.836 2.836 0 01-.305.847c-.143.255-.33.49-.561.703zm4.024.715l.543-2.799c.063-.318.039-.536-.068-.651-.107-.116-.336-.174-.687-.174H11.46l-.704 3.625H9.388l1.23-6.327h1.367l-.327 1.682h1.218c.767 0 1.295.134 1.586.401s.378.7.263 1.299l-.572 2.944h-1.389zm7.597-2.465a2.782 2.782 0 01-.305.847c-.143.255-.33.49-.561.703a2.44 2.44 0 01-.917.551c-.336.108-.765.164-1.286.164h-1.18l-.327 1.682h-1.378l1.23-6.326h2.649c.797 0 1.378.209 1.744.628.366.417.477 1.001.331 1.751zm-2.595-1.382h-.943l-.516 2.648h.838c.557 0 .971-.105 1.242-.314.272-.21.455-.559.551-1.049.092-.47.049-.802-.125-.995s-.524-.29-1.047-.29z"/></svg>
<% } else if(tab.icon === 'ruby'){ %>
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="currentColor"><path d="M20.156.083c3.033.525 3.893 2.598 3.829 4.77L24 4.822 22.635 22.71 4.89 23.926h.016C3.433 23.864.15 23.729 0 19.139l1.645-3 2.819 6.586.503 1.172 2.805-9.144-.03.007.016-.03 9.255 2.956-1.396-5.431-.99-3.9 8.82-.569-.615-.51L16.5 2.114 20.159.073l-.003.01zM0 19.089v.026-.029.003zM5.13 5.073c3.561-3.533 8.157-5.621 9.922-3.84 1.762 1.777-.105 6.105-3.673 9.636-3.563 3.532-8.103 5.734-9.864 3.957-1.766-1.777.045-6.217 3.612-9.75l.003-.003z"/></svg>
<% } else if(tab.icon === 'rust'){ %>
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="currentColor"><path d="M23.687 11.709l-.995-.616a13.559 13.559 0 00-.028-.29l.855-.797a.344.344 0 00-.114-.571l-1.093-.409a8.392 8.392 0 00-.086-.282l.682-.947a.344.344 0 00-.199-.54l-1.135-.228a8.344 8.344 0 00-.14-.261l.48-1.066a.344.344 0 00-.276-.477l-1.149-.044a7.373 7.373 0 00-.192-.227l.258-1.151a.344.344 0 00-.348-.389l-1.136.14a6.4 6.4 0 00-.238-.18l.024-1.186a.344.344 0 00-.41-.281l-1.097.32a5.7 5.7 0 00-.275-.12l-.212-1.178a.344.344 0 00-.46-.157l-1.028.494a4.87 4.87 0 00-.3-.054l-.441-1.129a.344.344 0 00-.494-.023l-.935.657a3.787 3.787 0 00-.315.015l-.66-1.038a.344.344 0 00-.512.114l-.817.802a3.453 3.453 0 00-.318.084l-.86-.911a.344.344 0 00-.512.234l-.68.932a3.29 3.29 0 00-.304.152l-1.033-.744a.344.344 0 00-.493.342l-.524 1.04a3.29 3.29 0 00-.275.216l-1.168-.54a.344.344 0 00-.457.43l-.353 1.124a3.453 3.453 0 00-.233.275l-1.262-.3a.344.344 0 00-.404.498l-.168 1.178a3.787 3.787 0 00-.178.322l-1.315-.032a.344.344 0 00-.333.547l.025 1.2a4.87 4.87 0 00-.113.354l-1.325.241a.344.344 0 00-.248.576l.227 1.19a5.7 5.7 0 00-.04.373l-1.29.513a.344.344 0 00-.151.583l.422 1.147a6.4 6.4 0 00.038.38l-1.212.77a.344.344 0 00-.046.57l.605 1.072a7.373 7.373 0 00.116.371l-1.094 1.008a.344.344 0 00.06.538l.771.967a8.344 8.344 0 00.19.348l-.94 1.218a.344.344 0 00.163.486l.915.836a8.392 8.392 0 00.259.31l-.756 1.393a.344.344 0 00.258.415l1.03.68c.1.09.202.178.307.264l-.544 1.53a.344.344 0 00.342.327l1.115.504a13.559 13.559 0 00.173.12l-.312 1.63a.344.344 0 00.413.223l1.17.307a14.195 14.195 0 00.22.085l-.067 1.688a.344.344 0 00.469.106l1.193.094a14.718 14.718 0 00.253.044l.184 1.7a.344.344 0 00.508-.016l1.184-.128a14.94 14.94 0 00.273-.003l.432 1.667a.344.344 0 00.528-.136l1.142-.347a14.862 14.862 0 00.282-.053l.67 1.588a.344.344 0 00.53-.246l1.072-.56a14.49 14.49 0 00.278-.105l.893 1.465a.344.344 0 00.512-.343l.972-.76a13.844 13.844 0 00.262-.156l1.095 1.3a.344.344 0 00.475-.425l.85-.943c.08-.063.157-.127.234-.192l1.27 1.094a.344.344 0 00.422-.49l.706-1.105a12.656 12.656 0 00.197-.225l1.412.853a.344.344 0 00.354-.538l.544-1.24c.058-.084.115-.17.17-.255l1.521.583a.344.344 0 00.27-.567l.367-1.346c.047-.092.092-.185.136-.279l1.59.293a.344.344 0 00.176-.575l.18-1.418a9.903 9.903 0 00.094-.3l1.62-.008a.344.344 0 00.076-.56l-.013-1.455a9.245 9.245 0 00.045-.315l1.607-.307a.344.344 0 00-.028-.522l-.206-1.457c.005-.109.007-.218.007-.328l1.553-.595a.344.344 0 00-.13-.461zM12 16.874a4.874 4.874 0 110-9.748 4.874 4.874 0 010 9.748z"/></svg>
<% } else if(tab.icon === 'powershell'){ %>
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="currentColor"><path d="M23.181 2.974c.568 0 .923.463.792 1.035l-3.659 15.982c-.13.572-.697 1.035-1.265 1.035H.819c-.568 0-.923-.463-.792-1.035L3.686 4.009c.13-.572.697-1.035 1.265-1.035h18.23zm-8.375 12.15c0-.292-.123-.559-.322-.744l.004.004-5.444-4.678c-.162-.144-.373-.232-.605-.232-.506 0-.916.41-.916.916 0 .272.119.516.307.684l-.002-.002 4.453 3.832-4.453 3.832c-.188.166-.307.41-.307.684 0 .506.41.916.916.916.232 0 .443-.088.605-.232l5.444-4.678c.2-.186.323-.453.323-.746v-.556h-.003zm.62 2.406c0-.355.288-.644.644-.644h4.023c.355 0 .644.288.644.644 0 .355-.288.644-.644.644h-4.023a.644.644 0 01-.644-.644z"/></svg>
<% } %>
</span>
<span><%= tab.name %></span>
</button>
<% }); %>
</div>
</div>
</div>
<!-- Code Panels -->
<div class="rounded-b-xl bg-slate-900 border border-slate-700/50 border-t-0 overflow-hidden min-w-0">
<% tabs.forEach((tab, index) => { %>
<div
role="tabpanel"
id="<%= uniqueId %>-panel-<%= tab.id %>"
aria-labelledby="<%= uniqueId %>-tab-<%= tab.id %>"
class="code-panel relative min-w-0 w-full <%= index === 0 ? '' : 'hidden' %>"
data-panel-id="<%= tab.id %>"
>
<% if(tab.isPreview) { %>
<!-- Request Preview Panel -->
<button
class="copy-btn-tabs"
onclick="copyPreviewFromPanel(this)"
aria-label="Copy request"
>
<svg class="copy-icon w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path>
</svg>
<svg class="check-icon w-4 h-4 hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="copy-text">Copy</span>
</button>
<div class="code-content p-4 w-full max-w-full overflow-hidden" style="min-height: 200px;">
<!-- Headers Section -->
<div class="mb-4">
<div class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">Headers</div>
<div class="bg-slate-800/50 rounded-lg p-3 border border-slate-700/50 overflow-hidden">
<pre class="text-sm text-slate-300 font-mono whitespace-pre-wrap m-0 preview-headers overflow-x-auto"><%= codeExamples.requestPreview.headers %></pre>
</div>
</div>
<% if(codeExamples.requestPreview.body) { %>
<!-- Body Section -->
<div>
<div class="text-xs font-semibold text-slate-400 uppercase tracking-wider mb-2">Body</div>
<div class="bg-slate-800/50 rounded-lg p-3 border border-slate-700/50 overflow-hidden">
<pre class="text-sm leading-relaxed m-0 overflow-x-auto"><code class="language-json preview-body"><%= codeExamples.requestPreview.body %></code></pre>
</div>
</div>
<% } %>
</div>
<% } else { %>
<!-- Code Panel -->
<button
class="copy-btn-tabs"
onclick="copyCodeFromPanel(this)"
aria-label="Copy code"
>
<svg class="copy-icon w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path>
</svg>
<svg class="check-icon w-4 h-4 hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="copy-text">Copy</span>
</button>
<div class="code-content w-full max-w-full overflow-hidden" style="min-height: 200px;">
<pre class="overflow-x-auto p-4 text-sm leading-relaxed m-0 w-full max-w-full"><code class="language-<%= tab.id === 'javascript' || tab.id === 'typescript' ? 'javascript' : (tab.id === 'python' ? 'python' : (tab.id === 'go' ? 'go' : (tab.id === 'ruby' ? 'ruby' : (tab.id === 'rust' ? 'rust' : (tab.id === 'powershell' ? 'powershell' : (tab.id === 'java' ? 'java' : (tab.id === 'csharp' ? 'csharp' : (tab.id === 'php' ? 'php' : 'bash')))))))) %>"><%= codeExamples[tab.id] %></code></pre>
</div>
<% } %>
</div>
<% }); %>
</div>
</div>
<script>
function switchCodeTab(containerId, tabId) {
// Update all code-tabs-containers on the page
document.querySelectorAll('.code-tabs-container').forEach(container => {
// Update tabs
container.querySelectorAll('.code-tab').forEach(tab => {
const isActive = tab.dataset.tabId === tabId;
tab.setAttribute('aria-selected', isActive ? 'true' : 'false');
// Update tab styling
if (isActive) {
tab.classList.remove('text-slate-400', 'hover:text-slate-300', 'hover:bg-slate-800/30');
tab.classList.add('text-indigo-400', 'bg-slate-800/50');
} else {
tab.classList.add('text-slate-400', 'hover:text-slate-300', 'hover:bg-slate-800/30');
tab.classList.remove('text-indigo-400', 'bg-slate-800/50');
}
});
// Update panels
container.querySelectorAll('.code-panel').forEach(panel => {
if (panel.dataset.panelId === tabId) {
panel.classList.remove('hidden');
// Apply syntax highlighting to code blocks
panel.querySelectorAll('pre code').forEach((block) => {
if (window.hljs && !block.dataset.highlighted) {
hljs.highlightElement(block);
block.dataset.highlighted = 'true';
}
});
} else {
panel.classList.add('hidden');
}
});
});
// Store preference in localStorage (only for non-preview tabs)
if (tabId !== 'preview') {
try {
localStorage.setItem('preferred-code-lang', tabId);
} catch (e) {}
}
}
function copyCodeFromPanel(btn) {
const panel = btn.closest('.code-panel');
const code = panel.querySelector('code');
if (code) {
navigator.clipboard.writeText(code.textContent).then(() => {
showCopySuccess(btn);
});
}
}
function copyPreviewFromPanel(btn) {
const panel = btn.closest('.code-panel');
const headers = panel.querySelector('.preview-headers');
const body = panel.querySelector('.preview-body');
let textToCopy = '';
if (headers) {
textToCopy += headers.textContent;
}
if (body) {
textToCopy += '\n\n' + body.textContent;
}
navigator.clipboard.writeText(textToCopy).then(() => {
showCopySuccess(btn);
});
}
function showCopySuccess(btn) {
const copyIcon = btn.querySelector('.copy-icon');
const checkIcon = btn.querySelector('.check-icon');
const copyText = btn.querySelector('.copy-text');
copyIcon.classList.add('hidden');
checkIcon.classList.remove('hidden');
copyText.textContent = 'Copied!';
btn.classList.add('copied');
setTimeout(() => {
copyIcon.classList.remove('hidden');
checkIcon.classList.add('hidden');
copyText.textContent = 'Copy';
btn.classList.remove('copied');
}, 2000);
}
// Apply syntax highlighting and stored language preference on page load
document.addEventListener('DOMContentLoaded', function() {
// Wait a bit for all scripts to load, then highlight all code blocks
setTimeout(function() {
if (window.hljs) {
// Highlight ALL code blocks (including hidden ones)
document.querySelectorAll('pre code').forEach((block) => {
if (!block.classList.contains('hljs')) {
hljs.highlightElement(block);
}
});
}
// Apply stored preference if exists
try {
const preferred = localStorage.getItem('preferred-code-lang');
if (preferred && preferred !== 'preview') {
// Switch all containers to the preferred language
document.querySelectorAll('.code-tabs-container').forEach(container => {
const tab = container.querySelector(`[data-tab-id="${preferred}"]`);
if (tab) {
switchCodeTab(container.id, preferred);
}
});
}
} catch (e) {}
}, 100);
});
</script>

View File

@@ -1,33 +1,63 @@
<div class="not-prose my-6 overflow-hidden rounded-2xl bg-zinc-900 shadow-md ">
<div class="flex min-h-[calc(theme(spacing.12)+1px)] flex-wrap items-start gap-x-4 border-b border-zinc-700 bg-zinc-800 px-4 ">
<h4 class="mr-auto text-xs font-semibold text-white mt-5"><%= title -%></h4>
<div class="not-prose my-6 overflow-hidden rounded-xl bg-slate-900 shadow-lg ring-1 ring-slate-800/50 code-block-wrapper">
<div class="flex min-h-[calc(theme(spacing.11)+1px)] flex-wrap items-center gap-x-4 border-b border-slate-700/50 bg-slate-800/50 px-3 sm:px-4">
<h4 class="mr-auto text-xs font-semibold text-slate-300 tracking-wide"><%= title -%></h4>
<button class="copy-btn-response" onclick="copyCodeBlock(this)" aria-label="Copy code">
<svg class="copy-icon w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path>
</svg>
<svg class="check-icon w-4 h-4 hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<span class="copy-text">Copy</span>
</button>
</div>
<div class="group ">
<div class="group">
<% if(requestType && requestUrl){ %>
<div class="flex h-9 items-center gap-2 border-b-white/7.5 bg-zinc-900 bg-white/2.5 px-4 ">
<div class="flex flex-wrap sm:flex-nowrap items-center gap-2 sm:gap-3 py-2 sm:py-0 sm:h-10 border-b border-slate-700/30 bg-slate-800/30 px-3 sm:px-4">
<% if( requestType === "GET"){ %>
<div class="dark flex"><span class="font-mono text-sm font-semibold leading-6 text-emerald-500 ">GET</span></div>
<% } %>
<span class="inline-flex items-center rounded-md bg-emerald-500/10 px-2 py-1 text-xs font-semibold text-emerald-400 ring-1 ring-inset ring-emerald-500/20 flex-shrink-0">GET</span>
<% } %>
<% if( requestType === "POST"){ %>
<div class="dark flex"><span class="font-mono text-sm font-semibold leading-6 text-sky-500 ">POST</span></div>
<% } %>
<span class="inline-flex items-center rounded-md bg-indigo-500/10 px-2 py-1 text-xs font-semibold text-indigo-400 ring-1 ring-inset ring-indigo-500/20 flex-shrink-0">POST</span>
<% } %>
<% if( requestType === "DELETE"){ %>
<div class="dark flex"><span class="font-mono text-sm font-semibold leading-6 text-red-500 ">DELETE</span></div>
<% } %>
<span class="inline-flex items-center rounded-md bg-red-500/10 px-2 py-1 text-xs font-semibold text-red-400 ring-1 ring-inset ring-red-500/20 flex-shrink-0">DELETE</span>
<% } %>
<% if( requestType === "PUT"){ %>
<div class="dark flex"><span class="font-mono text-sm font-semibold leading-6 text-amber-500 ">PUT</span></div>
<% } %>
<span class="h-0.5 w-0.5 rounded-full bg-zinc-500"></span><span class="font-mono text-sm text-zinc-300"><%= requestUrl -%></span>
<span class="inline-flex items-center rounded-md bg-amber-500/10 px-2 py-1 text-xs font-semibold text-amber-400 ring-1 ring-inset ring-amber-500/20 flex-shrink-0">PUT</span>
<% } %>
<span class="font-mono text-xs sm:text-sm text-slate-400 break-all"><%= requestUrl -%></span>
</div>
<% } %>
<% } %>
<% if(code){ %>
<div class="relative">
<pre class="overflow-x-auto p-4 text-xs text-white"><code class="text-sm"><%= code -%></code></pre>
<pre class="overflow-x-auto p-4 text-sm text-slate-300 leading-relaxed"><code class="language-json text-sm"><%= code -%></code></pre>
</div>
<% } %>
<% } %>
</div>
</div>
</div>
<script>
function copyCodeBlock(btn) {
const codeBlock = btn.closest('.code-block-wrapper');
const code = codeBlock.querySelector('code');
if (code) {
navigator.clipboard.writeText(code.textContent).then(() => {
const copyIcon = btn.querySelector('.copy-icon');
const checkIcon = btn.querySelector('.check-icon');
const copyText = btn.querySelector('.copy-text');
copyIcon.classList.add('hidden');
checkIcon.classList.remove('hidden');
copyText.textContent = 'Copied!';
btn.classList.add('copied');
setTimeout(() => {
copyIcon.classList.remove('hidden');
checkIcon.classList.add('hidden');
copyText.textContent = 'Copy';
btn.classList.remove('copied');
}, 2000);
});
}
}
</script>

View File

@@ -1,31 +1,41 @@
<footer class="mx-auto max-w-2xl space-y-10 pb-16 lg:max-w-5xl">
<div
class="flex flex-col items-center justify-between gap-5 border-t border-zinc-900/5 pt-8 sm:flex-row">
<p class="text-xs text-zinc-600 ">
OneUptime documentation is under MIT license. Please feel free to contribute and improve it on GitHub.
</p>
<div class="flex gap-4">
<a class="group" href="https://twitter.com/OneUptimeHQ" target="_blank">
<span class="sr-only">Follow us on Twitter</span>
<svg viewBox="0 0 20 20" aria-hidden="true"
class="h-5 w-5 fill-zinc-700 transition group-hover:fill-zinc-900 :fill-zinc-500">
<path
d="M16.712 6.652c.01.146.01.29.01.436 0 4.449-3.267 9.579-9.242 9.579v-.003a8.963 8.963 0 0 1-4.98-1.509 6.379 6.379 0 0 0 4.807-1.396c-1.39-.027-2.608-.966-3.035-2.337.487.097.99.077 1.467-.059-1.514-.316-2.606-1.696-2.606-3.3v-.041c.45.26.956.404 1.475.42C3.18 7.454 2.74 5.486 3.602 3.947c1.65 2.104 4.083 3.382 6.695 3.517a3.446 3.446 0 0 1 .94-3.217 3.172 3.172 0 0 1 4.596.148 6.38 6.38 0 0 0 2.063-.817 3.357 3.357 0 0 1-1.428 1.861 6.283 6.283 0 0 0 1.865-.53 6.735 6.735 0 0 1-1.62 1.744Z">
</path>
</svg>
</a>
<a class="group" href="https://github.com/oneuptime/oneuptime" target="_blank">
<span class="sr-only">Follow us on GitHub</span>
<svg viewBox="0 0 20 20" aria-hidden="true"
class="h-5 w-5 fill-zinc-700 transition group-hover:fill-zinc-900 :fill-zinc-500">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M10 1.667c-4.605 0-8.334 3.823-8.334 8.544 0 3.78 2.385 6.974 5.698 8.106.417.075.573-.182.573-.406 0-.203-.011-.875-.011-1.592-2.093.397-2.635-.522-2.802-1.002-.094-.246-.5-1.005-.854-1.207-.291-.16-.708-.556-.01-.567.656-.01 1.124.62 1.281.876.75 1.292 1.948.93 2.427.705.073-.555.291-.93.531-1.143-1.854-.213-3.791-.95-3.791-4.218 0-.929.322-1.698.854-2.296-.083-.214-.375-1.09.083-2.265 0 0 .698-.224 2.292.876a7.576 7.576 0 0 1 2.083-.288c.709 0 1.417.096 2.084.288 1.593-1.11 2.291-.875 2.291-.875.459 1.174.167 2.05.084 2.263.53.599.854 1.357.854 2.297 0 3.278-1.948 4.005-3.802 4.219.302.266.563.78.563 1.58 0 1.143-.011 2.061-.011 2.35 0 .224.156.491.573.405a8.365 8.365 0 0 0 4.11-3.116 8.707 8.707 0 0 0 1.567-4.99c0-4.721-3.73-8.545-8.334-8.545Z">
</path>
</svg>
</a>
<footer class="mx-auto w-full space-y-10 pb-16">
<div class="mt-12 sm:mt-16 pt-8 border-t border-slate-200">
<div class="rounded-xl bg-gradient-to-r from-slate-50 to-slate-100/50 p-4 sm:p-6 ring-1 ring-slate-200/50">
<div class="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4">
<div class="flex items-center gap-4">
<div class="flex-shrink-0 rounded-lg bg-indigo-100 p-2.5">
<svg class="h-5 w-5 text-indigo-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path>
</svg>
</div>
<div>
<h3 class="text-sm font-semibold text-slate-900 mb-1">Open Source</h3>
<p class="text-sm text-slate-600 leading-relaxed">
OneUptime API documentation is under Apache 2.0 license. Contribute on GitHub.
</p>
</div>
</div>
<div class="flex gap-3">
<a class="group flex items-center justify-center w-9 h-9 rounded-lg bg-white ring-1 ring-slate-200 hover:ring-indigo-300 hover:bg-indigo-50 transition-all" href="https://twitter.com/OneUptimeHQ" target="_blank">
<span class="sr-only">Follow us on Twitter</span>
<svg viewBox="0 0 20 20" aria-hidden="true"
class="h-4 w-4 fill-slate-500 transition group-hover:fill-indigo-600">
<path
d="M16.712 6.652c.01.146.01.29.01.436 0 4.449-3.267 9.579-9.242 9.579v-.003a8.963 8.963 0 0 1-4.98-1.509 6.379 6.379 0 0 0 4.807-1.396c-1.39-.027-2.608-.966-3.035-2.337.487.097.99.077 1.467-.059-1.514-.316-2.606-1.696-2.606-3.3v-.041c.45.26.956.404 1.475.42C3.18 7.454 2.74 5.486 3.602 3.947c1.65 2.104 4.083 3.382 6.695 3.517a3.446 3.446 0 0 1 .94-3.217 3.172 3.172 0 0 1 4.596.148 6.38 6.38 0 0 0 2.063-.817 3.357 3.357 0 0 1-1.428 1.861 6.283 6.283 0 0 0 1.865-.53 6.735 6.735 0 0 1-1.62 1.744Z">
</path>
</svg>
</a>
<a class="group flex items-center justify-center w-9 h-9 rounded-lg bg-white ring-1 ring-slate-200 hover:ring-indigo-300 hover:bg-indigo-50 transition-all" href="https://github.com/oneuptime/oneuptime" target="_blank">
<span class="sr-only">Follow us on GitHub</span>
<svg viewBox="0 0 20 20" aria-hidden="true"
class="h-4 w-4 fill-slate-500 transition group-hover:fill-indigo-600">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M10 1.667c-4.605 0-8.334 3.823-8.334 8.544 0 3.78 2.385 6.974 5.698 8.106.417.075.573-.182.573-.406 0-.203-.011-.875-.011-1.592-2.093.397-2.635-.522-2.802-1.002-.094-.246-.5-1.005-.854-1.207-.291-.16-.708-.556-.01-.567.656-.01 1.124.62 1.281.876.75 1.292 1.948.93 2.427.705.073-.555.291-.93.531-1.143-1.854-.213-3.791-.95-3.791-4.218 0-.929.322-1.698.854-2.296-.083-.214-.375-1.09.083-2.265 0 0 .698-.224 2.292.876a7.576 7.576 0 0 1 2.083-.288c.709 0 1.417.096 2.084.288 1.593-1.11 2.291-.875 2.291-.875.459 1.174.167 2.05.084 2.263.53.599.854 1.357.854 2.297 0 3.278-1.948 4.005-3.802 4.219.302.266.563.78.563 1.58 0 1.143-.011 2.061-.011 2.35 0 .224.156.491.573.405a8.365 8.365 0 0 0 4.11-3.116 8.707 8.707 0 0 0 1.567-4.99c0-4.721-3.73-8.545-8.334-8.545Z">
</path>
</svg>
</a>
</div>
</div>
</div>
</div>
</footer>
</footer>

View File

@@ -4,90 +4,377 @@
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/default.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<!-- Load additional language support -->
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/python.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/go.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/java.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/csharp.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/php.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/ruby.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/rust.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/powershell.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/bash.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/json.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/javascript.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/typescript.min.js"></script>
<script src="https://cdn.tailwindcss.com"></script>
<script>
function applyStyles() {
applyStylesTo("h1", "font-bold text-2xl mb-5")
applyStylesTo("h2", "mb-5 scroll-mt-24 mt-24 font-bold text-xl")
applyStylesTo("h3", "mb-5 scroll-mt-24 mt-10 font-bold text-base")
applyStylesTo("p", "mb-5")
applyStylesTo("link", "text-emerald-500 hover:text-emerald-600")
applyStylesTo("model-inline-code", "rounded p-0.5 px-1 text-sm text-gray-50 bg-gray-600 border-2 border-gray-600 shadow")
applyStylesTo("inline-code", "rounded p-0.5 px-1 text-sm text-gray-500 bg-gray-100 border-2 border-gray-200")
applyStylesTo("h1", "font-bold text-2xl mb-6 text-slate-900 tracking-tight")
applyStylesTo("h2", "mb-5 scroll-mt-24 mt-16 font-semibold text-xl text-slate-900 tracking-tight")
applyStylesTo("h3", "mb-4 scroll-mt-24 mt-10 font-semibold text-base text-slate-800")
applyStylesTo("p", "mb-5 text-slate-600 leading-7")
applyStylesTo("link", "text-indigo-600 hover:text-indigo-700 font-medium transition-colors")
applyStylesTo("model-inline-code", "rounded-md py-0.5 px-1.5 text-sm font-medium text-slate-700 bg-slate-100 border border-slate-200")
applyStylesTo("inline-code", "rounded-md py-0.5 px-1.5 text-sm font-medium text-slate-700 bg-slate-100 border border-slate-200")
}
function applyStylesTo(tagOrClassName, classList) {
let elements = document.getElementsByClassName(tagOrClassName);
if(elements.length === 0){
elements = document.getElementsByTagName(tagOrClassName);
}
for (var i = 0, all = elements.length; i < all; i++) {
classList.split(" ").map((classItem)=> {
elements[i].classList.add(classItem);
})
}
}
</script>
<style>
.hljs {
color: unset;
background-color: unset;
}
.hljs-string {
color: #6ee7b7
}
.hljs-number {
color: #7dd3fc
}
.hljs-punctuation {
color: #e5e7eb
}
.hljs-comment {
color: #9ca3af
}
.hljs-keyword{
color: #7dd3fc;
font-weight: unset;
}
.hljs-attr{
color: #fda4af;
}
* {
font-family: Inter;
font-family: 'Inter', system-ui, -apple-system, sans-serif;
}
html {
scroll-behavior: smooth;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
input[type="datetime-local"]::-webkit-calendar-picker-indicator {
/* Better prose styling */
.prose p {
color: #475569;
line-height: 1.75;
}
.prose .lead {
font-size: 1.125rem;
color: #64748b;
line-height: 1.75;
}
.prose hr {
border-color: #e2e8f0;
margin-top: 2.5rem;
margin-bottom: 2.5rem;
}
.prose ul {
list-style: none;
padding: 0;
}
/* Syntax highlighting - comprehensive token styles */
.hljs {
background: transparent !important;
}
/* Keywords: import, from, def, class, if, else, for, while, return, etc. */
.hljs-keyword,
.hljs-built_in,
.hljs-type,
.hljs-literal,
.hljs-symbol {
color: #c792ea !important;
}
/* Strings */
.hljs-string,
.hljs-doctag,
.hljs-regexp {
color: #c3e88d !important;
}
/* Numbers */
.hljs-number {
color: #f78c6c !important;
}
/* Comments */
.hljs-comment {
color: #676e95 !important;
font-style: italic;
}
/* Function/method names */
.hljs-title,
.hljs-title.function_,
.hljs-title.class_ {
color: #82aaff !important;
}
/* Variables and parameters */
.hljs-variable,
.hljs-params,
.hljs-attr {
color: #f07178 !important;
}
/* Properties and attributes */
.hljs-property,
.hljs-attribute {
color: #ffcb6b !important;
}
/* Punctuation */
.hljs-punctuation {
color: #89ddff !important;
}
/* Operators */
.hljs-operator {
color: #89ddff !important;
}
/* Meta/preprocessor */
.hljs-meta {
color: #ffcb6b !important;
}
/* Section headers */
.hljs-section {
color: #82aaff !important;
}
/* Names (function calls, etc) */
.hljs-name {
color: #f07178 !important;
}
/* Selector tags in CSS */
.hljs-selector-tag,
.hljs-selector-class,
.hljs-selector-id {
color: #c792ea !important;
}
/* Template variables */
.hljs-template-variable {
color: #f07178 !important;
}
/* Deletion/addition in diffs */
.hljs-deletion {
color: #f07178 !important;
}
.hljs-addition {
color: #c3e88d !important;
}
/* Custom scrollbar */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: transparent;
bottom: 0;
color: transparent;
cursor: pointer;
height: auto;
left: 0;
position: absolute;
right: 0;
top: 0;
width: auto;
}
::-webkit-scrollbar-thumb {
background: #e2e8f0;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #cbd5e1;
}
/* Code block copy button */
.code-block-wrapper {
position: relative;
}
/* Response block copy button */
.copy-btn-response {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
font-size: 12px;
font-weight: 500;
color: #94a3b8;
background: rgba(30, 41, 59, 0.6);
border: 1px solid #334155;
border-radius: 6px;
cursor: pointer;
transition: all 0.15s ease;
}
.copy-btn-response:hover {
color: #f1f5f9;
background: #334155;
border-color: #475569;
}
.copy-btn-response.copied {
color: #22c55e;
border-color: #22c55e;
background: rgba(34, 197, 94, 0.1);
}
/* Code tabs styling */
.code-tabs-container {
--tab-hover-bg: rgba(30, 41, 59, 0.5);
}
.code-tab {
position: relative;
border-bottom: 2px solid transparent;
}
.code-tab[aria-selected="true"] {
border-bottom-color: #6366f1;
}
.code-panel {
position: relative;
}
.copy-btn-tabs {
position: absolute;
top: 12px;
right: 12px;
display: flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
font-size: 12px;
font-weight: 500;
color: #94a3b8;
background: rgba(30, 41, 59, 0.9);
border: 1px solid #334155;
border-radius: 6px;
cursor: pointer;
opacity: 0;
transition: all 0.15s ease;
z-index: 10;
backdrop-filter: blur(4px);
}
.code-panel:hover .copy-btn-tabs {
opacity: 1;
}
.copy-btn-tabs:hover {
color: #f1f5f9;
background: #334155;
border-color: #475569;
}
.copy-btn-tabs.copied {
color: #22c55e;
border-color: #22c55e;
background: rgba(34, 197, 94, 0.1);
}
/* Code content min-height for consistent sizing */
.code-content {
min-height: 200px;
}
/* Fix code tabs width - prevent content from expanding container */
.code-tabs-container {
width: 100%;
max-width: 100%;
overflow: hidden;
}
.code-tabs-container pre {
width: 0;
min-width: 100%;
overflow-x: auto;
}
.code-panel {
width: 100%;
max-width: 100%;
overflow: hidden;
}
.code-content {
width: 100%;
max-width: 100%;
overflow: hidden;
}
.code-content pre code {
display: block;
white-space: pre;
word-wrap: normal;
}
/* Hide scrollbar for tabs but keep functionality */
.scrollbar-hide {
-ms-overflow-style: none;
scrollbar-width: none;
}
.scrollbar-hide::-webkit-scrollbar {
display: none;
}
/* Tab indicator animation */
.tab-indicator {
transition: all 0.2s ease;
}
/* Code panel base styles */
.code-panel pre {
margin: 0;
background: transparent;
}
.code-panel code {
font-family: 'SF Mono', 'Fira Code', 'JetBrains Mono', Consolas, monospace;
font-size: 13px;
line-height: 1.6;
color: #e2e8f0;
}
/* Better focus states */
a:focus-visible, button:focus-visible {
outline: 2px solid #6366f1;
outline-offset: 2px;
border-radius: 4px;
}
/* Smooth transitions */
a, button {
transition: all 0.15s ease;
}
/* Property list styling */
.property-item {
padding: 1rem 0;
border-bottom: 1px solid #f1f5f9;
}
.property-item:last-child {
border-bottom: none;
}
/* Endpoint card styling */
.endpoint-card {
background: linear-gradient(to right, #fafafa, white);
border-radius: 0.75rem;
padding: 1.5rem;
border: 1px solid #e2e8f0;
margin-bottom: 1.5rem;
}
/* Calendar picker */
input[type="datetime-local"]::-webkit-calendar-picker-indicator,
input[type="date"]::-webkit-calendar-picker-indicator {
background: transparent;
bottom: 0;
@@ -101,7 +388,6 @@
width: auto;
}
</style>
<script src="https://cdn.tailwindcss.com"></script>
<% if(typeof enableGoogleTagManager !== 'undefined' ? enableGoogleTagManager : false){ %>
@@ -144,7 +430,7 @@
<meta property="og:image" content="https://oneuptime.com/img/hou-wb.svg">
<meta name="twitter:card" content="summary">
<meta name="theme-color" content="#000000">
<meta name="theme-color" content="#6366f1">
<meta name="twitter:image" content="/img/ou-wb.svg">
<meta name="twitter:site" content="@oneuptimeinc">
<meta name="twitter:title" content="OneUptime - One Complete Observability platform.">

View File

@@ -1,9 +1,92 @@
<header class="contents lg:pointer-events-none lg:fixed lg:inset-0 lg:z-40 lg:flex">
<div
class="contents lg:pointer-events-auto lg:block lg:w-72 lg:overflow-y-auto lg:border-r lg:border-zinc-900/10 lg:px-6 lg:pt-4 lg:pb-8 xl:w-80">
<div class="hidden lg:flex">
class="contents lg:pointer-events-auto lg:block lg:w-72 lg:overflow-y-auto lg:border-r lg:border-slate-200/80 lg:px-6 lg:pt-6 lg:pb-8 xl:w-80 lg:bg-gradient-to-b lg:from-slate-50 lg:to-white">
<div class="hidden lg:flex lg:items-center lg:mb-8">
<a aria-label="Home" href="/">
<svg class="h-6 -ml-48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
<svg class="h-7" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 375 75" preserveAspectRatio="xMidYMid meet">
<defs>
<g></g>
<clipPath id="1d83d73318">
<path d="M 351.792969 35.324219 L 367.53125 35.324219 L 367.53125 51.0625 L 351.792969 51.0625 Z M 351.792969 35.324219 " clip-rule="nonzero"></path>
</clipPath>
<clipPath id="32c1ad7ad2">
<path d="M 366.480469 51.03125 L 352.816406 51.03125 C 352.253906 51.03125 351.792969 50.574219 351.792969 50.007812 L 351.792969 36.347656 C 351.792969 35.785156 352.253906 35.324219 352.816406 35.324219 L 366.480469 35.324219 C 367.042969 35.324219 367.5 35.785156 367.5 36.347656 L 367.5 50.007812 C 367.5 50.574219 367.042969 51.03125 366.480469 51.03125 " clip-rule="nonzero"></path>
</clipPath>
</defs>
<g clip-path="url(#1d83d73318)">
<g clip-path="url(#32c1ad7ad2)">
<path fill="#7ed957" d="M 351.792969 35.324219 L 367.53125 35.324219 L 367.53125 51.0625 L 351.792969 51.0625 Z M 351.792969 35.324219 " fill-opacity="1" fill-rule="nonzero"></path>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(11.173064, 55.95717)">
<g>
<path d="M 1.5625 -21.828125 C 1.5625 -25.191406 2.054688 -28.320312 3.046875 -31.21875 C 4.046875 -34.164062 5.5 -36.71875 7.40625 -38.875 C 9.3125 -41.070312 11.632812 -42.773438 14.375 -43.984375 C 15.738281 -44.597656 17.195312 -45.0625 18.75 -45.375 C 20.3125 -45.6875 21.941406 -45.84375 23.640625 -45.84375 C 25.335938 -45.84375 26.960938 -45.6875 28.515625 -45.375 C 30.078125 -45.0625 31.539062 -44.578125 32.90625 -43.921875 C 34.269531 -43.296875 35.53125 -42.546875 36.6875 -41.671875 C 37.851562 -40.804688 38.914062 -39.8125 39.875 -38.6875 C 41.78125 -36.53125 43.25 -34.003906 44.28125 -31.109375 C 45.28125 -28.203125 45.78125 -25.109375 45.78125 -21.828125 C 45.78125 -18.554688 45.28125 -15.46875 44.28125 -12.5625 C 43.957031 -11.613281 43.578125 -10.679688 43.140625 -9.765625 C 42.703125 -8.847656 42.210938 -7.984375 41.671875 -7.171875 C 41.140625 -6.367188 40.5625 -5.597656 39.9375 -4.859375 C 38.976562 -3.734375 37.90625 -2.734375 36.71875 -1.859375 C 35.539062 -0.992188 34.289062 -0.25 32.96875 0.375 C 30.226562 1.65625 27.113281 2.296875 23.625 2.296875 C 20.144531 2.296875 17.039062 1.65625 14.3125 0.375 C 13.644531 0.0390625 13 -0.3125 12.375 -0.6875 C 11.757812 -1.0625 11.160156 -1.460938 10.578125 -1.890625 C 9.992188 -2.328125 9.429688 -2.796875 8.890625 -3.296875 C 8.359375 -3.796875 7.863281 -4.316406 7.40625 -4.859375 C 5.5 -7.054688 4.046875 -9.625 3.046875 -12.5625 C 2.054688 -15.46875 1.5625 -18.554688 1.5625 -21.828125 Z M 10.703125 -21.828125 C 10.703125 -20.796875 10.773438 -19.769531 10.921875 -18.75 C 11.066406 -17.738281 11.28125 -16.734375 11.5625 -15.734375 C 11.894531 -14.785156 12.269531 -13.882812 12.6875 -13.03125 C 13.101562 -12.175781 13.601562 -11.378906 14.1875 -10.640625 C 14.351562 -10.390625 14.535156 -10.160156 14.734375 -9.953125 C 14.941406 -9.742188 15.148438 -9.535156 15.359375 -9.328125 C 15.566406 -9.117188 15.785156 -8.910156 16.015625 -8.703125 C 16.242188 -8.492188 16.484375 -8.304688 16.734375 -8.140625 C 16.984375 -7.984375 17.234375 -7.820312 17.484375 -7.65625 C 17.734375 -7.488281 17.976562 -7.320312 18.21875 -7.15625 C 19.800781 -6.320312 21.609375 -5.90625 23.640625 -5.90625 C 24.378906 -5.90625 25.082031 -5.945312 25.75 -6.03125 C 26.414062 -6.113281 27.035156 -6.25 27.609375 -6.4375 C 28.191406 -6.625 28.734375 -6.84375 29.234375 -7.09375 C 30.847656 -7.875 32.195312 -8.953125 33.28125 -10.328125 C 33.65625 -10.785156 33.984375 -11.269531 34.265625 -11.78125 C 34.554688 -12.300781 34.828125 -12.863281 35.078125 -13.46875 C 35.328125 -14.070312 35.554688 -14.679688 35.765625 -15.296875 C 36.347656 -17.328125 36.640625 -19.503906 36.640625 -21.828125 C 36.640625 -23.898438 36.328125 -25.894531 35.703125 -27.8125 C 35.117188 -29.71875 34.25 -31.414062 33.09375 -32.90625 C 31.96875 -34.351562 30.617188 -35.515625 29.046875 -36.390625 C 27.472656 -37.222656 25.671875 -37.640625 23.640625 -37.640625 C 23.140625 -37.640625 22.640625 -37.617188 22.140625 -37.578125 C 21.640625 -37.535156 21.160156 -37.460938 20.703125 -37.359375 C 20.253906 -37.253906 19.820312 -37.128906 19.40625 -36.984375 C 18.988281 -36.835938 18.59375 -36.660156 18.21875 -36.453125 C 17.394531 -36.078125 16.648438 -35.617188 15.984375 -35.078125 C 15.316406 -34.546875 14.71875 -33.925781 14.1875 -33.21875 C 13.0625 -31.8125 12.1875 -30.148438 11.5625 -28.234375 C 10.988281 -26.242188 10.703125 -24.109375 10.703125 -21.828125 Z M 10.703125 -21.828125 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(58.505968, 55.95717)">
<g>
<path d="M 11.9375 -31.046875 C 12.269531 -31.367188 12.601562 -31.65625 12.9375 -31.90625 C 13.269531 -32.15625 13.625 -32.382812 14 -32.59375 C 16.070312 -33.957031 18.5 -34.640625 21.28125 -34.640625 C 23.3125 -34.640625 25.113281 -34.316406 26.6875 -33.671875 C 28.257812 -33.035156 29.585938 -32.078125 30.671875 -30.796875 C 32.703125 -28.304688 33.71875 -25.070312 33.71875 -21.09375 L 33.71875 1.5625 L 25 1.5625 L 25 -20.46875 C 25 -21.164062 24.945312 -21.804688 24.84375 -22.390625 C 24.738281 -22.972656 24.59375 -23.488281 24.40625 -23.9375 C 24.226562 -24.394531 23.992188 -24.789062 23.703125 -25.125 C 23.453125 -25.457031 23.171875 -25.738281 22.859375 -25.96875 C 22.546875 -26.195312 22.179688 -26.363281 21.765625 -26.46875 C 21.359375 -26.570312 20.882812 -26.625 20.34375 -26.625 C 19.59375 -26.625 18.84375 -26.476562 18.09375 -26.1875 C 17.3125 -25.894531 16.546875 -25.476562 15.796875 -24.9375 C 15.054688 -24.363281 14.351562 -23.722656 13.6875 -23.015625 C 13.4375 -22.679688 13.164062 -22.335938 12.875 -21.984375 C 12.582031 -21.628906 12.332031 -21.289062 12.125 -20.96875 L 12.125 1.5625 L 3.421875 1.5625 L 3.421875 -33.90625 L 11.9375 -33.90625 Z M 11.9375 -31.046875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(95.327364, 55.95717)">
<g>
<path d="M 10.390625 -12.3125 C 10.847656 -10.488281 11.632812 -9.019531 12.75 -7.90625 C 14.195312 -6.488281 16.144531 -5.78125 18.59375 -5.78125 C 19.175781 -5.78125 19.738281 -5.800781 20.28125 -5.84375 C 20.820312 -5.882812 21.335938 -5.945312 21.828125 -6.03125 C 22.328125 -6.113281 22.804688 -6.21875 23.265625 -6.34375 C 23.722656 -6.46875 24.175781 -6.601562 24.625 -6.75 C 25.082031 -6.894531 25.53125 -7.050781 25.96875 -7.21875 C 26.40625 -7.382812 26.851562 -7.570312 27.3125 -7.78125 L 28.921875 -8.515625 L 29.421875 -6.78125 L 30.734375 -1.984375 L 31.109375 -0.6875 L 29.921875 -0.125 C 28.304688 0.625 26.503906 1.207031 24.515625 1.625 C 23.515625 1.863281 22.460938 2.035156 21.359375 2.140625 C 20.265625 2.242188 19.117188 2.296875 17.921875 2.296875 C 15.390625 2.296875 13.085938 1.882812 11.015625 1.0625 C 8.941406 0.1875 7.175781 -1.054688 5.71875 -2.671875 C 4.269531 -4.242188 3.148438 -6.191406 2.359375 -8.515625 C 1.617188 -10.753906 1.25 -13.304688 1.25 -16.171875 C 1.25 -18.742188 1.617188 -21.148438 2.359375 -23.390625 C 2.773438 -24.503906 3.253906 -25.554688 3.796875 -26.546875 C 4.335938 -27.546875 4.957031 -28.460938 5.65625 -29.296875 C 7.070312 -30.953125 8.773438 -32.257812 10.765625 -33.21875 C 12.753906 -34.164062 14.972656 -34.640625 17.421875 -34.640625 C 18.242188 -34.640625 19.039062 -34.585938 19.8125 -34.484375 C 20.582031 -34.390625 21.328125 -34.25 22.046875 -34.0625 C 22.773438 -33.875 23.472656 -33.632812 24.140625 -33.34375 C 25.128906 -32.882812 26.023438 -32.351562 26.828125 -31.75 C 27.640625 -31.15625 28.378906 -30.460938 29.046875 -29.671875 C 30.335938 -28.140625 31.3125 -26.378906 31.96875 -24.390625 C 32.257812 -23.390625 32.488281 -22.359375 32.65625 -21.296875 C 32.820312 -20.242188 32.90625 -19.175781 32.90625 -18.09375 C 32.90625 -17.8125 32.90625 -17.523438 32.90625 -17.234375 C 32.90625 -16.941406 32.894531 -16.640625 32.875 -16.328125 C 32.851562 -16.015625 32.84375 -15.710938 32.84375 -15.421875 C 32.84375 -15.128906 32.832031 -14.847656 32.8125 -14.578125 C 32.789062 -14.316406 32.757812 -14.039062 32.71875 -13.75 L 32.59375 -12.3125 Z M 17.296875 -26.6875 C 15.304688 -26.6875 13.6875 -26.019531 12.4375 -24.6875 C 11.9375 -24.15625 11.5 -23.492188 11.125 -22.703125 C 10.757812 -21.910156 10.472656 -21 10.265625 -19.96875 L 24.5625 -19.96875 C 24.363281 -21.957031 23.742188 -23.507812 22.703125 -24.625 C 21.421875 -26 19.617188 -26.6875 17.296875 -26.6875 Z M 17.296875 -26.6875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(129.163241, 55.95717)">
<g>
<path d="M 31.28125 -45.09375 L 38.5625 -45.09375 L 38.5625 -16.796875 C 38.5625 -13.890625 38.148438 -11.253906 37.328125 -8.890625 C 36.492188 -6.523438 35.289062 -4.492188 33.71875 -2.796875 C 33.382812 -2.460938 33.039062 -2.148438 32.6875 -1.859375 C 32.332031 -1.578125 31.976562 -1.289062 31.625 -1 C 31.28125 -0.707031 30.910156 -0.445312 30.515625 -0.21875 C 30.117188 0.0078125 29.710938 0.226562 29.296875 0.4375 C 28.878906 0.644531 28.441406 0.832031 27.984375 1 C 25.828125 1.863281 23.425781 2.296875 20.78125 2.296875 C 15.257812 2.296875 10.925781 0.660156 7.78125 -2.609375 C 4.664062 -5.890625 3.109375 -10.535156 3.109375 -16.546875 L 3.109375 -45.09375 L 12.125 -45.09375 L 12.125 -17.484375 C 12.125 -13.617188 12.875 -10.691406 14.375 -8.703125 C 15.03125 -7.796875 15.875 -7.113281 16.90625 -6.65625 C 17.945312 -6.195312 19.238281 -5.96875 20.78125 -5.96875 C 23.800781 -5.96875 26.019531 -6.878906 27.4375 -8.703125 C 28.96875 -10.648438 29.734375 -13.578125 29.734375 -17.484375 L 29.734375 -45.09375 Z M 31.28125 -45.09375 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(170.836098, 55.95717)">
<g>
<path d="M 3.671875 -33.90625 C 4.492188 -33.90625 5.257812 -33.84375 5.96875 -33.71875 C 6.675781 -33.59375 7.347656 -33.394531 7.984375 -33.125 C 8.628906 -32.851562 9.222656 -32.507812 9.765625 -32.09375 C 10.304688 -31.675781 10.765625 -31.179688 11.140625 -30.609375 C 11.835938 -31.304688 12.644531 -31.925781 13.5625 -32.46875 C 13.8125 -32.632812 14.0625 -32.789062 14.3125 -32.9375 C 14.5625 -33.082031 14.828125 -33.21875 15.109375 -33.34375 C 15.398438 -33.46875 15.691406 -33.582031 15.984375 -33.6875 C 16.273438 -33.789062 16.566406 -33.90625 16.859375 -34.03125 C 17.523438 -34.238281 18.207031 -34.390625 18.90625 -34.484375 C 19.613281 -34.585938 20.34375 -34.640625 21.09375 -34.640625 C 23.164062 -34.640625 25.164062 -34.222656 27.09375 -33.390625 C 29.019531 -32.566406 30.707031 -31.367188 32.15625 -29.796875 C 33.613281 -28.222656 34.753906 -26.316406 35.578125 -24.078125 C 35.867188 -23.328125 36.109375 -22.535156 36.296875 -21.703125 C 36.484375 -20.878906 36.628906 -20.03125 36.734375 -19.15625 C 36.835938 -18.289062 36.890625 -17.398438 36.890625 -16.484375 C 36.890625 -13.742188 36.472656 -11.210938 35.640625 -8.890625 C 35.222656 -7.773438 34.734375 -6.71875 34.171875 -5.71875 C 33.617188 -4.726562 32.96875 -3.816406 32.21875 -2.984375 C 31.96875 -2.648438 31.6875 -2.335938 31.375 -2.046875 C 31.070312 -1.765625 30.753906 -1.476562 30.421875 -1.1875 C 30.085938 -0.894531 29.753906 -0.625 29.421875 -0.375 C 29.085938 -0.125 28.734375 0.101562 28.359375 0.3125 C 27.992188 0.519531 27.625 0.707031 27.25 0.875 C 26.289062 1.375 25.300781 1.734375 24.28125 1.953125 C 23.269531 2.179688 22.25 2.296875 21.21875 2.296875 C 19.019531 2.296875 17.003906 1.863281 15.171875 1 C 14.515625 0.707031 13.894531 0.375 13.3125 0 L 13.3125 15.234375 L 4.609375 15.234375 L 4.609375 -24.078125 C 4.609375 -25.023438 4.441406 -25.644531 4.109375 -25.9375 C 3.734375 -26.269531 3.191406 -26.4375 2.484375 -26.4375 L 0.4375 -26.4375 L 1 -28.421875 L 2.171875 -32.78125 L 2.484375 -33.90625 Z M 28.046875 -16.296875 C 28.046875 -17.171875 27.984375 -17.976562 27.859375 -18.71875 C 27.742188 -19.46875 27.570312 -20.160156 27.34375 -20.796875 C 27.113281 -21.441406 26.851562 -22.035156 26.5625 -22.578125 C 26.269531 -23.117188 25.9375 -23.617188 25.5625 -24.078125 C 24.820312 -24.941406 23.960938 -25.59375 22.984375 -26.03125 C 22.003906 -26.46875 20.957031 -26.6875 19.84375 -26.6875 C 19.09375 -26.6875 18.382812 -26.59375 17.71875 -26.40625 C 17.0625 -26.21875 16.441406 -25.9375 15.859375 -25.5625 C 14.785156 -24.894531 13.9375 -24.191406 13.3125 -23.453125 L 13.3125 -8.703125 C 14.1875 -7.921875 15.140625 -7.257812 16.171875 -6.71875 C 17.335938 -6.09375 18.644531 -5.78125 20.09375 -5.78125 C 21.25 -5.78125 22.304688 -6.007812 23.265625 -6.46875 C 24.210938 -6.96875 25.039062 -7.648438 25.75 -8.515625 C 26.125 -8.972656 26.445312 -9.472656 26.71875 -10.015625 C 26.988281 -10.554688 27.226562 -11.15625 27.4375 -11.8125 C 27.644531 -12.476562 27.796875 -13.179688 27.890625 -13.921875 C 27.992188 -14.671875 28.046875 -15.460938 28.046875 -16.296875 Z M 28.046875 -16.296875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(208.963656, 55.95717)">
<g>
<path d="M 7.53125 -42.921875 L 13.375 -42.921875 L 13.375 -32.71875 L 22.328125 -32.71875 L 22.328125 -24.75 L 13.375 -24.75 L 13.375 -10.703125 C 13.375 -9.660156 13.476562 -8.8125 13.6875 -8.15625 C 13.894531 -7.53125 14.144531 -7.050781 14.4375 -6.71875 C 14.71875 -6.382812 15.066406 -6.15625 15.484375 -6.03125 C 15.734375 -5.945312 15.984375 -5.882812 16.234375 -5.84375 C 16.484375 -5.800781 16.734375 -5.78125 16.984375 -5.78125 C 17.847656 -5.78125 18.632812 -5.90625 19.34375 -6.15625 C 20.21875 -6.488281 21.023438 -6.863281 21.765625 -7.28125 L 23.390625 -8.15625 L 24.015625 -6.40625 L 25.5625 -1.921875 L 25.9375 -0.75 L 24.875 -0.125 C 23.96875 0.457031 22.75 1 21.21875 1.5 C 20.425781 1.78125 19.613281 1.984375 18.78125 2.109375 C 17.957031 2.234375 17.128906 2.296875 16.296875 2.296875 C 12.734375 2.296875 9.894531 1.113281 7.78125 -1.25 C 6.695312 -2.445312 5.90625 -3.875 5.40625 -5.53125 C 4.914062 -7.195312 4.671875 -9.066406 4.671875 -11.140625 L 4.671875 -24.75 L -0.9375 -24.75 L -0.9375 -32.71875 L 4.96875 -32.71875 L 5.96875 -41.546875 L 6.15625 -42.921875 Z M 7.53125 -42.921875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(233.656391, 55.95717)">
<g>
<path d="M 10.578125 1.5625 L 3.421875 1.5625 L 3.421875 -33.90625 L 12.125 -33.90625 L 12.125 1.5625 Z M 7.78125 -36.328125 C 6.28125 -36.328125 4.988281 -36.863281 3.90625 -37.9375 C 2.832031 -39.019531 2.296875 -40.304688 2.296875 -41.796875 C 2.296875 -43.410156 2.800781 -44.726562 3.8125 -45.75 C 4.832031 -46.769531 6.15625 -47.28125 7.78125 -47.28125 C 8.519531 -47.28125 9.222656 -47.144531 9.890625 -46.875 C 10.554688 -46.601562 11.144531 -46.207031 11.65625 -45.6875 C 12.175781 -45.164062 12.570312 -44.570312 12.84375 -43.90625 C 13.113281 -43.25 13.25 -42.546875 13.25 -41.796875 C 13.25 -40.179688 12.738281 -38.863281 11.71875 -37.84375 C 10.707031 -36.832031 9.394531 -36.328125 7.78125 -36.328125 Z M 7.78125 -36.328125 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(249.205965, 55.95717)">
<g>
<path d="M 11.9375 -31.109375 C 12.269531 -31.390625 12.59375 -31.65625 12.90625 -31.90625 C 13.21875 -32.15625 13.5625 -32.382812 13.9375 -32.59375 C 14.4375 -32.925781 14.953125 -33.226562 15.484375 -33.5 C 16.023438 -33.769531 16.59375 -33.984375 17.1875 -34.140625 C 17.789062 -34.304688 18.394531 -34.429688 19 -34.515625 C 19.601562 -34.597656 20.238281 -34.640625 20.90625 -34.640625 C 23.800781 -34.640625 26.203125 -33.914062 28.109375 -32.46875 C 29.273438 -31.59375 30.234375 -30.515625 30.984375 -29.234375 C 32.015625 -30.398438 33.113281 -31.4375 34.28125 -32.34375 C 34.6875 -32.632812 35.117188 -32.90625 35.578125 -33.15625 C 36.035156 -33.40625 36.507812 -33.625 37 -33.8125 C 37.5 -34 38.007812 -34.148438 38.53125 -34.265625 C 39.050781 -34.390625 39.578125 -34.484375 40.109375 -34.546875 C 40.648438 -34.609375 41.210938 -34.640625 41.796875 -34.640625 C 42.046875 -34.640625 42.285156 -34.640625 42.515625 -34.640625 C 42.742188 -34.640625 42.972656 -34.628906 43.203125 -34.609375 C 43.429688 -34.585938 43.65625 -34.554688 43.875 -34.515625 C 44.101562 -34.472656 44.320312 -34.429688 44.53125 -34.390625 C 44.738281 -34.359375 44.945312 -34.320312 45.15625 -34.28125 C 45.363281 -34.238281 45.570312 -34.1875 45.78125 -34.125 C 45.988281 -34.0625 46.195312 -33.988281 46.40625 -33.90625 C 46.613281 -33.820312 46.820312 -33.738281 47.03125 -33.65625 C 47.394531 -33.488281 47.753906 -33.300781 48.109375 -33.09375 C 48.460938 -32.882812 48.796875 -32.65625 49.109375 -32.40625 C 49.421875 -32.15625 49.722656 -31.894531 50.015625 -31.625 C 50.304688 -31.351562 50.570312 -31.054688 50.8125 -30.734375 C 51.851562 -29.523438 52.601562 -28.09375 53.0625 -26.4375 C 53.5625 -24.820312 53.8125 -23.039062 53.8125 -21.09375 L 53.8125 1.5625 L 45.09375 1.5625 L 45.09375 -20.65625 C 45.09375 -22.5625 44.679688 -24.070312 43.859375 -25.1875 C 43.109375 -26.144531 42.09375 -26.625 40.8125 -26.625 C 40.0625 -26.625 39.351562 -26.476562 38.6875 -26.1875 C 37.945312 -25.851562 37.242188 -25.414062 36.578125 -24.875 C 35.867188 -24.300781 35.179688 -23.640625 34.515625 -22.890625 C 34.273438 -22.554688 34.007812 -22.203125 33.71875 -21.828125 C 33.425781 -21.460938 33.175781 -21.113281 32.96875 -20.78125 L 32.96875 1.5625 L 24.265625 1.5625 L 24.265625 -20.65625 C 24.265625 -22.5625 23.847656 -24.070312 23.015625 -25.1875 C 22.265625 -26.144531 21.25 -26.625 19.96875 -26.625 C 19.257812 -26.625 18.554688 -26.476562 17.859375 -26.1875 C 17.523438 -26.0625 17.171875 -25.894531 16.796875 -25.6875 C 16.421875 -25.476562 16.066406 -25.226562 15.734375 -24.9375 C 15.609375 -24.851562 15.484375 -24.757812 15.359375 -24.65625 C 15.234375 -24.5625 15.117188 -24.460938 15.015625 -24.359375 C 14.910156 -24.253906 14.796875 -24.148438 14.671875 -24.046875 C 14.554688 -23.941406 14.445312 -23.835938 14.34375 -23.734375 C 14.238281 -23.628906 14.132812 -23.515625 14.03125 -23.390625 C 13.925781 -23.265625 13.8125 -23.140625 13.6875 -23.015625 C 13.4375 -22.679688 13.164062 -22.335938 12.875 -21.984375 C 12.582031 -21.628906 12.332031 -21.289062 12.125 -20.96875 L 12.125 1.5625 L 3.421875 1.5625 L 3.421875 -33.90625 L 11.9375 -33.90625 Z M 11.9375 -31.109375 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(306.117405, 55.95717)">
<g>
<path d="M 10.390625 -12.3125 C 10.847656 -10.488281 11.632812 -9.019531 12.75 -7.90625 C 14.195312 -6.488281 16.144531 -5.78125 18.59375 -5.78125 C 19.175781 -5.78125 19.738281 -5.800781 20.28125 -5.84375 C 20.820312 -5.882812 21.335938 -5.945312 21.828125 -6.03125 C 22.328125 -6.113281 22.804688 -6.21875 23.265625 -6.34375 C 23.722656 -6.46875 24.175781 -6.601562 24.625 -6.75 C 25.082031 -6.894531 25.53125 -7.050781 25.96875 -7.21875 C 26.40625 -7.382812 26.851562 -7.570312 27.3125 -7.78125 L 28.921875 -8.515625 L 29.421875 -6.78125 L 30.734375 -1.984375 L 31.109375 -0.6875 L 29.921875 -0.125 C 28.304688 0.625 26.503906 1.207031 24.515625 1.625 C 23.515625 1.863281 22.460938 2.035156 21.359375 2.140625 C 20.265625 2.242188 19.117188 2.296875 17.921875 2.296875 C 15.390625 2.296875 13.085938 1.882812 11.015625 1.0625 C 8.941406 0.1875 7.175781 -1.054688 5.71875 -2.671875 C 4.269531 -4.242188 3.148438 -6.191406 2.359375 -8.515625 C 1.617188 -10.753906 1.25 -13.304688 1.25 -16.171875 C 1.25 -18.742188 1.617188 -21.148438 2.359375 -23.390625 C 2.773438 -24.503906 3.253906 -25.554688 3.796875 -26.546875 C 4.335938 -27.546875 4.957031 -28.460938 5.65625 -29.296875 C 7.070312 -30.953125 8.773438 -32.257812 10.765625 -33.21875 C 12.753906 -34.164062 14.972656 -34.640625 17.421875 -34.640625 C 18.242188 -34.640625 19.039062 -34.585938 19.8125 -34.484375 C 20.582031 -34.390625 21.328125 -34.25 22.046875 -34.0625 C 22.773438 -33.875 23.472656 -33.632812 24.140625 -33.34375 C 25.128906 -32.882812 26.023438 -32.351562 26.828125 -31.75 C 27.640625 -31.15625 28.378906 -30.460938 29.046875 -29.671875 C 30.335938 -28.140625 31.3125 -26.378906 31.96875 -24.390625 C 32.257812 -23.390625 32.488281 -22.359375 32.65625 -21.296875 C 32.820312 -20.242188 32.90625 -19.175781 32.90625 -18.09375 C 32.90625 -17.8125 32.90625 -17.523438 32.90625 -17.234375 C 32.90625 -16.941406 32.894531 -16.640625 32.875 -16.328125 C 32.851562 -16.015625 32.84375 -15.710938 32.84375 -15.421875 C 32.84375 -15.128906 32.832031 -14.847656 32.8125 -14.578125 C 32.789062 -14.316406 32.757812 -14.039062 32.71875 -13.75 L 32.59375 -12.3125 Z M 17.296875 -26.6875 C 15.304688 -26.6875 13.6875 -26.019531 12.4375 -24.6875 C 11.9375 -24.15625 11.5 -23.492188 11.125 -22.703125 C 10.757812 -21.910156 10.472656 -21 10.265625 -19.96875 L 24.5625 -19.96875 C 24.363281 -21.957031 23.742188 -23.507812 22.703125 -24.625 C 21.421875 -26 19.617188 -26.6875 17.296875 -26.6875 Z M 17.296875 -26.6875 "></path>
</g>
</g>
</g>
</svg>
</a>
</div>
<div class="hidden">
<a aria-label="Home" href="/">
<svg class="h-6" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="500" zoomAndPan="magnify" viewBox="0 0 375 74.999997" height="100"
preserveAspectRatio="xMidYMid meet" version="1.0">
<defs>
@@ -101,9 +184,9 @@
</svg>
</a>
</div>
<div class="fixed inset-x-0 top-0 z-50 flex h-14 border-b-2 items-center justify-between gap-12 px-4 transition sm:px-6 lg:left-72 lg:z-30 lg:px-8 xl:left-80 backdrop-blur-sm lg:left-72 xl:left-80 bg-white/[var(--bg-opacity-light)] /[var(--bg-opacity-dark)]"
<div class="fixed inset-x-0 top-0 z-50 flex h-14 border-b border-slate-200 items-center justify-between gap-12 px-4 transition sm:px-6 lg:left-72 lg:z-30 lg:px-8 xl:left-80 backdrop-blur-sm lg:left-72 xl:left-80 bg-white/95 supports-[backdrop-filter]:bg-white/80"
style="--bg-opacity-light:0.5; ">
<div class="absolute inset-x-0 top-full h-px transition bg-zinc-900/7.5 "></div>
<div class="absolute inset-x-0 top-full h-px transition bg-slate-900/5"></div>
<div class="hidden lg:block lg:max-w-md lg:flex-auto">
<!-- <button type="button"
class="hidden h-8 w-full items-center gap-2 rounded-full bg-white pl-2 pr-3 text-sm text-zinc-500 ring-1 ring-zinc-900/10 transition hover:ring-zinc-900/20 lg:flex focus:[&amp;:not(:focus-visible)]:outline-none">
@@ -116,44 +199,117 @@
</button> -->
</div>
<div class="flex items-center gap-5 lg:hidden">
<button type="button"
class="flex h-6 w-6 items-center justify-center rounded-md transition hover:bg-zinc-900/5 "
<button type="button" id="mobile-menu-toggle"
class="flex h-8 w-8 items-center justify-center rounded-lg transition hover:bg-slate-100"
aria-label="Toggle navigation">
<svg viewBox="0 0 10 9" fill="none" stroke-linecap="round" aria-hidden="true"
class="w-2.5 stroke-zinc-900 ">
<path d="M.5 1h9M.5 8h9M.5 4.5h9"></path>
<svg id="menu-open-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" aria-hidden="true"
class="w-5 h-5 stroke-slate-700">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
</svg>
<svg id="menu-close-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" aria-hidden="true"
class="w-5 h-5 stroke-slate-700 hidden">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
</svg>
</button>
<a aria-label="Home" href="/">
<svg viewBox="0 0 99 24" aria-hidden="true" class="h-6">
<path class="fill-emerald-400"
d="M16 8a5 5 0 0 0-5-5H5a5 5 0 0 0-5 5v13.927a1 1 0 0 0 1.623.782l3.684-2.93a4 4 0 0 1 2.49-.87H11a5 5 0 0 0 5-5V8Z">
</path>
<path class="fill-zinc-900 "
d="M26.538 18h2.654v-3.999h2.576c2.672 0 4.456-1.723 4.456-4.333V9.65c0-2.61-1.784-4.333-4.456-4.333h-5.23V18Zm4.58-10.582c1.52 0 2.416.8 2.416 2.241v.018c0 1.441-.896 2.25-2.417 2.25h-1.925V7.418h1.925ZM38.051 18h2.566v-5.414c0-1.371.923-2.206 2.382-2.206.396 0 .791.061 1.178.15V8.287a3.843 3.843 0 0 0-.958-.123c-1.257 0-2.136.615-2.443 1.661h-.159V8.323h-2.566V18Zm11.55.202c2.979 0 4.772-1.88 4.772-5.036v-.018c0-3.128-1.82-5.036-4.773-5.036-2.953 0-4.772 1.916-4.772 5.036v.018c0 3.146 1.793 5.036 4.772 5.036Zm0-2.013c-1.372 0-2.145-1.116-2.145-3.023v-.018c0-1.89.782-3.023 2.144-3.023 1.354 0 2.145 1.134 2.145 3.023v.018c0 1.907-.782 3.023-2.145 3.023Zm10.52 1.846c.492 0 .967-.053 1.283-.114v-1.907a6.057 6.057 0 0 1-.755.044c-.87 0-1.24-.387-1.24-1.257v-4.544h1.995V8.323H59.41V6.012h-2.592v2.311h-1.495v1.934h1.495v5.133c0 1.88.949 2.645 3.304 2.645Zm7.287.167c2.98 0 4.772-1.88 4.772-5.036v-.018c0-3.128-1.82-5.036-4.772-5.036-2.954 0-4.773 1.916-4.773 5.036v.018c0 3.146 1.793 5.036 4.773 5.036Zm0-2.013c-1.372 0-2.145-1.116-2.145-3.023v-.018c0-1.89.782-3.023 2.145-3.023 1.353 0 2.144 1.134 2.144 3.023v.018c0 1.907-.782 3.023-2.144 3.023Zm10.767 2.013c2.522 0 4.034-1.353 4.297-3.463l.01-.053h-2.374l-.017.036c-.229.966-.853 1.467-1.908 1.467-1.37 0-2.135-1.08-2.135-3.04v-.018c0-1.934.755-3.006 2.135-3.006 1.099 0 1.74.615 1.908 1.556l.008.017h2.391v-.026c-.228-2.162-1.749-3.56-4.315-3.56-3.033 0-4.738 1.837-4.738 5.019v.017c0 3.217 1.714 5.054 4.738 5.054Zm10.257 0c2.98 0 4.772-1.88 4.772-5.036v-.018c0-3.128-1.82-5.036-4.772-5.036-2.953 0-4.773 1.916-4.773 5.036v.018c0 3.146 1.793 5.036 4.773 5.036Zm0-2.013c-1.371 0-2.145-1.116-2.145-3.023v-.018c0-1.89.782-3.023 2.145-3.023 1.353 0 2.144 1.134 2.144 3.023v.018c0 1.907-.782 3.023-2.144 3.023ZM95.025 18h2.566V4.623h-2.566V18Z">
</path>
<svg class="h-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 375 75" preserveAspectRatio="xMidYMid meet">
<defs>
<g></g>
<clipPath id="mobile-header-1d83d73318">
<path d="M 351.792969 35.324219 L 367.53125 35.324219 L 367.53125 51.0625 L 351.792969 51.0625 Z M 351.792969 35.324219 " clip-rule="nonzero"></path>
</clipPath>
<clipPath id="mobile-header-32c1ad7ad2">
<path d="M 366.480469 51.03125 L 352.816406 51.03125 C 352.253906 51.03125 351.792969 50.574219 351.792969 50.007812 L 351.792969 36.347656 C 351.792969 35.785156 352.253906 35.324219 352.816406 35.324219 L 366.480469 35.324219 C 367.042969 35.324219 367.5 35.785156 367.5 36.347656 L 367.5 50.007812 C 367.5 50.574219 367.042969 51.03125 366.480469 51.03125 " clip-rule="nonzero"></path>
</clipPath>
</defs>
<g clip-path="url(#mobile-header-1d83d73318)">
<g clip-path="url(#mobile-header-32c1ad7ad2)">
<path fill="#7ed957" d="M 351.792969 35.324219 L 367.53125 35.324219 L 367.53125 51.0625 L 351.792969 51.0625 Z M 351.792969 35.324219 " fill-opacity="1" fill-rule="nonzero"></path>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(11.173064, 55.95717)">
<g>
<path d="M 1.5625 -21.828125 C 1.5625 -25.191406 2.054688 -28.320312 3.046875 -31.21875 C 4.046875 -34.164062 5.5 -36.71875 7.40625 -38.875 C 9.3125 -41.070312 11.632812 -42.773438 14.375 -43.984375 C 15.738281 -44.597656 17.195312 -45.0625 18.75 -45.375 C 20.3125 -45.6875 21.941406 -45.84375 23.640625 -45.84375 C 25.335938 -45.84375 26.960938 -45.6875 28.515625 -45.375 C 30.078125 -45.0625 31.539062 -44.578125 32.90625 -43.921875 C 34.269531 -43.296875 35.53125 -42.546875 36.6875 -41.671875 C 37.851562 -40.804688 38.914062 -39.8125 39.875 -38.6875 C 41.78125 -36.53125 43.25 -34.003906 44.28125 -31.109375 C 45.28125 -28.203125 45.78125 -25.109375 45.78125 -21.828125 C 45.78125 -18.554688 45.28125 -15.46875 44.28125 -12.5625 C 43.957031 -11.613281 43.578125 -10.679688 43.140625 -9.765625 C 42.703125 -8.847656 42.210938 -7.984375 41.671875 -7.171875 C 41.140625 -6.367188 40.5625 -5.597656 39.9375 -4.859375 C 38.976562 -3.734375 37.90625 -2.734375 36.71875 -1.859375 C 35.539062 -0.992188 34.289062 -0.25 32.96875 0.375 C 30.226562 1.65625 27.113281 2.296875 23.625 2.296875 C 20.144531 2.296875 17.039062 1.65625 14.3125 0.375 C 13.644531 0.0390625 13 -0.3125 12.375 -0.6875 C 11.757812 -1.0625 11.160156 -1.460938 10.578125 -1.890625 C 9.992188 -2.328125 9.429688 -2.796875 8.890625 -3.296875 C 8.359375 -3.796875 7.863281 -4.316406 7.40625 -4.859375 C 5.5 -7.054688 4.046875 -9.625 3.046875 -12.5625 C 2.054688 -15.46875 1.5625 -18.554688 1.5625 -21.828125 Z M 10.703125 -21.828125 C 10.703125 -20.796875 10.773438 -19.769531 10.921875 -18.75 C 11.066406 -17.738281 11.28125 -16.734375 11.5625 -15.734375 C 11.894531 -14.785156 12.269531 -13.882812 12.6875 -13.03125 C 13.101562 -12.175781 13.601562 -11.378906 14.1875 -10.640625 C 14.351562 -10.390625 14.535156 -10.160156 14.734375 -9.953125 C 14.941406 -9.742188 15.148438 -9.535156 15.359375 -9.328125 C 15.566406 -9.117188 15.785156 -8.910156 16.015625 -8.703125 C 16.242188 -8.492188 16.484375 -8.304688 16.734375 -8.140625 C 16.984375 -7.984375 17.234375 -7.820312 17.484375 -7.65625 C 17.734375 -7.488281 17.976562 -7.320312 18.21875 -7.15625 C 19.800781 -6.320312 21.609375 -5.90625 23.640625 -5.90625 C 24.378906 -5.90625 25.082031 -5.945312 25.75 -6.03125 C 26.414062 -6.113281 27.035156 -6.25 27.609375 -6.4375 C 28.191406 -6.625 28.734375 -6.84375 29.234375 -7.09375 C 30.847656 -7.875 32.195312 -8.953125 33.28125 -10.328125 C 33.65625 -10.785156 33.984375 -11.269531 34.265625 -11.78125 C 34.554688 -12.300781 34.828125 -12.863281 35.078125 -13.46875 C 35.328125 -14.070312 35.554688 -14.679688 35.765625 -15.296875 C 36.347656 -17.328125 36.640625 -19.503906 36.640625 -21.828125 C 36.640625 -23.898438 36.328125 -25.894531 35.703125 -27.8125 C 35.117188 -29.71875 34.25 -31.414062 33.09375 -32.90625 C 31.96875 -34.351562 30.617188 -35.515625 29.046875 -36.390625 C 27.472656 -37.222656 25.671875 -37.640625 23.640625 -37.640625 C 23.140625 -37.640625 22.640625 -37.617188 22.140625 -37.578125 C 21.640625 -37.535156 21.160156 -37.460938 20.703125 -37.359375 C 20.253906 -37.253906 19.820312 -37.128906 19.40625 -36.984375 C 18.988281 -36.835938 18.59375 -36.660156 18.21875 -36.453125 C 17.394531 -36.078125 16.648438 -35.617188 15.984375 -35.078125 C 15.316406 -34.546875 14.71875 -33.925781 14.1875 -33.21875 C 13.0625 -31.8125 12.1875 -30.148438 11.5625 -28.234375 C 10.988281 -26.242188 10.703125 -24.109375 10.703125 -21.828125 Z M 10.703125 -21.828125 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(58.505968, 55.95717)">
<g>
<path d="M 11.9375 -31.046875 C 12.269531 -31.367188 12.601562 -31.65625 12.9375 -31.90625 C 13.269531 -32.15625 13.625 -32.382812 14 -32.59375 C 16.070312 -33.957031 18.5 -34.640625 21.28125 -34.640625 C 23.3125 -34.640625 25.113281 -34.316406 26.6875 -33.671875 C 28.257812 -33.035156 29.585938 -32.078125 30.671875 -30.796875 C 32.703125 -28.304688 33.71875 -25.070312 33.71875 -21.09375 L 33.71875 1.5625 L 25 1.5625 L 25 -20.46875 C 25 -21.164062 24.945312 -21.804688 24.84375 -22.390625 C 24.738281 -22.972656 24.59375 -23.488281 24.40625 -23.9375 C 24.226562 -24.394531 23.992188 -24.789062 23.703125 -25.125 C 23.453125 -25.457031 23.171875 -25.738281 22.859375 -25.96875 C 22.546875 -26.195312 22.179688 -26.363281 21.765625 -26.46875 C 21.359375 -26.570312 20.882812 -26.625 20.34375 -26.625 C 19.59375 -26.625 18.84375 -26.476562 18.09375 -26.1875 C 17.3125 -25.894531 16.546875 -25.476562 15.796875 -24.9375 C 15.054688 -24.363281 14.351562 -23.722656 13.6875 -23.015625 C 13.4375 -22.679688 13.164062 -22.335938 12.875 -21.984375 C 12.582031 -21.628906 12.332031 -21.289062 12.125 -20.96875 L 12.125 1.5625 L 3.421875 1.5625 L 3.421875 -33.90625 L 11.9375 -33.90625 Z M 11.9375 -31.046875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(95.327364, 55.95717)">
<g>
<path d="M 10.390625 -12.3125 C 10.847656 -10.488281 11.632812 -9.019531 12.75 -7.90625 C 14.195312 -6.488281 16.144531 -5.78125 18.59375 -5.78125 C 19.175781 -5.78125 19.738281 -5.800781 20.28125 -5.84375 C 20.820312 -5.882812 21.335938 -5.945312 21.828125 -6.03125 C 22.328125 -6.113281 22.804688 -6.21875 23.265625 -6.34375 C 23.722656 -6.46875 24.175781 -6.601562 24.625 -6.75 C 25.082031 -6.894531 25.53125 -7.050781 25.96875 -7.21875 C 26.40625 -7.382812 26.851562 -7.570312 27.3125 -7.78125 L 28.921875 -8.515625 L 29.421875 -6.78125 L 30.734375 -1.984375 L 31.109375 -0.6875 L 29.921875 -0.125 C 28.304688 0.625 26.503906 1.207031 24.515625 1.625 C 23.515625 1.863281 22.460938 2.035156 21.359375 2.140625 C 20.265625 2.242188 19.117188 2.296875 17.921875 2.296875 C 15.390625 2.296875 13.085938 1.882812 11.015625 1.0625 C 8.941406 0.1875 7.175781 -1.054688 5.71875 -2.671875 C 4.269531 -4.242188 3.148438 -6.191406 2.359375 -8.515625 C 1.617188 -10.753906 1.25 -13.304688 1.25 -16.171875 C 1.25 -18.742188 1.617188 -21.148438 2.359375 -23.390625 C 2.773438 -24.503906 3.253906 -25.554688 3.796875 -26.546875 C 4.335938 -27.546875 4.957031 -28.460938 5.65625 -29.296875 C 7.070312 -30.953125 8.773438 -32.257812 10.765625 -33.21875 C 12.753906 -34.164062 14.972656 -34.640625 17.421875 -34.640625 C 18.242188 -34.640625 19.039062 -34.585938 19.8125 -34.484375 C 20.582031 -34.390625 21.328125 -34.25 22.046875 -34.0625 C 22.773438 -33.875 23.472656 -33.632812 24.140625 -33.34375 C 25.128906 -32.882812 26.023438 -32.351562 26.828125 -31.75 C 27.640625 -31.15625 28.378906 -30.460938 29.046875 -29.671875 C 30.335938 -28.140625 31.3125 -26.378906 31.96875 -24.390625 C 32.257812 -23.390625 32.488281 -22.359375 32.65625 -21.296875 C 32.820312 -20.242188 32.90625 -19.175781 32.90625 -18.09375 C 32.90625 -17.8125 32.90625 -17.523438 32.90625 -17.234375 C 32.90625 -16.941406 32.894531 -16.640625 32.875 -16.328125 C 32.851562 -16.015625 32.84375 -15.710938 32.84375 -15.421875 C 32.84375 -15.128906 32.832031 -14.847656 32.8125 -14.578125 C 32.789062 -14.316406 32.757812 -14.039062 32.71875 -13.75 L 32.59375 -12.3125 Z M 17.296875 -26.6875 C 15.304688 -26.6875 13.6875 -26.019531 12.4375 -24.6875 C 11.9375 -24.15625 11.5 -23.492188 11.125 -22.703125 C 10.757812 -21.910156 10.472656 -21 10.265625 -19.96875 L 24.5625 -19.96875 C 24.363281 -21.957031 23.742188 -23.507812 22.703125 -24.625 C 21.421875 -26 19.617188 -26.6875 17.296875 -26.6875 Z M 17.296875 -26.6875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(129.163241, 55.95717)">
<g>
<path d="M 31.28125 -45.09375 L 38.5625 -45.09375 L 38.5625 -16.796875 C 38.5625 -13.890625 38.148438 -11.253906 37.328125 -8.890625 C 36.492188 -6.523438 35.289062 -4.492188 33.71875 -2.796875 C 33.382812 -2.460938 33.039062 -2.148438 32.6875 -1.859375 C 32.332031 -1.578125 31.976562 -1.289062 31.625 -1 C 31.28125 -0.707031 30.910156 -0.445312 30.515625 -0.21875 C 30.117188 0.0078125 29.710938 0.226562 29.296875 0.4375 C 28.878906 0.644531 28.441406 0.832031 27.984375 1 C 25.828125 1.863281 23.425781 2.296875 20.78125 2.296875 C 15.257812 2.296875 10.925781 0.660156 7.78125 -2.609375 C 4.664062 -5.890625 3.109375 -10.535156 3.109375 -16.546875 L 3.109375 -45.09375 L 12.125 -45.09375 L 12.125 -17.484375 C 12.125 -13.617188 12.875 -10.691406 14.375 -8.703125 C 15.03125 -7.796875 15.875 -7.113281 16.90625 -6.65625 C 17.945312 -6.195312 19.238281 -5.96875 20.78125 -5.96875 C 23.800781 -5.96875 26.019531 -6.878906 27.4375 -8.703125 C 28.96875 -10.648438 29.734375 -13.578125 29.734375 -17.484375 L 29.734375 -45.09375 Z M 31.28125 -45.09375 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(170.836098, 55.95717)">
<g>
<path d="M 3.671875 -33.90625 C 4.492188 -33.90625 5.257812 -33.84375 5.96875 -33.71875 C 6.675781 -33.59375 7.347656 -33.394531 7.984375 -33.125 C 8.628906 -32.851562 9.222656 -32.507812 9.765625 -32.09375 C 10.304688 -31.675781 10.765625 -31.179688 11.140625 -30.609375 C 11.835938 -31.304688 12.644531 -31.925781 13.5625 -32.46875 C 13.8125 -32.632812 14.0625 -32.789062 14.3125 -32.9375 C 14.5625 -33.082031 14.828125 -33.21875 15.109375 -33.34375 C 15.398438 -33.46875 15.691406 -33.582031 15.984375 -33.6875 C 16.273438 -33.789062 16.566406 -33.90625 16.859375 -34.03125 C 17.523438 -34.238281 18.207031 -34.390625 18.90625 -34.484375 C 19.613281 -34.585938 20.34375 -34.640625 21.09375 -34.640625 C 23.164062 -34.640625 25.164062 -34.222656 27.09375 -33.390625 C 29.019531 -32.566406 30.707031 -31.367188 32.15625 -29.796875 C 33.613281 -28.222656 34.753906 -26.316406 35.578125 -24.078125 C 35.867188 -23.328125 36.109375 -22.535156 36.296875 -21.703125 C 36.484375 -20.878906 36.628906 -20.03125 36.734375 -19.15625 C 36.835938 -18.289062 36.890625 -17.398438 36.890625 -16.484375 C 36.890625 -13.742188 36.472656 -11.210938 35.640625 -8.890625 C 35.222656 -7.773438 34.734375 -6.71875 34.171875 -5.71875 C 33.617188 -4.726562 32.96875 -3.816406 32.21875 -2.984375 C 31.96875 -2.648438 31.6875 -2.335938 31.375 -2.046875 C 31.070312 -1.765625 30.753906 -1.476562 30.421875 -1.1875 C 30.085938 -0.894531 29.753906 -0.625 29.421875 -0.375 C 29.085938 -0.125 28.734375 0.101562 28.359375 0.3125 C 27.992188 0.519531 27.625 0.707031 27.25 0.875 C 26.289062 1.375 25.300781 1.734375 24.28125 1.953125 C 23.269531 2.179688 22.25 2.296875 21.21875 2.296875 C 19.019531 2.296875 17.003906 1.863281 15.171875 1 C 14.515625 0.707031 13.894531 0.375 13.3125 0 L 13.3125 15.234375 L 4.609375 15.234375 L 4.609375 -24.078125 C 4.609375 -25.023438 4.441406 -25.644531 4.109375 -25.9375 C 3.734375 -26.269531 3.191406 -26.4375 2.484375 -26.4375 L 0.4375 -26.4375 L 1 -28.421875 L 2.171875 -32.78125 L 2.484375 -33.90625 Z M 28.046875 -16.296875 C 28.046875 -17.171875 27.984375 -17.976562 27.859375 -18.71875 C 27.742188 -19.46875 27.570312 -20.160156 27.34375 -20.796875 C 27.113281 -21.441406 26.851562 -22.035156 26.5625 -22.578125 C 26.269531 -23.117188 25.9375 -23.617188 25.5625 -24.078125 C 24.820312 -24.941406 23.960938 -25.59375 22.984375 -26.03125 C 22.003906 -26.46875 20.957031 -26.6875 19.84375 -26.6875 C 19.09375 -26.6875 18.382812 -26.59375 17.71875 -26.40625 C 17.0625 -26.21875 16.441406 -25.9375 15.859375 -25.5625 C 14.785156 -24.894531 13.9375 -24.191406 13.3125 -23.453125 L 13.3125 -8.703125 C 14.1875 -7.921875 15.140625 -7.257812 16.171875 -6.71875 C 17.335938 -6.09375 18.644531 -5.78125 20.09375 -5.78125 C 21.25 -5.78125 22.304688 -6.007812 23.265625 -6.46875 C 24.210938 -6.96875 25.039062 -7.648438 25.75 -8.515625 C 26.125 -8.972656 26.445312 -9.472656 26.71875 -10.015625 C 26.988281 -10.554688 27.226562 -11.15625 27.4375 -11.8125 C 27.644531 -12.476562 27.796875 -13.179688 27.890625 -13.921875 C 27.992188 -14.671875 28.046875 -15.460938 28.046875 -16.296875 Z M 28.046875 -16.296875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(208.963656, 55.95717)">
<g>
<path d="M 7.53125 -42.921875 L 13.375 -42.921875 L 13.375 -32.71875 L 22.328125 -32.71875 L 22.328125 -24.75 L 13.375 -24.75 L 13.375 -10.703125 C 13.375 -9.660156 13.476562 -8.8125 13.6875 -8.15625 C 13.894531 -7.53125 14.144531 -7.050781 14.4375 -6.71875 C 14.71875 -6.382812 15.066406 -6.15625 15.484375 -6.03125 C 15.734375 -5.945312 15.984375 -5.882812 16.234375 -5.84375 C 16.484375 -5.800781 16.734375 -5.78125 16.984375 -5.78125 C 17.847656 -5.78125 18.632812 -5.90625 19.34375 -6.15625 C 20.21875 -6.488281 21.023438 -6.863281 21.765625 -7.28125 L 23.390625 -8.15625 L 24.015625 -6.40625 L 25.5625 -1.921875 L 25.9375 -0.75 L 24.875 -0.125 C 23.96875 0.457031 22.75 1 21.21875 1.5 C 20.425781 1.78125 19.613281 1.984375 18.78125 2.109375 C 17.957031 2.234375 17.128906 2.296875 16.296875 2.296875 C 12.734375 2.296875 9.894531 1.113281 7.78125 -1.25 C 6.695312 -2.445312 5.90625 -3.875 5.40625 -5.53125 C 4.914062 -7.195312 4.671875 -9.066406 4.671875 -11.140625 L 4.671875 -24.75 L -0.9375 -24.75 L -0.9375 -32.71875 L 4.96875 -32.71875 L 5.96875 -41.546875 L 6.15625 -42.921875 Z M 7.53125 -42.921875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(233.656391, 55.95717)">
<g>
<path d="M 10.578125 1.5625 L 3.421875 1.5625 L 3.421875 -33.90625 L 12.125 -33.90625 L 12.125 1.5625 Z M 7.78125 -36.328125 C 6.28125 -36.328125 4.988281 -36.863281 3.90625 -37.9375 C 2.832031 -39.019531 2.296875 -40.304688 2.296875 -41.796875 C 2.296875 -43.410156 2.800781 -44.726562 3.8125 -45.75 C 4.832031 -46.769531 6.15625 -47.28125 7.78125 -47.28125 C 8.519531 -47.28125 9.222656 -47.144531 9.890625 -46.875 C 10.554688 -46.601562 11.144531 -46.207031 11.65625 -45.6875 C 12.175781 -45.164062 12.570312 -44.570312 12.84375 -43.90625 C 13.113281 -43.25 13.25 -42.546875 13.25 -41.796875 C 13.25 -40.179688 12.738281 -38.863281 11.71875 -37.84375 C 10.707031 -36.832031 9.394531 -36.328125 7.78125 -36.328125 Z M 7.78125 -36.328125 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(249.205965, 55.95717)">
<g>
<path d="M 11.9375 -31.109375 C 12.269531 -31.390625 12.59375 -31.65625 12.90625 -31.90625 C 13.21875 -32.15625 13.5625 -32.382812 13.9375 -32.59375 C 14.4375 -32.925781 14.953125 -33.226562 15.484375 -33.5 C 16.023438 -33.769531 16.59375 -33.984375 17.1875 -34.140625 C 17.789062 -34.304688 18.394531 -34.429688 19 -34.515625 C 19.601562 -34.597656 20.238281 -34.640625 20.90625 -34.640625 C 23.800781 -34.640625 26.203125 -33.914062 28.109375 -32.46875 C 29.273438 -31.59375 30.234375 -30.515625 30.984375 -29.234375 C 32.015625 -30.398438 33.113281 -31.4375 34.28125 -32.34375 C 34.6875 -32.632812 35.117188 -32.90625 35.578125 -33.15625 C 36.035156 -33.40625 36.507812 -33.625 37 -33.8125 C 37.5 -34 38.007812 -34.148438 38.53125 -34.265625 C 39.050781 -34.390625 39.578125 -34.484375 40.109375 -34.546875 C 40.648438 -34.609375 41.210938 -34.640625 41.796875 -34.640625 C 42.046875 -34.640625 42.285156 -34.640625 42.515625 -34.640625 C 42.742188 -34.640625 42.972656 -34.628906 43.203125 -34.609375 C 43.429688 -34.585938 43.65625 -34.554688 43.875 -34.515625 C 44.101562 -34.472656 44.320312 -34.429688 44.53125 -34.390625 C 44.738281 -34.359375 44.945312 -34.320312 45.15625 -34.28125 C 45.363281 -34.238281 45.570312 -34.1875 45.78125 -34.125 C 45.988281 -34.0625 46.195312 -33.988281 46.40625 -33.90625 C 46.613281 -33.820312 46.820312 -33.738281 47.03125 -33.65625 C 47.394531 -33.488281 47.753906 -33.300781 48.109375 -33.09375 C 48.460938 -32.882812 48.796875 -32.65625 49.109375 -32.40625 C 49.421875 -32.15625 49.722656 -31.894531 50.015625 -31.625 C 50.304688 -31.351562 50.570312 -31.054688 50.8125 -30.734375 C 51.851562 -29.523438 52.601562 -28.09375 53.0625 -26.4375 C 53.5625 -24.820312 53.8125 -23.039062 53.8125 -21.09375 L 53.8125 1.5625 L 45.09375 1.5625 L 45.09375 -20.65625 C 45.09375 -22.5625 44.679688 -24.070312 43.859375 -25.1875 C 43.109375 -26.144531 42.09375 -26.625 40.8125 -26.625 C 40.0625 -26.625 39.351562 -26.476562 38.6875 -26.1875 C 37.945312 -25.851562 37.242188 -25.414062 36.578125 -24.875 C 35.867188 -24.300781 35.179688 -23.640625 34.515625 -22.890625 C 34.273438 -22.554688 34.007812 -22.203125 33.71875 -21.828125 C 33.425781 -21.460938 33.175781 -21.113281 32.96875 -20.78125 L 32.96875 1.5625 L 24.265625 1.5625 L 24.265625 -20.65625 C 24.265625 -22.5625 23.847656 -24.070312 23.015625 -25.1875 C 22.265625 -26.144531 21.25 -26.625 19.96875 -26.625 C 19.257812 -26.625 18.554688 -26.476562 17.859375 -26.1875 C 17.523438 -26.0625 17.171875 -25.894531 16.796875 -25.6875 C 16.421875 -25.476562 16.066406 -25.226562 15.734375 -24.9375 C 15.609375 -24.851562 15.484375 -24.757812 15.359375 -24.65625 C 15.234375 -24.5625 15.117188 -24.460938 15.015625 -24.359375 C 14.910156 -24.253906 14.796875 -24.148438 14.671875 -24.046875 C 14.554688 -23.941406 14.445312 -23.835938 14.34375 -23.734375 C 14.238281 -23.628906 14.132812 -23.515625 14.03125 -23.390625 C 13.925781 -23.265625 13.8125 -23.140625 13.6875 -23.015625 C 13.4375 -22.679688 13.164062 -22.335938 12.875 -21.984375 C 12.582031 -21.628906 12.332031 -21.289062 12.125 -20.96875 L 12.125 1.5625 L 3.421875 1.5625 L 3.421875 -33.90625 L 11.9375 -33.90625 Z M 11.9375 -31.109375 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(306.117405, 55.95717)">
<g>
<path d="M 10.390625 -12.3125 C 10.847656 -10.488281 11.632812 -9.019531 12.75 -7.90625 C 14.195312 -6.488281 16.144531 -5.78125 18.59375 -5.78125 C 19.175781 -5.78125 19.738281 -5.800781 20.28125 -5.84375 C 20.820312 -5.882812 21.335938 -5.945312 21.828125 -6.03125 C 22.328125 -6.113281 22.804688 -6.21875 23.265625 -6.34375 C 23.722656 -6.46875 24.175781 -6.601562 24.625 -6.75 C 25.082031 -6.894531 25.53125 -7.050781 25.96875 -7.21875 C 26.40625 -7.382812 26.851562 -7.570312 27.3125 -7.78125 L 28.921875 -8.515625 L 29.421875 -6.78125 L 30.734375 -1.984375 L 31.109375 -0.6875 L 29.921875 -0.125 C 28.304688 0.625 26.503906 1.207031 24.515625 1.625 C 23.515625 1.863281 22.460938 2.035156 21.359375 2.140625 C 20.265625 2.242188 19.117188 2.296875 17.921875 2.296875 C 15.390625 2.296875 13.085938 1.882812 11.015625 1.0625 C 8.941406 0.1875 7.175781 -1.054688 5.71875 -2.671875 C 4.269531 -4.242188 3.148438 -6.191406 2.359375 -8.515625 C 1.617188 -10.753906 1.25 -13.304688 1.25 -16.171875 C 1.25 -18.742188 1.617188 -21.148438 2.359375 -23.390625 C 2.773438 -24.503906 3.253906 -25.554688 3.796875 -26.546875 C 4.335938 -27.546875 4.957031 -28.460938 5.65625 -29.296875 C 7.070312 -30.953125 8.773438 -32.257812 10.765625 -33.21875 C 12.753906 -34.164062 14.972656 -34.640625 17.421875 -34.640625 C 18.242188 -34.640625 19.039062 -34.585938 19.8125 -34.484375 C 20.582031 -34.390625 21.328125 -34.25 22.046875 -34.0625 C 22.773438 -33.875 23.472656 -33.632812 24.140625 -33.34375 C 25.128906 -32.882812 26.023438 -32.351562 26.828125 -31.75 C 27.640625 -31.15625 28.378906 -30.460938 29.046875 -29.671875 C 30.335938 -28.140625 31.3125 -26.378906 31.96875 -24.390625 C 32.257812 -23.390625 32.488281 -22.359375 32.65625 -21.296875 C 32.820312 -20.242188 32.90625 -19.175781 32.90625 -18.09375 C 32.90625 -17.8125 32.90625 -17.523438 32.90625 -17.234375 C 32.90625 -16.941406 32.894531 -16.640625 32.875 -16.328125 C 32.851562 -16.015625 32.84375 -15.710938 32.84375 -15.421875 C 32.84375 -15.128906 32.832031 -14.847656 32.8125 -14.578125 C 32.789062 -14.316406 32.757812 -14.039062 32.71875 -13.75 L 32.59375 -12.3125 Z M 17.296875 -26.6875 C 15.304688 -26.6875 13.6875 -26.019531 12.4375 -24.6875 C 11.9375 -24.15625 11.5 -23.492188 11.125 -22.703125 C 10.757812 -21.910156 10.472656 -21 10.265625 -19.96875 L 24.5625 -19.96875 C 24.363281 -21.957031 23.742188 -23.507812 22.703125 -24.625 C 21.421875 -26 19.617188 -26.6875 17.296875 -26.6875 Z M 17.296875 -26.6875 "></path>
</g>
</g>
</g>
</svg>
</a>
</div>
<div class="flex items-center gap-5">
<nav class="hidden md:block">
<ul role="list" class="flex items-center gap-8">
<li><a class="text-sm leading-5 text-zinc-600 transition hover:text-zinc-900 "
<ul role="list" class="flex items-center gap-6">
<li><a class="text-sm font-medium text-slate-600 transition hover:text-slate-900"
href="/">Home</a></li>
<li><a class="text-sm leading-5 text-zinc-600 transition hover:text-zinc-900 "
<li><a class="text-sm font-medium text-slate-600 transition hover:text-slate-900"
target="_blank"
href="https://join.slack.com/t/oneuptimesupport/shared_invite/zt-2pz5p1uhe-Fpmc7bv5ZE5xRMe7qJnwmA">Chat
with us on Slack</a></li>
<li><a class="text-sm leading-5 text-zinc-600 transition hover:text-zinc-900 "
href="https://join.slack.com/t/oneuptimesupport/shared_invite/zt-2pz5p1uhe-Fpmc7bv5ZE5xRMe7qJnwmA">Slack</a></li>
<li><a class="text-sm font-medium text-slate-600 transition hover:text-slate-900"
href="/support">Support</a></li>
<li><a class="text-sm leading-5 text-zinc-600 transition hover:text-zinc-900 "
href="/reference/openapi" type="_blank">OpenAPI Spec</a></li>
<li><a class="text-sm leading-5 text-zinc-600 transition hover:text-zinc-900 "
<li><a class="text-sm font-medium text-slate-600 transition hover:text-slate-900"
href="/reference/openapi" type="_blank">OpenAPI</a></li>
<li><a class="text-sm font-medium text-slate-600 transition hover:text-slate-900"
href="https://github.com/oneuptime/oneuptime">GitHub</a></li>
</ul>
</nav>
<div class="hidden md:block md:h-5 md:w-px md:bg-zinc-900/10 md:"></div>
<div class="hidden md:block md:h-5 md:w-px md:bg-slate-200"></div>
<div class="flex gap-4">
<div class="contents lg:hidden">
<button type="button"
@@ -184,87 +340,287 @@
</button> -->
</div>
<div class="hidden min-[416px]:contents"><a
class="inline-flex gap-0.5 justify-center overflow-hidden text-sm font-medium transition rounded-full bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 "
class="inline-flex gap-0.5 justify-center overflow-hidden text-sm font-medium transition rounded-full bg-indigo-600 py-1.5 px-4 text-white hover:bg-indigo-700 shadow-sm"
href="/dashboard">Sign in</a></div>
</div>
</div>
<nav class="hidden lg:mt-10 lg:block">
<ul role="list">
<nav class="hidden lg:block">
<div class="mb-6">
<span class="inline-flex items-center rounded-full bg-indigo-50 px-3 py-1 text-xs font-semibold text-indigo-700 ring-1 ring-inset ring-indigo-600/20">
API Reference
</span>
</div>
<ul role="list" class="space-y-6">
<li class="md:hidden"><a
class="block py-1 text-sm text-zinc-600 transition hover:text-zinc-900 "
class="block py-1 text-sm text-slate-600 transition hover:text-slate-900"
href="/">API</a></li>
<li class="md:hidden"><a
class="block py-1 text-sm text-zinc-600 transition hover:text-zinc-900 "
class="block py-1 text-sm text-slate-600 transition hover:text-slate-900"
href="/#">Documentation</a></li>
<li class="md:hidden"><a
class="block py-1 text-sm text-zinc-600 transition hover:text-zinc-900 "
class="block py-1 text-sm text-slate-600 transition hover:text-slate-900"
href="/#">Support</a></li>
<li class="relative mt-6 md:mt-0">
<h6 class="text-sm font-semibold text-zinc-900 ">Guides</h6>
<li class="relative md:mt-0">
<h6 class="text-xs font-semibold text-slate-900 uppercase tracking-wide">Guides</h6>
<div class="relative mt-3 pl-2">
<div class="absolute inset-x-0 top-0 bg-zinc-800/2.5 will-change-transform "
data-projection-id="32"
style="height: 64px; top: 0px; border-radius: 8px; opacity: 1; transform: none; transform-origin: 50% 50% 0px;">
</div>
<div class="absolute inset-y-0 left-2 w-px bg-zinc-900/10 "
style="transform: none; transform-origin: 50% 50% 0px;"></div>
<div class="absolute left-2 h-6 w-px bg-emerald-500" data-projection-id="33"
style="top: 4px; opacity: 1;"></div>
<ul role="list" class="border-l border-transparent">
<div class="absolute inset-y-0 left-2 w-px bg-slate-200"></div>
<ul role="list" class="border-l border-transparent space-y-1">
<li class="relative">
<a class="flex justify-between gap-2 py-1 pr-3 text-sm transition pl-4 text-zinc-900 "
href="/reference/introduction" aria-current="page"><span
<a class="nav-link flex justify-between gap-2 py-1.5 pr-3 text-sm transition pl-4 text-slate-600 hover:text-slate-900 -ml-px border-l-2 border-transparent hover:border-slate-300"
href="/reference/introduction"><span
class="truncate">Introduction</span></a>
</li>
<li class="relative" style="transform: none; transform-origin: 50% 50% 0px;"><a
class="flex justify-between gap-2 py-1 pr-3 text-sm transition pl-4 text-zinc-600 hover:text-zinc-900 "
<li class="relative"><a
class="nav-link flex justify-between gap-2 py-1.5 pr-3 text-sm transition pl-4 text-slate-600 hover:text-slate-900 -ml-px border-l-2 border-transparent hover:border-slate-300"
href="/reference/authentication"><span class="truncate">Authentication</span></a></li>
<li class="relative" style="transform: none; transform-origin: 50% 50% 0px;"><a
class="flex justify-between gap-2 py-1 pr-3 text-sm transition pl-4 text-zinc-600 hover:text-zinc-900 "
<li class="relative"><a
class="nav-link flex justify-between gap-2 py-1.5 pr-3 text-sm transition pl-4 text-slate-600 hover:text-slate-900 -ml-px border-l-2 border-transparent hover:border-slate-300"
href="/reference/pagination"><span class="truncate">Pagination</span></a></li>
<li class="relative" style="transform: none; transform-origin: 50% 50% 0px;"><a
class="flex justify-between gap-2 py-1 pr-3 text-sm transition pl-4 text-zinc-600 hover:text-zinc-900 "
<li class="relative"><a
class="nav-link flex justify-between gap-2 py-1.5 pr-3 text-sm transition pl-4 text-slate-600 hover:text-slate-900 -ml-px border-l-2 border-transparent hover:border-slate-300"
href="/reference/permissions"><span class="truncate">Permissions</span></a></li>
<li class="relative" style="transform: none; transform-origin: 50% 50% 0px;"><a
class="flex justify-between gap-2 py-1 pr-3 text-sm transition pl-4 text-zinc-600 hover:text-zinc-900 "
<li class="relative"><a
class="nav-link flex justify-between gap-2 py-1.5 pr-3 text-sm transition pl-4 text-slate-600 hover:text-slate-900 -ml-px border-l-2 border-transparent hover:border-slate-300"
href="/reference/data-types"><span class="truncate">Data Types</span></a></li>
<li class="relative" style="transform: none; transform-origin: 50% 50% 0px;"><a
class="flex justify-between gap-2 py-1 pr-3 text-sm transition pl-4 text-zinc-600 hover:text-zinc-900 "
<li class="relative"><a
class="nav-link flex justify-between gap-2 py-1.5 pr-3 text-sm transition pl-4 text-slate-600 hover:text-slate-900 -ml-px border-l-2 border-transparent hover:border-slate-300"
href="/reference/errors"><span class="truncate">Errors</span></a></li>
<li class="relative" style="transform: none; transform-origin: 50% 50% 0px;"><a
class="flex justify-between gap-2 py-1 pr-3 text-sm transition pl-4 text-zinc-600 hover:text-zinc-900 "
<li class="relative"><a
class="nav-link flex justify-between gap-2 py-1.5 pr-3 text-sm transition pl-4 text-slate-600 hover:text-slate-900 -ml-px border-l-2 border-transparent hover:border-slate-300"
href="/reference/openapi"><span class="truncate">OpenAPI Spec</span></a></li>
</ul>
</div>
</li>
<li class="relative mt-6">
<h6 class="text-sm font-semibold text-zinc-900 "
style="transform: none; transform-origin: 50% 50% 0px;">Resources</h6>
<h6 class="text-xs font-semibold text-slate-900 uppercase tracking-wide">Resources</h6>
<div class="relative mt-3 pl-2">
<div class="absolute inset-y-0 left-2 w-px bg-zinc-900/10 "
style="transform: none; transform-origin: 50% 50% 0px;"></div>
<ul role="list" class="border-l border-transparent">
<div class="absolute inset-y-0 left-2 w-px bg-slate-200"></div>
<ul role="list" class="border-l border-transparent space-y-1">
<% for(var i=0; i<resources.length; i++) {%>
<li class="relative" style="transform: none; transform-origin: 50% 50% 0px;"><a
class="flex justify-between gap-2 py-1 pr-3 text-sm transition pl-4 text-zinc-600 hover:text-zinc-900 "
<li class="relative"><a
class="nav-link flex justify-between gap-2 py-1.5 pr-3 text-sm transition pl-4 text-slate-600 hover:text-slate-900 -ml-px border-l-2 border-transparent hover:border-slate-300"
href="/reference/<%= resources[i].path -%>"><span class="truncate">
<%= resources[i].name -%>
</span></a></li>
<% } %>
<% } %>
</ul>
</div>
</li>
<li class="sticky bottom-0 z-10 mt-6 min-[416px]:hidden"><a
class="inline-flex gap-0.5 justify-center overflow-hidden text-sm font-medium transition rounded-full bg-zinc-900 py-1 px-3 text-white hover:bg-zinc-700 :bg-emerald-400 w-full"
class="inline-flex gap-0.5 justify-center overflow-hidden text-sm font-medium transition rounded-full bg-indigo-600 py-1.5 px-4 text-white hover:bg-indigo-700 shadow-sm w-full"
href="/#">Sign in</a></li>
</ul>
</nav>
</div>
</header>
</header>
<!-- Mobile Navigation Overlay -->
<div id="mobile-menu-overlay" class="fixed inset-0 z-50 bg-slate-900/50 backdrop-blur-sm hidden lg:hidden" aria-hidden="true"></div>
<!-- Mobile Navigation Panel -->
<div id="mobile-menu-panel" class="fixed inset-y-0 left-0 z-50 w-80 max-w-[calc(100%-3rem)] bg-white shadow-2xl transform -translate-x-full transition-transform duration-300 ease-in-out lg:hidden overflow-y-auto">
<div class="p-6">
<div class="flex items-center justify-between mb-8">
<a aria-label="Home" href="/">
<svg class="h-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 375 75" preserveAspectRatio="xMidYMid meet">
<defs>
<g></g>
<clipPath id="mobile-menu-1d83d73318">
<path d="M 351.792969 35.324219 L 367.53125 35.324219 L 367.53125 51.0625 L 351.792969 51.0625 Z M 351.792969 35.324219 " clip-rule="nonzero"></path>
</clipPath>
<clipPath id="mobile-menu-32c1ad7ad2">
<path d="M 366.480469 51.03125 L 352.816406 51.03125 C 352.253906 51.03125 351.792969 50.574219 351.792969 50.007812 L 351.792969 36.347656 C 351.792969 35.785156 352.253906 35.324219 352.816406 35.324219 L 366.480469 35.324219 C 367.042969 35.324219 367.5 35.785156 367.5 36.347656 L 367.5 50.007812 C 367.5 50.574219 367.042969 51.03125 366.480469 51.03125 " clip-rule="nonzero"></path>
</clipPath>
</defs>
<g clip-path="url(#mobile-menu-1d83d73318)">
<g clip-path="url(#mobile-menu-32c1ad7ad2)">
<path fill="#7ed957" d="M 351.792969 35.324219 L 367.53125 35.324219 L 367.53125 51.0625 L 351.792969 51.0625 Z M 351.792969 35.324219 " fill-opacity="1" fill-rule="nonzero"></path>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(11.173064, 55.95717)">
<g>
<path d="M 1.5625 -21.828125 C 1.5625 -25.191406 2.054688 -28.320312 3.046875 -31.21875 C 4.046875 -34.164062 5.5 -36.71875 7.40625 -38.875 C 9.3125 -41.070312 11.632812 -42.773438 14.375 -43.984375 C 15.738281 -44.597656 17.195312 -45.0625 18.75 -45.375 C 20.3125 -45.6875 21.941406 -45.84375 23.640625 -45.84375 C 25.335938 -45.84375 26.960938 -45.6875 28.515625 -45.375 C 30.078125 -45.0625 31.539062 -44.578125 32.90625 -43.921875 C 34.269531 -43.296875 35.53125 -42.546875 36.6875 -41.671875 C 37.851562 -40.804688 38.914062 -39.8125 39.875 -38.6875 C 41.78125 -36.53125 43.25 -34.003906 44.28125 -31.109375 C 45.28125 -28.203125 45.78125 -25.109375 45.78125 -21.828125 C 45.78125 -18.554688 45.28125 -15.46875 44.28125 -12.5625 C 43.957031 -11.613281 43.578125 -10.679688 43.140625 -9.765625 C 42.703125 -8.847656 42.210938 -7.984375 41.671875 -7.171875 C 41.140625 -6.367188 40.5625 -5.597656 39.9375 -4.859375 C 38.976562 -3.734375 37.90625 -2.734375 36.71875 -1.859375 C 35.539062 -0.992188 34.289062 -0.25 32.96875 0.375 C 30.226562 1.65625 27.113281 2.296875 23.625 2.296875 C 20.144531 2.296875 17.039062 1.65625 14.3125 0.375 C 13.644531 0.0390625 13 -0.3125 12.375 -0.6875 C 11.757812 -1.0625 11.160156 -1.460938 10.578125 -1.890625 C 9.992188 -2.328125 9.429688 -2.796875 8.890625 -3.296875 C 8.359375 -3.796875 7.863281 -4.316406 7.40625 -4.859375 C 5.5 -7.054688 4.046875 -9.625 3.046875 -12.5625 C 2.054688 -15.46875 1.5625 -18.554688 1.5625 -21.828125 Z M 10.703125 -21.828125 C 10.703125 -20.796875 10.773438 -19.769531 10.921875 -18.75 C 11.066406 -17.738281 11.28125 -16.734375 11.5625 -15.734375 C 11.894531 -14.785156 12.269531 -13.882812 12.6875 -13.03125 C 13.101562 -12.175781 13.601562 -11.378906 14.1875 -10.640625 C 14.351562 -10.390625 14.535156 -10.160156 14.734375 -9.953125 C 14.941406 -9.742188 15.148438 -9.535156 15.359375 -9.328125 C 15.566406 -9.117188 15.785156 -8.910156 16.015625 -8.703125 C 16.242188 -8.492188 16.484375 -8.304688 16.734375 -8.140625 C 16.984375 -7.984375 17.234375 -7.820312 17.484375 -7.65625 C 17.734375 -7.488281 17.976562 -7.320312 18.21875 -7.15625 C 19.800781 -6.320312 21.609375 -5.90625 23.640625 -5.90625 C 24.378906 -5.90625 25.082031 -5.945312 25.75 -6.03125 C 26.414062 -6.113281 27.035156 -6.25 27.609375 -6.4375 C 28.191406 -6.625 28.734375 -6.84375 29.234375 -7.09375 C 30.847656 -7.875 32.195312 -8.953125 33.28125 -10.328125 C 33.65625 -10.785156 33.984375 -11.269531 34.265625 -11.78125 C 34.554688 -12.300781 34.828125 -12.863281 35.078125 -13.46875 C 35.328125 -14.070312 35.554688 -14.679688 35.765625 -15.296875 C 36.347656 -17.328125 36.640625 -19.503906 36.640625 -21.828125 C 36.640625 -23.898438 36.328125 -25.894531 35.703125 -27.8125 C 35.117188 -29.71875 34.25 -31.414062 33.09375 -32.90625 C 31.96875 -34.351562 30.617188 -35.515625 29.046875 -36.390625 C 27.472656 -37.222656 25.671875 -37.640625 23.640625 -37.640625 C 23.140625 -37.640625 22.640625 -37.617188 22.140625 -37.578125 C 21.640625 -37.535156 21.160156 -37.460938 20.703125 -37.359375 C 20.253906 -37.253906 19.820312 -37.128906 19.40625 -36.984375 C 18.988281 -36.835938 18.59375 -36.660156 18.21875 -36.453125 C 17.394531 -36.078125 16.648438 -35.617188 15.984375 -35.078125 C 15.316406 -34.546875 14.71875 -33.925781 14.1875 -33.21875 C 13.0625 -31.8125 12.1875 -30.148438 11.5625 -28.234375 C 10.988281 -26.242188 10.703125 -24.109375 10.703125 -21.828125 Z M 10.703125 -21.828125 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(58.505968, 55.95717)">
<g>
<path d="M 11.9375 -31.046875 C 12.269531 -31.367188 12.601562 -31.65625 12.9375 -31.90625 C 13.269531 -32.15625 13.625 -32.382812 14 -32.59375 C 16.070312 -33.957031 18.5 -34.640625 21.28125 -34.640625 C 23.3125 -34.640625 25.113281 -34.316406 26.6875 -33.671875 C 28.257812 -33.035156 29.585938 -32.078125 30.671875 -30.796875 C 32.703125 -28.304688 33.71875 -25.070312 33.71875 -21.09375 L 33.71875 1.5625 L 25 1.5625 L 25 -20.46875 C 25 -21.164062 24.945312 -21.804688 24.84375 -22.390625 C 24.738281 -22.972656 24.59375 -23.488281 24.40625 -23.9375 C 24.226562 -24.394531 23.992188 -24.789062 23.703125 -25.125 C 23.453125 -25.457031 23.171875 -25.738281 22.859375 -25.96875 C 22.546875 -26.195312 22.179688 -26.363281 21.765625 -26.46875 C 21.359375 -26.570312 20.882812 -26.625 20.34375 -26.625 C 19.59375 -26.625 18.84375 -26.476562 18.09375 -26.1875 C 17.3125 -25.894531 16.546875 -25.476562 15.796875 -24.9375 C 15.054688 -24.363281 14.351562 -23.722656 13.6875 -23.015625 C 13.4375 -22.679688 13.164062 -22.335938 12.875 -21.984375 C 12.582031 -21.628906 12.332031 -21.289062 12.125 -20.96875 L 12.125 1.5625 L 3.421875 1.5625 L 3.421875 -33.90625 L 11.9375 -33.90625 Z M 11.9375 -31.046875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(95.327364, 55.95717)">
<g>
<path d="M 10.390625 -12.3125 C 10.847656 -10.488281 11.632812 -9.019531 12.75 -7.90625 C 14.195312 -6.488281 16.144531 -5.78125 18.59375 -5.78125 C 19.175781 -5.78125 19.738281 -5.800781 20.28125 -5.84375 C 20.820312 -5.882812 21.335938 -5.945312 21.828125 -6.03125 C 22.328125 -6.113281 22.804688 -6.21875 23.265625 -6.34375 C 23.722656 -6.46875 24.175781 -6.601562 24.625 -6.75 C 25.082031 -6.894531 25.53125 -7.050781 25.96875 -7.21875 C 26.40625 -7.382812 26.851562 -7.570312 27.3125 -7.78125 L 28.921875 -8.515625 L 29.421875 -6.78125 L 30.734375 -1.984375 L 31.109375 -0.6875 L 29.921875 -0.125 C 28.304688 0.625 26.503906 1.207031 24.515625 1.625 C 23.515625 1.863281 22.460938 2.035156 21.359375 2.140625 C 20.265625 2.242188 19.117188 2.296875 17.921875 2.296875 C 15.390625 2.296875 13.085938 1.882812 11.015625 1.0625 C 8.941406 0.1875 7.175781 -1.054688 5.71875 -2.671875 C 4.269531 -4.242188 3.148438 -6.191406 2.359375 -8.515625 C 1.617188 -10.753906 1.25 -13.304688 1.25 -16.171875 C 1.25 -18.742188 1.617188 -21.148438 2.359375 -23.390625 C 2.773438 -24.503906 3.253906 -25.554688 3.796875 -26.546875 C 4.335938 -27.546875 4.957031 -28.460938 5.65625 -29.296875 C 7.070312 -30.953125 8.773438 -32.257812 10.765625 -33.21875 C 12.753906 -34.164062 14.972656 -34.640625 17.421875 -34.640625 C 18.242188 -34.640625 19.039062 -34.585938 19.8125 -34.484375 C 20.582031 -34.390625 21.328125 -34.25 22.046875 -34.0625 C 22.773438 -33.875 23.472656 -33.632812 24.140625 -33.34375 C 25.128906 -32.882812 26.023438 -32.351562 26.828125 -31.75 C 27.640625 -31.15625 28.378906 -30.460938 29.046875 -29.671875 C 30.335938 -28.140625 31.3125 -26.378906 31.96875 -24.390625 C 32.257812 -23.390625 32.488281 -22.359375 32.65625 -21.296875 C 32.820312 -20.242188 32.90625 -19.175781 32.90625 -18.09375 C 32.90625 -17.8125 32.90625 -17.523438 32.90625 -17.234375 C 32.90625 -16.941406 32.894531 -16.640625 32.875 -16.328125 C 32.851562 -16.015625 32.84375 -15.710938 32.84375 -15.421875 C 32.84375 -15.128906 32.832031 -14.847656 32.8125 -14.578125 C 32.789062 -14.316406 32.757812 -14.039062 32.71875 -13.75 L 32.59375 -12.3125 Z M 17.296875 -26.6875 C 15.304688 -26.6875 13.6875 -26.019531 12.4375 -24.6875 C 11.9375 -24.15625 11.5 -23.492188 11.125 -22.703125 C 10.757812 -21.910156 10.472656 -21 10.265625 -19.96875 L 24.5625 -19.96875 C 24.363281 -21.957031 23.742188 -23.507812 22.703125 -24.625 C 21.421875 -26 19.617188 -26.6875 17.296875 -26.6875 Z M 17.296875 -26.6875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(129.163241, 55.95717)">
<g>
<path d="M 31.28125 -45.09375 L 38.5625 -45.09375 L 38.5625 -16.796875 C 38.5625 -13.890625 38.148438 -11.253906 37.328125 -8.890625 C 36.492188 -6.523438 35.289062 -4.492188 33.71875 -2.796875 C 33.382812 -2.460938 33.039062 -2.148438 32.6875 -1.859375 C 32.332031 -1.578125 31.976562 -1.289062 31.625 -1 C 31.28125 -0.707031 30.910156 -0.445312 30.515625 -0.21875 C 30.117188 0.0078125 29.710938 0.226562 29.296875 0.4375 C 28.878906 0.644531 28.441406 0.832031 27.984375 1 C 25.828125 1.863281 23.425781 2.296875 20.78125 2.296875 C 15.257812 2.296875 10.925781 0.660156 7.78125 -2.609375 C 4.664062 -5.890625 3.109375 -10.535156 3.109375 -16.546875 L 3.109375 -45.09375 L 12.125 -45.09375 L 12.125 -17.484375 C 12.125 -13.617188 12.875 -10.691406 14.375 -8.703125 C 15.03125 -7.796875 15.875 -7.113281 16.90625 -6.65625 C 17.945312 -6.195312 19.238281 -5.96875 20.78125 -5.96875 C 23.800781 -5.96875 26.019531 -6.878906 27.4375 -8.703125 C 28.96875 -10.648438 29.734375 -13.578125 29.734375 -17.484375 L 29.734375 -45.09375 Z M 31.28125 -45.09375 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(170.836098, 55.95717)">
<g>
<path d="M 3.671875 -33.90625 C 4.492188 -33.90625 5.257812 -33.84375 5.96875 -33.71875 C 6.675781 -33.59375 7.347656 -33.394531 7.984375 -33.125 C 8.628906 -32.851562 9.222656 -32.507812 9.765625 -32.09375 C 10.304688 -31.675781 10.765625 -31.179688 11.140625 -30.609375 C 11.835938 -31.304688 12.644531 -31.925781 13.5625 -32.46875 C 13.8125 -32.632812 14.0625 -32.789062 14.3125 -32.9375 C 14.5625 -33.082031 14.828125 -33.21875 15.109375 -33.34375 C 15.398438 -33.46875 15.691406 -33.582031 15.984375 -33.6875 C 16.273438 -33.789062 16.566406 -33.90625 16.859375 -34.03125 C 17.523438 -34.238281 18.207031 -34.390625 18.90625 -34.484375 C 19.613281 -34.585938 20.34375 -34.640625 21.09375 -34.640625 C 23.164062 -34.640625 25.164062 -34.222656 27.09375 -33.390625 C 29.019531 -32.566406 30.707031 -31.367188 32.15625 -29.796875 C 33.613281 -28.222656 34.753906 -26.316406 35.578125 -24.078125 C 35.867188 -23.328125 36.109375 -22.535156 36.296875 -21.703125 C 36.484375 -20.878906 36.628906 -20.03125 36.734375 -19.15625 C 36.835938 -18.289062 36.890625 -17.398438 36.890625 -16.484375 C 36.890625 -13.742188 36.472656 -11.210938 35.640625 -8.890625 C 35.222656 -7.773438 34.734375 -6.71875 34.171875 -5.71875 C 33.617188 -4.726562 32.96875 -3.816406 32.21875 -2.984375 C 31.96875 -2.648438 31.6875 -2.335938 31.375 -2.046875 C 31.070312 -1.765625 30.753906 -1.476562 30.421875 -1.1875 C 30.085938 -0.894531 29.753906 -0.625 29.421875 -0.375 C 29.085938 -0.125 28.734375 0.101562 28.359375 0.3125 C 27.992188 0.519531 27.625 0.707031 27.25 0.875 C 26.289062 1.375 25.300781 1.734375 24.28125 1.953125 C 23.269531 2.179688 22.25 2.296875 21.21875 2.296875 C 19.019531 2.296875 17.003906 1.863281 15.171875 1 C 14.515625 0.707031 13.894531 0.375 13.3125 0 L 13.3125 15.234375 L 4.609375 15.234375 L 4.609375 -24.078125 C 4.609375 -25.023438 4.441406 -25.644531 4.109375 -25.9375 C 3.734375 -26.269531 3.191406 -26.4375 2.484375 -26.4375 L 0.4375 -26.4375 L 1 -28.421875 L 2.171875 -32.78125 L 2.484375 -33.90625 Z M 28.046875 -16.296875 C 28.046875 -17.171875 27.984375 -17.976562 27.859375 -18.71875 C 27.742188 -19.46875 27.570312 -20.160156 27.34375 -20.796875 C 27.113281 -21.441406 26.851562 -22.035156 26.5625 -22.578125 C 26.269531 -23.117188 25.9375 -23.617188 25.5625 -24.078125 C 24.820312 -24.941406 23.960938 -25.59375 22.984375 -26.03125 C 22.003906 -26.46875 20.957031 -26.6875 19.84375 -26.6875 C 19.09375 -26.6875 18.382812 -26.59375 17.71875 -26.40625 C 17.0625 -26.21875 16.441406 -25.9375 15.859375 -25.5625 C 14.785156 -24.894531 13.9375 -24.191406 13.3125 -23.453125 L 13.3125 -8.703125 C 14.1875 -7.921875 15.140625 -7.257812 16.171875 -6.71875 C 17.335938 -6.09375 18.644531 -5.78125 20.09375 -5.78125 C 21.25 -5.78125 22.304688 -6.007812 23.265625 -6.46875 C 24.210938 -6.96875 25.039062 -7.648438 25.75 -8.515625 C 26.125 -8.972656 26.445312 -9.472656 26.71875 -10.015625 C 26.988281 -10.554688 27.226562 -11.15625 27.4375 -11.8125 C 27.644531 -12.476562 27.796875 -13.179688 27.890625 -13.921875 C 27.992188 -14.671875 28.046875 -15.460938 28.046875 -16.296875 Z M 28.046875 -16.296875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(208.963656, 55.95717)">
<g>
<path d="M 7.53125 -42.921875 L 13.375 -42.921875 L 13.375 -32.71875 L 22.328125 -32.71875 L 22.328125 -24.75 L 13.375 -24.75 L 13.375 -10.703125 C 13.375 -9.660156 13.476562 -8.8125 13.6875 -8.15625 C 13.894531 -7.53125 14.144531 -7.050781 14.4375 -6.71875 C 14.71875 -6.382812 15.066406 -6.15625 15.484375 -6.03125 C 15.734375 -5.945312 15.984375 -5.882812 16.234375 -5.84375 C 16.484375 -5.800781 16.734375 -5.78125 16.984375 -5.78125 C 17.847656 -5.78125 18.632812 -5.90625 19.34375 -6.15625 C 20.21875 -6.488281 21.023438 -6.863281 21.765625 -7.28125 L 23.390625 -8.15625 L 24.015625 -6.40625 L 25.5625 -1.921875 L 25.9375 -0.75 L 24.875 -0.125 C 23.96875 0.457031 22.75 1 21.21875 1.5 C 20.425781 1.78125 19.613281 1.984375 18.78125 2.109375 C 17.957031 2.234375 17.128906 2.296875 16.296875 2.296875 C 12.734375 2.296875 9.894531 1.113281 7.78125 -1.25 C 6.695312 -2.445312 5.90625 -3.875 5.40625 -5.53125 C 4.914062 -7.195312 4.671875 -9.066406 4.671875 -11.140625 L 4.671875 -24.75 L -0.9375 -24.75 L -0.9375 -32.71875 L 4.96875 -32.71875 L 5.96875 -41.546875 L 6.15625 -42.921875 Z M 7.53125 -42.921875 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(233.656391, 55.95717)">
<g>
<path d="M 10.578125 1.5625 L 3.421875 1.5625 L 3.421875 -33.90625 L 12.125 -33.90625 L 12.125 1.5625 Z M 7.78125 -36.328125 C 6.28125 -36.328125 4.988281 -36.863281 3.90625 -37.9375 C 2.832031 -39.019531 2.296875 -40.304688 2.296875 -41.796875 C 2.296875 -43.410156 2.800781 -44.726562 3.8125 -45.75 C 4.832031 -46.769531 6.15625 -47.28125 7.78125 -47.28125 C 8.519531 -47.28125 9.222656 -47.144531 9.890625 -46.875 C 10.554688 -46.601562 11.144531 -46.207031 11.65625 -45.6875 C 12.175781 -45.164062 12.570312 -44.570312 12.84375 -43.90625 C 13.113281 -43.25 13.25 -42.546875 13.25 -41.796875 C 13.25 -40.179688 12.738281 -38.863281 11.71875 -37.84375 C 10.707031 -36.832031 9.394531 -36.328125 7.78125 -36.328125 Z M 7.78125 -36.328125 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(249.205965, 55.95717)">
<g>
<path d="M 11.9375 -31.109375 C 12.269531 -31.390625 12.59375 -31.65625 12.90625 -31.90625 C 13.21875 -32.15625 13.5625 -32.382812 13.9375 -32.59375 C 14.4375 -32.925781 14.953125 -33.226562 15.484375 -33.5 C 16.023438 -33.769531 16.59375 -33.984375 17.1875 -34.140625 C 17.789062 -34.304688 18.394531 -34.429688 19 -34.515625 C 19.601562 -34.597656 20.238281 -34.640625 20.90625 -34.640625 C 23.800781 -34.640625 26.203125 -33.914062 28.109375 -32.46875 C 29.273438 -31.59375 30.234375 -30.515625 30.984375 -29.234375 C 32.015625 -30.398438 33.113281 -31.4375 34.28125 -32.34375 C 34.6875 -32.632812 35.117188 -32.90625 35.578125 -33.15625 C 36.035156 -33.40625 36.507812 -33.625 37 -33.8125 C 37.5 -34 38.007812 -34.148438 38.53125 -34.265625 C 39.050781 -34.390625 39.578125 -34.484375 40.109375 -34.546875 C 40.648438 -34.609375 41.210938 -34.640625 41.796875 -34.640625 C 42.046875 -34.640625 42.285156 -34.640625 42.515625 -34.640625 C 42.742188 -34.640625 42.972656 -34.628906 43.203125 -34.609375 C 43.429688 -34.585938 43.65625 -34.554688 43.875 -34.515625 C 44.101562 -34.472656 44.320312 -34.429688 44.53125 -34.390625 C 44.738281 -34.359375 44.945312 -34.320312 45.15625 -34.28125 C 45.363281 -34.238281 45.570312 -34.1875 45.78125 -34.125 C 45.988281 -34.0625 46.195312 -33.988281 46.40625 -33.90625 C 46.613281 -33.820312 46.820312 -33.738281 47.03125 -33.65625 C 47.394531 -33.488281 47.753906 -33.300781 48.109375 -33.09375 C 48.460938 -32.882812 48.796875 -32.65625 49.109375 -32.40625 C 49.421875 -32.15625 49.722656 -31.894531 50.015625 -31.625 C 50.304688 -31.351562 50.570312 -31.054688 50.8125 -30.734375 C 51.851562 -29.523438 52.601562 -28.09375 53.0625 -26.4375 C 53.5625 -24.820312 53.8125 -23.039062 53.8125 -21.09375 L 53.8125 1.5625 L 45.09375 1.5625 L 45.09375 -20.65625 C 45.09375 -22.5625 44.679688 -24.070312 43.859375 -25.1875 C 43.109375 -26.144531 42.09375 -26.625 40.8125 -26.625 C 40.0625 -26.625 39.351562 -26.476562 38.6875 -26.1875 C 37.945312 -25.851562 37.242188 -25.414062 36.578125 -24.875 C 35.867188 -24.300781 35.179688 -23.640625 34.515625 -22.890625 C 34.273438 -22.554688 34.007812 -22.203125 33.71875 -21.828125 C 33.425781 -21.460938 33.175781 -21.113281 32.96875 -20.78125 L 32.96875 1.5625 L 24.265625 1.5625 L 24.265625 -20.65625 C 24.265625 -22.5625 23.847656 -24.070312 23.015625 -25.1875 C 22.265625 -26.144531 21.25 -26.625 19.96875 -26.625 C 19.257812 -26.625 18.554688 -26.476562 17.859375 -26.1875 C 17.523438 -26.0625 17.171875 -25.894531 16.796875 -25.6875 C 16.421875 -25.476562 16.066406 -25.226562 15.734375 -24.9375 C 15.609375 -24.851562 15.484375 -24.757812 15.359375 -24.65625 C 15.234375 -24.5625 15.117188 -24.460938 15.015625 -24.359375 C 14.910156 -24.253906 14.796875 -24.148438 14.671875 -24.046875 C 14.554688 -23.941406 14.445312 -23.835938 14.34375 -23.734375 C 14.238281 -23.628906 14.132812 -23.515625 14.03125 -23.390625 C 13.925781 -23.265625 13.8125 -23.140625 13.6875 -23.015625 C 13.4375 -22.679688 13.164062 -22.335938 12.875 -21.984375 C 12.582031 -21.628906 12.332031 -21.289062 12.125 -20.96875 L 12.125 1.5625 L 3.421875 1.5625 L 3.421875 -33.90625 L 11.9375 -33.90625 Z M 11.9375 -31.109375 "></path>
</g>
</g>
</g>
<g fill="#121212" fill-opacity="1">
<g transform="translate(306.117405, 55.95717)">
<g>
<path d="M 10.390625 -12.3125 C 10.847656 -10.488281 11.632812 -9.019531 12.75 -7.90625 C 14.195312 -6.488281 16.144531 -5.78125 18.59375 -5.78125 C 19.175781 -5.78125 19.738281 -5.800781 20.28125 -5.84375 C 20.820312 -5.882812 21.335938 -5.945312 21.828125 -6.03125 C 22.328125 -6.113281 22.804688 -6.21875 23.265625 -6.34375 C 23.722656 -6.46875 24.175781 -6.601562 24.625 -6.75 C 25.082031 -6.894531 25.53125 -7.050781 25.96875 -7.21875 C 26.40625 -7.382812 26.851562 -7.570312 27.3125 -7.78125 L 28.921875 -8.515625 L 29.421875 -6.78125 L 30.734375 -1.984375 L 31.109375 -0.6875 L 29.921875 -0.125 C 28.304688 0.625 26.503906 1.207031 24.515625 1.625 C 23.515625 1.863281 22.460938 2.035156 21.359375 2.140625 C 20.265625 2.242188 19.117188 2.296875 17.921875 2.296875 C 15.390625 2.296875 13.085938 1.882812 11.015625 1.0625 C 8.941406 0.1875 7.175781 -1.054688 5.71875 -2.671875 C 4.269531 -4.242188 3.148438 -6.191406 2.359375 -8.515625 C 1.617188 -10.753906 1.25 -13.304688 1.25 -16.171875 C 1.25 -18.742188 1.617188 -21.148438 2.359375 -23.390625 C 2.773438 -24.503906 3.253906 -25.554688 3.796875 -26.546875 C 4.335938 -27.546875 4.957031 -28.460938 5.65625 -29.296875 C 7.070312 -30.953125 8.773438 -32.257812 10.765625 -33.21875 C 12.753906 -34.164062 14.972656 -34.640625 17.421875 -34.640625 C 18.242188 -34.640625 19.039062 -34.585938 19.8125 -34.484375 C 20.582031 -34.390625 21.328125 -34.25 22.046875 -34.0625 C 22.773438 -33.875 23.472656 -33.632812 24.140625 -33.34375 C 25.128906 -32.882812 26.023438 -32.351562 26.828125 -31.75 C 27.640625 -31.15625 28.378906 -30.460938 29.046875 -29.671875 C 30.335938 -28.140625 31.3125 -26.378906 31.96875 -24.390625 C 32.257812 -23.390625 32.488281 -22.359375 32.65625 -21.296875 C 32.820312 -20.242188 32.90625 -19.175781 32.90625 -18.09375 C 32.90625 -17.8125 32.90625 -17.523438 32.90625 -17.234375 C 32.90625 -16.941406 32.894531 -16.640625 32.875 -16.328125 C 32.851562 -16.015625 32.84375 -15.710938 32.84375 -15.421875 C 32.84375 -15.128906 32.832031 -14.847656 32.8125 -14.578125 C 32.789062 -14.316406 32.757812 -14.039062 32.71875 -13.75 L 32.59375 -12.3125 Z M 17.296875 -26.6875 C 15.304688 -26.6875 13.6875 -26.019531 12.4375 -24.6875 C 11.9375 -24.15625 11.5 -23.492188 11.125 -22.703125 C 10.757812 -21.910156 10.472656 -21 10.265625 -19.96875 L 24.5625 -19.96875 C 24.363281 -21.957031 23.742188 -23.507812 22.703125 -24.625 C 21.421875 -26 19.617188 -26.6875 17.296875 -26.6875 Z M 17.296875 -26.6875 "></path>
</g>
</g>
</g>
</svg>
</a>
<button type="button" id="mobile-menu-close" class="flex h-8 w-8 items-center justify-center rounded-lg hover:bg-slate-100 transition">
<svg class="w-5 h-5 text-slate-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
</svg>
</button>
</div>
<div class="mb-6">
<span class="inline-flex items-center rounded-full bg-indigo-50 px-3 py-1 text-xs font-semibold text-indigo-700 ring-1 ring-inset ring-indigo-600/20">
API Reference
</span>
</div>
<nav>
<ul role="list" class="space-y-6">
<li class="relative">
<h6 class="text-xs font-semibold text-slate-900 uppercase tracking-wide mb-3">Guides</h6>
<ul role="list" class="space-y-1 border-l border-slate-200 ml-2">
<li><a class="mobile-nav-link block py-2 pl-4 text-sm text-slate-600 hover:text-slate-900 border-l-2 border-transparent hover:border-slate-300 -ml-px transition" href="/reference/introduction">Introduction</a></li>
<li><a class="mobile-nav-link block py-2 pl-4 text-sm text-slate-600 hover:text-slate-900 border-l-2 border-transparent hover:border-slate-300 -ml-px transition" href="/reference/authentication">Authentication</a></li>
<li><a class="mobile-nav-link block py-2 pl-4 text-sm text-slate-600 hover:text-slate-900 border-l-2 border-transparent hover:border-slate-300 -ml-px transition" href="/reference/pagination">Pagination</a></li>
<li><a class="mobile-nav-link block py-2 pl-4 text-sm text-slate-600 hover:text-slate-900 border-l-2 border-transparent hover:border-slate-300 -ml-px transition" href="/reference/permissions">Permissions</a></li>
<li><a class="mobile-nav-link block py-2 pl-4 text-sm text-slate-600 hover:text-slate-900 border-l-2 border-transparent hover:border-slate-300 -ml-px transition" href="/reference/data-types">Data Types</a></li>
<li><a class="mobile-nav-link block py-2 pl-4 text-sm text-slate-600 hover:text-slate-900 border-l-2 border-transparent hover:border-slate-300 -ml-px transition" href="/reference/errors">Errors</a></li>
<li><a class="mobile-nav-link block py-2 pl-4 text-sm text-slate-600 hover:text-slate-900 border-l-2 border-transparent hover:border-slate-300 -ml-px transition" href="/reference/openapi">OpenAPI Spec</a></li>
</ul>
</li>
<li class="relative">
<h6 class="text-xs font-semibold text-slate-900 uppercase tracking-wide mb-3">Resources</h6>
<ul role="list" class="space-y-1 border-l border-slate-200 ml-2">
<% for(var i=0; i<resources.length; i++) {%>
<li><a class="mobile-nav-link block py-2 pl-4 text-sm text-slate-600 hover:text-slate-900 border-l-2 border-transparent hover:border-slate-300 -ml-px transition truncate" href="/reference/<%= resources[i].path -%>"><%= resources[i].name -%></a></li>
<% } %>
</ul>
</li>
</ul>
</nav>
<div class="mt-8 pt-6 border-t border-slate-200">
<a href="/dashboard" class="flex items-center justify-center w-full rounded-lg bg-indigo-600 px-4 py-2.5 text-sm font-semibold text-white hover:bg-indigo-700 transition shadow-sm">
Sign in
</a>
</div>
</div>
</div>
<script>
// Highlight active navigation link
document.addEventListener('DOMContentLoaded', function() {
const currentPath = window.location.pathname;
const navLinks = document.querySelectorAll('.nav-link');
const mobileNavLinks = document.querySelectorAll('.mobile-nav-link');
navLinks.forEach(function(link) {
const href = link.getAttribute('href');
if (href === currentPath) {
link.classList.remove('text-slate-600', 'border-transparent', 'hover:border-slate-300');
link.classList.add('text-slate-900', 'font-medium', 'border-indigo-500');
link.setAttribute('aria-current', 'page');
}
});
mobileNavLinks.forEach(function(link) {
const href = link.getAttribute('href');
if (href === currentPath) {
link.classList.remove('text-slate-600', 'border-transparent', 'hover:border-slate-300');
link.classList.add('text-slate-900', 'font-medium', 'border-indigo-500');
link.setAttribute('aria-current', 'page');
}
});
// Mobile menu toggle functionality
const menuToggle = document.getElementById('mobile-menu-toggle');
const menuClose = document.getElementById('mobile-menu-close');
const menuOverlay = document.getElementById('mobile-menu-overlay');
const menuPanel = document.getElementById('mobile-menu-panel');
const menuOpenIcon = document.getElementById('menu-open-icon');
const menuCloseIcon = document.getElementById('menu-close-icon');
function openMenu() {
menuOverlay.classList.remove('hidden');
menuPanel.classList.remove('-translate-x-full');
menuOpenIcon.classList.add('hidden');
menuCloseIcon.classList.remove('hidden');
document.body.style.overflow = 'hidden';
}
function closeMenu() {
menuOverlay.classList.add('hidden');
menuPanel.classList.add('-translate-x-full');
menuOpenIcon.classList.remove('hidden');
menuCloseIcon.classList.add('hidden');
document.body.style.overflow = '';
}
if (menuToggle) {
menuToggle.addEventListener('click', function() {
const isOpen = !menuPanel.classList.contains('-translate-x-full');
if (isOpen) {
closeMenu();
} else {
openMenu();
}
});
}
if (menuClose) {
menuClose.addEventListener('click', closeMenu);
}
if (menuOverlay) {
menuOverlay.addEventListener('click', closeMenu);
}
// Close menu on escape key
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && !menuPanel.classList.contains('-translate-x-full')) {
closeMenu();
}
});
});
</script>

View File

@@ -7,8 +7,8 @@ FROM public.ecr.aws/docker/library/node:24.9-alpine3.21
RUN mkdir /tmp/npm && chmod 2777 /tmp/npm && chown 1000:1000 /tmp/npm && npm config set cache /tmp/npm --global
RUN npm config set fetch-retries 5
RUN npm config set fetch-retry-mintimeout 100000
RUN npm config set fetch-retry-maxtimeout 600000
RUN npm config set fetch-retry-mintimeout 20000
RUN npm config set fetch-retry-maxtimeout 60000

View File

@@ -12,7 +12,7 @@
"ejs": "^3.1.10",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.30.1",
"react-router-dom": "^6.30.2",
"use-async-effect": "^2.2.7"
},
"devDependencies": {
@@ -348,9 +348,9 @@
}
},
"node_modules/@remix-run/router": {
"version": "1.23.0",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz",
"integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==",
"version": "1.23.1",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.1.tgz",
"integrity": "sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ==",
"license": "MIT",
"engines": {
"node": ">=14.0.0"
@@ -966,12 +966,12 @@
}
},
"node_modules/react-router": {
"version": "6.30.1",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz",
"integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==",
"version": "6.30.2",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.2.tgz",
"integrity": "sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA==",
"license": "MIT",
"dependencies": {
"@remix-run/router": "1.23.0"
"@remix-run/router": "1.23.1"
},
"engines": {
"node": ">=14.0.0"
@@ -981,13 +981,13 @@
}
},
"node_modules/react-router-dom": {
"version": "6.30.1",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz",
"integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==",
"version": "6.30.2",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.2.tgz",
"integrity": "sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q==",
"license": "MIT",
"dependencies": {
"@remix-run/router": "1.23.0",
"react-router": "6.30.1"
"@remix-run/router": "1.23.1",
"react-router": "6.30.2"
},
"engines": {
"node": ">=14.0.0"

View File

@@ -2,6 +2,10 @@
"name": "@oneuptime/accounts",
"version": "0.1.0",
"private": false,
"repository": {
"type": "git",
"url": "https://github.com/OneUptime/oneuptime"
},
"scripts": {
"dev-build": "NODE_ENV=development node esbuild.config.js",
"dev": "npx nodemon",
@@ -33,7 +37,7 @@
"ejs": "^3.1.10",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.30.1",
"react-router-dom": "^6.30.2",
"use-async-effect": "^2.2.7"
},
"devDependencies": {

View File

@@ -2,12 +2,13 @@ import React from "react";
const ForbiddenPage: () => JSX.Element = () => {
return (
<div className="flex min-h-full flex-col justify-center py-12 sm:px-6 lg:px-8">
<div className="sm:mx-auto sm:w-full sm:max-w-md">
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
<div className="flex min-h-full flex-col justify-center py-8 px-4 sm:py-12 sm:px-6 lg:px-8">
<div className="w-full max-w-md mx-auto text-center">
<div className="text-6xl sm:text-7xl mb-4">🚫</div>
<h2 className="mt-4 sm:mt-6 text-center text-xl sm:text-2xl tracking-tight text-gray-900">
Forbidden
</h2>
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
You do not have permission to access this page.
</p>
</div>

View File

@@ -14,35 +14,35 @@ const ForgotPassword: () => JSX.Element = () => {
const [isSuccess, setIsSuccess] = useState<boolean>(false);
return (
<div className="flex min-h-full flex-col justify-center py-12 sm:px-6 lg:px-8">
<div className="sm:mx-auto sm:w-full sm:max-w-md">
<div className="flex min-h-full flex-col justify-center py-8 px-4 sm:py-12 sm:px-6 lg:px-8">
<div className="w-full max-w-md mx-auto">
<img
className="mx-auto h-12 w-auto"
className="mx-auto h-10 w-auto sm:h-12"
src={OneUptimeLogo}
alt="Your Company"
/>
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
<h2 className="mt-4 sm:mt-6 text-center text-xl sm:text-2xl tracking-tight text-gray-900">
Forgot your password
</h2>
{!isSuccess && (
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
Please enter your email and the password reset link will be sent to
you.
</p>
)}
{isSuccess && (
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
We have emailed you the password reset link. Please do not forget to
check spam.
</p>
)}
</div>
<div className="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
<div className="mt-6 sm:mt-8 w-full max-w-md mx-auto">
{!isSuccess && (
<div className="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10">
<div className="bg-white py-6 px-4 shadow-sm sm:shadow rounded-lg sm:py-8 sm:px-10">
<ModelForm<User>
modelType={User}
name="Forgot Password"
@@ -81,8 +81,8 @@ const ForgotPassword: () => JSX.Element = () => {
</div>
)}
<div className="mt-5 text-center">
<p className="text-muted mb-0 text-gray-500">
<div className="mt-4 sm:mt-5 text-center">
<p className="text-muted mb-0 text-gray-500 text-sm sm:text-base">
Remember your password?{" "}
<Link
to={new Route("/accounts/login")}

View File

@@ -274,10 +274,10 @@ const LoginPage: () => JSX.Element = () => {
};
return (
<div className="flex min-h-full flex-col justify-center py-12 sm:px-6 lg:px-8">
<div className="">
<div className="flex min-h-full flex-col justify-center py-8 px-4 sm:py-12 sm:px-6 lg:px-8">
<div className="w-full max-w-md mx-auto">
<img
className="mx-auto h-12 w-auto"
className="mx-auto h-10 w-auto sm:h-12"
src={OneUptimeLogo}
alt="OneUptime"
/>
@@ -286,10 +286,10 @@ const LoginPage: () => JSX.Element = () => {
</div>
{!showTwoFactorAuth && (
<>
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
<h2 className="mt-4 sm:mt-6 text-center text-xl sm:text-2xl tracking-tight text-gray-900">
Sign in to your account
</h2>
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
Join thousands of business that use OneUptime to help them stay
online all the time.
</p>
@@ -298,10 +298,10 @@ const LoginPage: () => JSX.Element = () => {
{showTwoFactorAuth && (
<>
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
<h2 className="mt-4 sm:mt-6 text-center text-xl sm:text-2xl tracking-tight text-gray-900">
Two Factor Authentication
</h2>
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
Select two factor authentication method. You will be asked to
enter a code from the selected method.
</p>
@@ -309,8 +309,8 @@ const LoginPage: () => JSX.Element = () => {
)}
</div>
<div className="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
<div className="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10">
<div className="mt-6 sm:mt-8 w-full max-w-md mx-auto">
<div className="bg-white py-6 px-4 shadow-sm sm:shadow sm:rounded-lg sm:py-8 sm:px-10 rounded-lg">
{!showTwoFactorAuth && (
<ModelForm<User>
modelType={User}
@@ -505,9 +505,9 @@ const LoginPage: () => JSX.Element = () => {
/>
)}
</div>
<div className="mt-10 text-center">
<div className="mt-6 sm:mt-10 text-center">
{!selectedTotpAuth && !selectedWebAuthn && (
<div className="text-muted mb-0 text-gray-500">
<div className="text-muted mb-0 text-gray-500 text-sm sm:text-base">
Don&apos;t have an account?{" "}
<Link
to={new Route("/accounts/register")}

View File

@@ -126,18 +126,18 @@ const LoginPage: () => JSX.Element = () => {
);
return (
<div className="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
<div className="flex min-h-full flex-col justify-center py-12 sm:px-6 lg:px-8">
<div className="">
<div className="w-full max-w-md mx-auto px-4 sm:px-0">
<div className="flex min-h-full flex-col justify-center py-8 sm:py-12">
<div className="w-full">
<img
className="mx-auto h-12 w-auto"
className="mx-auto h-10 w-auto sm:h-12"
src={OneUptimeLogo}
alt="OneUptime"
/>
<h2 className="mt-10 text-center text-xl tracking-tight text-gray-900">
<h2 className="mt-6 sm:mt-10 text-center text-lg sm:text-xl tracking-tight text-gray-900">
Select Project
</h2>
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
Select the project you want to login to.
</p>
</div>
@@ -164,23 +164,23 @@ const LoginPage: () => JSX.Element = () => {
}
return (
<div className="flex min-h-full flex-col justify-center py-12 sm:px-6 lg:px-8">
<div className="">
<div className="flex min-h-full flex-col justify-center py-8 px-4 sm:py-12 sm:px-6 lg:px-8">
<div className="w-full max-w-md mx-auto">
<img
className="mx-auto h-12 w-auto"
className="mx-auto h-10 w-auto sm:h-12"
src={OneUptimeLogo}
alt="OneUptime"
/>
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
<h2 className="mt-4 sm:mt-6 text-center text-xl sm:text-2xl tracking-tight text-gray-900">
Login with SSO
</h2>
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
Login with your SSO provider to access your account.
</p>
</div>
<div className="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
<div className="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10">
<div className="mt-6 sm:mt-8 w-full max-w-md mx-auto">
<div className="bg-white py-6 px-4 shadow-sm sm:shadow rounded-lg sm:py-8 sm:px-10">
<BasicForm
modelType={User}
id="login-form"
@@ -217,8 +217,8 @@ const LoginPage: () => JSX.Element = () => {
}
/>
</div>
<div className="mt-10 text-center">
<div className="text-muted mb-0 text-gray-500">
<div className="mt-6 sm:mt-10 text-center">
<div className="text-muted mb-0 text-gray-500 text-sm sm:text-base">
Don&apos;t have an account?{" "}
<Link
to={new Route("/accounts/register")}

View File

@@ -2,12 +2,13 @@ import React from "react";
const LoginPage: () => JSX.Element = () => {
return (
<div className="flex min-h-full flex-col justify-center py-12 sm:px-6 lg:px-8">
<div className="sm:mx-auto sm:w-full sm:max-w-md">
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
<div className="flex min-h-full flex-col justify-center py-8 px-4 sm:py-12 sm:px-6 lg:px-8">
<div className="w-full max-w-md mx-auto text-center">
<div className="text-6xl sm:text-7xl mb-4">🔍</div>
<h2 className="mt-4 sm:mt-6 text-center text-xl sm:text-2xl tracking-tight text-gray-900">
Page not found
</h2>
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
Page you are looking for does not exist.
</p>
</div>

View File

@@ -248,17 +248,17 @@ const RegisterPage: () => JSX.Element = () => {
}
return (
<div className="flex min-h-full flex-col justify-center py-12 sm:px-6 lg:px-8">
<div className="sm:mx-auto sm:w-full sm:max-w-md">
<div className="flex min-h-full flex-col justify-center py-6 px-4 sm:py-12 sm:px-6 lg:px-8">
<div className="w-full max-w-md mx-auto lg:max-w-2xl">
<img
className="mx-auto h-12 w-auto"
className="mx-auto h-10 w-auto sm:h-12"
src={OneUptimeLogo}
alt="OneUptime"
/>
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
<h2 className="mt-4 sm:mt-6 text-center text-xl sm:text-2xl tracking-tight text-gray-900">
Create your OneUptime account
</h2>
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
Join thousands of business that use OneUptime to help them stay online
all the time.
</p>
@@ -267,8 +267,8 @@ const RegisterPage: () => JSX.Element = () => {
</p>
</div>
<div className="mt-8 lg:mx-auto lg:w-full lg:max-w-2xl">
<div className="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10">
<div className="mt-6 sm:mt-8 w-full max-w-md mx-auto lg:max-w-2xl">
<div className="bg-white py-6 px-4 shadow-sm sm:shadow rounded-lg sm:py-8 sm:px-10">
<ModelForm<User>
modelType={User}
id="register-form"
@@ -339,8 +339,8 @@ const RegisterPage: () => JSX.Element = () => {
}}
/>
</div>
<div className="mt-5 text-center text-gray-500">
<p className="text-muted mb-0">
<div className="mt-4 sm:mt-5 text-center text-gray-500">
<p className="text-muted mb-0 text-sm sm:text-base">
Already have an account?{" "}
<Link
to={new Route("/accounts/login")}

View File

@@ -14,33 +14,33 @@ const RegisterPage: () => JSX.Element = () => {
const [isSuccess, setIsSuccess] = useState<boolean>(false);
return (
<div className="flex min-h-full flex-col justify-center py-12 sm:px-6 lg:px-8">
<div className="sm:mx-auto sm:w-full sm:max-w-md">
<div className="flex min-h-full flex-col justify-center py-8 px-4 sm:py-12 sm:px-6 lg:px-8">
<div className="w-full max-w-md mx-auto">
<img
className="mx-auto h-12 w-auto"
className="mx-auto h-10 w-auto sm:h-12"
src={OneUptimeLogo}
alt="Your Company"
/>
<h2 className="mt-6 text-center text-2xl tracking-tight text-gray-900">
<h2 className="mt-4 sm:mt-6 text-center text-xl sm:text-2xl tracking-tight text-gray-900">
Reset your password
</h2>
{!isSuccess && (
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
Please enter your new password and we will have it updated.{" "}
</p>
)}
{isSuccess && (
<p className="mt-2 text-center text-sm text-gray-600">
<p className="mt-2 text-center text-sm text-gray-600 px-2 sm:px-0">
Your password has been updated. Please log in.
</p>
)}
</div>
<div className="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
<div className="mt-6 sm:mt-8 w-full max-w-md mx-auto">
{!isSuccess && (
<div className="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10">
<div className="bg-white py-6 px-4 shadow-sm sm:shadow rounded-lg sm:py-8 sm:px-10">
<ModelForm<User>
modelType={User}
id="register-form"
@@ -97,8 +97,8 @@ const RegisterPage: () => JSX.Element = () => {
</div>
)}
<div className="mt-5 text-center">
<p className="text-muted mb-0 text-gray-500">
<div className="mt-4 sm:mt-5 text-center">
<p className="text-muted mb-0 text-gray-500 text-sm sm:text-base">
Know your password?{" "}
<Link
to={new Route("/accounts/login")}

View File

@@ -58,60 +58,53 @@ const VerifyEmail: () => JSX.Element = () => {
}
return (
<div className="auth-page">
<div className="container-fluid p-0">
<div className="row g-0">
<div className="col-xxl-4 col-lg-4 col-md-3"></div>
<div className="flex min-h-full flex-col justify-center py-8 px-4 sm:py-12 sm:px-6 lg:px-8">
<div className="w-full max-w-md mx-auto">
<div className="text-center mb-8 sm:mb-10">
<img
className="mx-auto h-10 w-auto sm:h-12"
src={OneUptimeLogo}
alt="OneUptime"
/>
</div>
<div className="col-xxl-4 col-lg-4 col-md-6">
<div className="auth-full-page-content d-flex p-sm-5 p-4">
<div className="w-100">
<div className="d-flex flex-column h-100">
<div className="auth-content my-auto">
<div
className="mt-4 text-center flex justify-center"
style={{ marginBottom: "40px" }}
>
<img
style={{ height: "50px" }}
src={`${OneUptimeLogo}`}
/>
</div>
{!error && (
<div className="text-center">
<h5 className="mb-0">Your email is verified.</h5>
<p className="text-muted mt-2 mb-0">
Thank you for verifying your email. You can now log in
to OneUptime.{" "}
</p>
</div>
)}
{error && (
<div className="text-center">
<h5 className="mb-0">Sorry, something went wrong!</h5>
<p className="text-muted mt-2 mb-0">{error}</p>
</div>
)}
<div className="mt-5 text-center">
<p className="text-muted mb-0">
Return to sign in?{" "}
<Link
to={new Route("/accounts/login")}
className="hover:underline text-primary fw-semibold"
>
Login.
</Link>
</p>
</div>
</div>
</div>
</div>
<div className="bg-white py-6 px-4 shadow-sm sm:shadow rounded-lg sm:py-8 sm:px-10">
{!error && (
<div className="text-center">
<div className="text-5xl sm:text-6xl mb-4"></div>
<h2 className="text-xl sm:text-2xl tracking-tight text-gray-900">
Your email is verified.
</h2>
<p className="text-gray-600 mt-3 text-sm sm:text-base px-2 sm:px-0">
Thank you for verifying your email. You can now log in to
OneUptime.
</p>
</div>
</div>
)}
<div className="col-xxl-4 col-lg-4 col-md-3"></div>
{error && (
<div className="text-center">
<div className="text-5xl sm:text-6xl mb-4"></div>
<h2 className="text-xl sm:text-2xl tracking-tight text-gray-900">
Sorry, something went wrong!
</h2>
<p className="text-gray-600 mt-3 text-sm sm:text-base px-2 sm:px-0">
{error}
</p>
</div>
)}
</div>
<div className="mt-6 sm:mt-8 text-center">
<p className="text-gray-500 text-sm sm:text-base">
Return to sign in?{" "}
<Link
to={new Route("/accounts/login")}
className="text-indigo-500 hover:text-indigo-900 cursor-pointer"
>
Login.
</Link>
</p>
</div>
</div>
</div>

View File

@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<meta name="slack-app-id" content="ACVBMTPJQ">
<meta name="description" content="OneUptime the complete open-source observability platform.">
<meta name="description" content="OneUptime - the complete open-source observability platform.">
<% if(typeof enableGoogleTagManager !== 'undefined' ? enableGoogleTagManager : false){ %>
<!-- Google Tag Manager -->

View File

@@ -7,8 +7,8 @@ FROM public.ecr.aws/docker/library/node:24.9-alpine3.21
RUN mkdir /tmp/npm && chmod 2777 /tmp/npm && chown 1000:1000 /tmp/npm && npm config set cache /tmp/npm --global
RUN npm config set fetch-retries 5
RUN npm config set fetch-retry-mintimeout 100000
RUN npm config set fetch-retry-maxtimeout 600000
RUN npm config set fetch-retry-mintimeout 20000
RUN npm config set fetch-retry-maxtimeout 60000

View File

@@ -12,7 +12,7 @@
"ejs": "^3.1.10",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.30.1"
"react-router-dom": "^6.30.2"
},
"devDependencies": {
"@types/node": "^16.11.35",
@@ -347,9 +347,9 @@
"dev": true
},
"node_modules/@remix-run/router": {
"version": "1.23.0",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz",
"integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==",
"version": "1.23.1",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.1.tgz",
"integrity": "sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ==",
"license": "MIT",
"engines": {
"node": ">=14.0.0"
@@ -946,12 +946,12 @@
}
},
"node_modules/react-router": {
"version": "6.30.1",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz",
"integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==",
"version": "6.30.2",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.2.tgz",
"integrity": "sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA==",
"license": "MIT",
"dependencies": {
"@remix-run/router": "1.23.0"
"@remix-run/router": "1.23.1"
},
"engines": {
"node": ">=14.0.0"
@@ -961,13 +961,13 @@
}
},
"node_modules/react-router-dom": {
"version": "6.30.1",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz",
"integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==",
"version": "6.30.2",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.2.tgz",
"integrity": "sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q==",
"license": "MIT",
"dependencies": {
"@remix-run/router": "1.23.0",
"react-router": "6.30.1"
"@remix-run/router": "1.23.1",
"react-router": "6.30.2"
},
"engines": {
"node": ">=14.0.0"

View File

@@ -2,13 +2,17 @@
"name": "@oneuptime/admin-dashboard",
"version": "0.1.0",
"private": false,
"repository": {
"type": "git",
"url": "https://github.com/OneUptime/oneuptime"
},
"dependencies": {
"Common": "file:../Common",
"ejs": "^3.1.10",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.30.1"
"react-router-dom": "^6.30.2"
},
"scripts": {
"dev-build": "NODE_ENV=development node esbuild.config.js",

View File

@@ -9,6 +9,7 @@ import SettingsWhatsApp from "./Pages/Settings/WhatsApp/Index";
// Settings Pages.
import SettingsEmail from "./Pages/Settings/Email/Index";
import SettingsProbes from "./Pages/Settings/Probes/Index";
import SettingsLlmProviders from "./Pages/Settings/LlmProviders/Index";
import Users from "./Pages/Users/Index";
import PageMap from "./Utils/PageMap";
import RouteMap from "./Utils/RouteMap";
@@ -122,6 +123,11 @@ const App: () => JSX.Element = () => {
element={<SettingsProbes />}
/>
<PageRoute
path={RouteMap[PageMap.SETTINGS_LLM_PROVIDERS]?.toString() || ""}
element={<SettingsLlmProviders />}
/>
<PageRoute
path={RouteMap[PageMap.SETTINGS_AUTHENTICATION]?.toString() || ""}
element={<SettingsAuthentication />}

View File

@@ -0,0 +1,252 @@
import AdminModelAPI from "../../../Utils/ModelAPI";
import PageMap from "../../../Utils/PageMap";
import RouteMap, { RouteUtil } from "../../../Utils/RouteMap";
import DashboardSideMenu from "../SideMenu";
import Route from "Common/Types/API/Route";
import IsNull from "Common/Types/BaseDatabase/IsNull";
import Banner from "Common/UI/Components/Banner/Banner";
import FormFieldSchemaType from "Common/UI/Components/Forms/Types/FormFieldSchemaType";
import ModelTable from "Common/UI/Components/ModelTable/ModelTable";
import Page from "Common/UI/Components/Page/Page";
import FieldType from "Common/UI/Components/Types/FieldType";
import LlmProvider from "Common/Models/DatabaseModels/LlmProvider";
import LlmType from "Common/Types/LLM/LlmType";
import React, { FunctionComponent, ReactElement } from "react";
import DropdownUtil from "Common/UI/Utils/Dropdown";
import { BILLING_ENABLED } from "Common/UI/Config";
const Settings: FunctionComponent = (): ReactElement => {
return (
<Page
title={"Admin Settings"}
breadcrumbLinks={[
{
title: "Admin Dashboard",
to: RouteUtil.populateRouteParams(RouteMap[PageMap.HOME] as Route),
},
{
title: "Settings",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SETTINGS] as Route,
),
},
{
title: "Global LLM Providers",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SETTINGS_LLM_PROVIDERS] as Route,
),
},
]}
sideMenu={<DashboardSideMenu />}
>
{/* LLM Provider Settings View */}
<Banner
openInNewTab={true}
title="Need help with setting up LLM Providers?"
description="LLM Providers enable AI features. You can configure global LLM Providers that are available to all projects."
link={Route.fromString("/docs/ai/llm-provider")}
hideOnMobile={true}
/>
<ModelTable<LlmProvider>
userPreferencesKey={"admin-llms-table"}
modelType={LlmProvider}
id="llms-table"
name="Settings > Global LLM Providers"
isDeleteable={true}
isEditable={true}
isCreateable={true}
cardProps={{
title: "Global LLM Providers",
description:
"Global LLM Providers are available to all projects for AI features. Configure OpenAI, Anthropic, Ollama, or other LLM providers.",
}}
query={{
projectId: new IsNull(),
isGlobalLlm: true,
}}
modelAPI={AdminModelAPI}
noItemsMessage={
"No LLM Providers configured. Add an LLM Provider to enable AI features."
}
showRefreshButton={true}
onBeforeCreate={(item: LlmProvider) => {
item.isGlobalLlm = true;
return Promise.resolve(item);
}}
formSteps={[
{
title: "Basic Info",
id: "basic-info",
},
{
title: "Provider Settings",
id: "provider-settings",
},
...(BILLING_ENABLED
? [
{
title: "Cost Settings",
id: "cost-settings",
},
]
: []),
]}
formFields={[
{
field: {
name: true,
},
title: "Name",
stepId: "basic-info",
fieldType: FormFieldSchemaType.Text,
required: true,
placeholder: "My OpenAI GPT-4",
validation: {
minLength: 2,
},
},
{
field: {
description: true,
},
title: "Description",
stepId: "basic-info",
fieldType: FormFieldSchemaType.LongText,
required: false,
placeholder: "GPT-4 for general AI features.",
},
{
field: {
llmType: true,
},
title: "LLM Provider",
stepId: "provider-settings",
fieldType: FormFieldSchemaType.Dropdown,
required: true,
placeholder: "Select LLM Provider",
dropdownOptions: DropdownUtil.getDropdownOptionsFromEnum(LlmType),
},
{
field: {
apiKey: true,
},
title: "API Key",
stepId: "provider-settings",
fieldType: FormFieldSchemaType.Text,
required: false,
placeholder: "sk-...",
description:
"Required for OpenAI and Anthropic. Not required for Ollama if self-hosted.",
},
{
field: {
modelName: true,
},
title: "Model Name",
stepId: "provider-settings",
fieldType: FormFieldSchemaType.Text,
required: false,
placeholder: "gpt-4, claude-3-opus, llama2",
description:
"The specific model to use (e.g., gpt-4, claude-3-opus, llama2).",
},
{
field: {
baseUrl: true,
},
title: "Base URL",
stepId: "provider-settings",
fieldType: FormFieldSchemaType.URL,
required: false,
placeholder: "http://localhost:11434",
description:
"Required for Ollama. Optional for others to use custom endpoints.",
},
...(BILLING_ENABLED
? [
{
field: {
costPerMillionTokensInUSDCents: true,
},
title: "Cost Per Million Tokens (USD Cents)",
stepId: "cost-settings",
fieldType: FormFieldSchemaType.Number,
required: false,
placeholder: "0",
description:
"Cost per million tokens in USD cents. For example, if the cost is $0.01 per 1M tokens, enter 1.",
},
]
: []),
]}
selectMoreFields={{
apiKey: true,
}}
filters={[
{
field: {
name: true,
},
title: "Name",
type: FieldType.Text,
},
{
field: {
description: true,
},
title: "Description",
type: FieldType.LongText,
},
{
field: {
llmType: true,
},
title: "Provider",
type: FieldType.Text,
},
]}
columns={[
{
field: {
name: true,
},
title: "Name",
type: FieldType.Text,
},
{
field: {
llmType: true,
},
title: "Provider",
type: FieldType.Text,
},
{
field: {
modelName: true,
},
title: "Model",
type: FieldType.Text,
noValueMessage: "-",
},
...(BILLING_ENABLED
? [
{
field: {
costPerMillionTokensInUSDCents: true,
},
title: "Cost (cents/1M)",
type: FieldType.Number,
noValueMessage: "0",
},
]
: []),
]}
/>
</Page>
);
};
export default Settings;

View File

@@ -72,6 +72,17 @@ const DashboardSideMenu: () => JSX.Element = (): ReactElement => {
icon={IconProp.Signal}
/>
</SideMenuSection>
<SideMenuSection title="AI">
<SideMenuItem
link={{
title: "Global LLM Providers",
to: RouteUtil.populateRouteParams(
RouteMap[PageMap.SETTINGS_LLM_PROVIDERS] as Route,
),
}}
icon={IconProp.Brain}
/>
</SideMenuSection>
<SideMenuSection title="API and Integrations">
<SideMenuItem
link={{

View File

@@ -176,7 +176,7 @@ const buildWhatsAppSetupMarkdown: BuildWhatsAppSetupMarkdown = (): string => {
const webhookSection: string = [
"### Configure Meta Webhook Subscription",
"1. In the OneUptime Admin Dashboard, open **Settings → WhatsApp → Meta WhatsApp Settings** and enter a strong value in **Webhook Verify Token**. Save the form so the encrypted token is stored in Global Config.",
"2. Keep that verify token handyMeta does not generate one for you. You'll paste the exact same value when configuring the callback.",
"2. Keep that verify token handy-Meta does not generate one for you. You'll paste the exact same value when configuring the callback.",
"3. In [Meta for Developers](https://developers.facebook.com/apps/), select your WhatsApp app and navigate to **WhatsApp → Configuration → Webhooks**.",
`4. Click **Configure**, then supply one of the following callback URLs when Meta asks for your endpoint:\n - \`${primaryWebhookUrl}\`\n `,
"5. Paste the verify token from step 1 into Meta's **Verify Token** field and submit. Meta will call the callback URL and expect that value to match before it approves the subscription.",
@@ -195,7 +195,7 @@ const buildWhatsAppSetupMarkdown: BuildWhatsAppSetupMarkdown = (): string => {
"### Required WhatsApp Templates",
templateSummaryTable,
"### Template Bodies",
"> Copy the exact template body belowincluding punctuation and spacingwhen creating each template inside Meta. The variables list shows every placeholder that must be configured in WhatsApp Manager.",
"> Copy the exact template body below-including punctuation and spacing-when creating each template inside Meta. The variables list shows every placeholder that must be configured in WhatsApp Manager.",
templateBodies,
]
.filter(Boolean)

View File

@@ -18,6 +18,7 @@ enum PageMap {
SETTINGS_CALL_AND_SMS = "SETTINGS_CALL_AND_SMS",
SETTINGS_WHATSAPP = "SETTINGS_WHATSAPP",
SETTINGS_PROBES = "SETTINGS_PROBES",
SETTINGS_LLM_PROVIDERS = "SETTINGS_LLM_PROVIDERS",
SETTINGS_AUTHENTICATION = "SETTINGS_AUTHENTICATION",
SETTINGS_API_KEY = "SETTINGS_API_KEY",
}

View File

@@ -30,6 +30,7 @@ const RouteMap: Dictionary<Route> = {
[PageMap.SETTINGS_CALL_AND_SMS]: new Route(`/admin/settings/call-and-sms`),
[PageMap.SETTINGS_WHATSAPP]: new Route(`/admin/settings/whatsapp`),
[PageMap.SETTINGS_PROBES]: new Route(`/admin/settings/probes`),
[PageMap.SETTINGS_LLM_PROVIDERS]: new Route(`/admin/settings/llm-providers`),
[PageMap.SETTINGS_AUTHENTICATION]: new Route(
`/admin/settings/authentication`,
),

View File

@@ -9,7 +9,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<meta name="slack-app-id" content="ACVBMTPJQ">
<meta name="description" content="OneUptime the complete open-source observability platform.">
<meta name="description" content="OneUptime - the complete open-source observability platform.">
<% if(typeof enableGoogleTagManager !== 'undefined' ? enableGoogleTagManager : false){ %>
<!-- Google Tag Manager -->

View File

@@ -7,8 +7,8 @@ FROM public.ecr.aws/docker/library/node:24.9-alpine3.21
RUN mkdir /tmp/npm && chmod 2777 /tmp/npm && chown 1000:1000 /tmp/npm && npm config set cache /tmp/npm --global
RUN npm config set fetch-retries 5
RUN npm config set fetch-retry-mintimeout 100000
RUN npm config set fetch-retry-maxtimeout 600000
RUN npm config set fetch-retry-mintimeout 20000
RUN npm config set fetch-retry-maxtimeout 60000

View File

@@ -3,15 +3,14 @@ import BaseAnalyticsAPI from "Common/Server/API/BaseAnalyticsAPI";
import BillingAPI from "Common/Server/API/BillingAPI";
import BillingInvoiceAPI from "Common/Server/API/BillingInvoiceAPI";
import BillingPaymentMethodAPI from "Common/Server/API/BillingPaymentMethodAPI";
import CopilotCodeRepositoryAPI from "Common/Server/API/CopilotCodeRepositoryAPI";
import CopilotActionAPI from "Common/Server/API/CopilotActionAPI";
import CopilotPullRequestAPI from "Common/Server/API/CopilotPullRequestAPI";
import FileAPI from "Common/Server/API/FileAPI";
import GlobalConfigAPI from "Common/Server/API/GlobalConfigAPI";
import MonitorGroupAPI from "Common/Server/API/MonitorGroupAPI";
import NotificationAPI from "Common/Server/API/NotificationAPI";
import AIBillingAPI from "Common/Server/API/AIBillingAPI";
import TelemetryAPI from "Common/Server/API/TelemetryAPI";
import ProbeAPI from "Common/Server/API/ProbeAPI";
import LlmProviderAPI from "Common/Server/API/LlmProviderAPI";
import ProjectAPI from "Common/Server/API/ProjectAPI";
import ProjectSsoAPI from "Common/Server/API/ProjectSSO";
import WhatsAppLogAPI from "./WhatsAppLogAPI";
@@ -33,6 +32,9 @@ import IncidentInternalNoteAPI from "Common/Server/API/IncidentInternalNoteAPI";
import IncidentPublicNoteAPI from "Common/Server/API/IncidentPublicNoteAPI";
import ScheduledMaintenanceInternalNoteAPI from "Common/Server/API/ScheduledMaintenanceInternalNoteAPI";
import ScheduledMaintenancePublicNoteAPI from "Common/Server/API/ScheduledMaintenancePublicNoteAPI";
import IncidentAPI from "Common/Server/API/IncidentAPI";
import ScheduledMaintenanceAPI from "Common/Server/API/ScheduledMaintenanceAPI";
import AlertAPI from "Common/Server/API/AlertAPI";
// User Notification methods.
import UserEmailAPI from "Common/Server/API/UserEmailAPI";
import UserNotificationLogTimelineAPI from "Common/Server/API/UserOnCallLogTimelineAPI";
@@ -80,9 +82,7 @@ import DashboardService, {
import AlertOwnerUserService, {
Service as AlertOwnerUserServiceType,
} from "Common/Server/Services/AlertOwnerUserService";
import AlertService, {
Service as AlertServiceType,
} from "Common/Server/Services/AlertService";
import AlertSeverityService, {
Service as AlertSeverityServiceType,
} from "Common/Server/Services/AlertSeverityService";
@@ -111,9 +111,6 @@ import IncidentOwnerTeamService, {
import IncidentOwnerUserService, {
Service as IncidentOwnerUserServiceType,
} from "Common/Server/Services/IncidentOwnerUserService";
import IncidentService, {
Service as IncidentServiceType,
} from "Common/Server/Services/IncidentService";
import IncidentSeverityService, {
Service as IncidentSeverityServiceType,
} from "Common/Server/Services/IncidentSeverityService";
@@ -142,10 +139,6 @@ import LogService, {
LogService as LogServiceType,
} from "Common/Server/Services/LogService";
import CopilotActionTypePriorityService, {
Service as CopilotActionTypePriorityServiceType,
} from "Common/Server/Services/CopilotActionTypePriorityService";
import MetricService, {
MetricService as MetricServiceType,
} from "Common/Server/Services/MetricService";
@@ -223,6 +216,9 @@ import ProjectSmtpConfigService, {
import PromoCodeService, {
Service as PromoCodeServiceType,
} from "Common/Server/Services/PromoCodeService";
import CodeRepositoryService, {
Service as CodeRepositoryServiceType,
} from "Common/Server/Services/CodeRepositoryService";
import ResellerService, {
Service as ResellerServiceType,
} from "Common/Server/Services/ResellerService";
@@ -238,9 +234,7 @@ import ScheduledMaintenanceOwnerTeamService, {
import ScheduledMaintenanceOwnerUserService, {
Service as ScheduledMaintenanceOwnerUserServiceType,
} from "Common/Server/Services/ScheduledMaintenanceOwnerUserService";
import ScheduledMaintenanceService, {
Service as ScheduledMaintenanceServiceType,
} from "Common/Server/Services/ScheduledMaintenanceService";
import ScheduledMaintenanceStateService, {
Service as ScheduledMaintenanceStateServiceType,
} from "Common/Server/Services/ScheduledMaintenanceStateService";
@@ -256,9 +250,6 @@ import ServiceCatalogOwnerUserService, {
import ServiceCatalogService, {
Service as ServiceCatalogServiceType,
} from "Common/Server/Services/ServiceCatalogService";
import ServiceCopilotCodeRepositoryService, {
Service as ServiceCopilotCodeRepositoryType,
} from "Common/Server/Services/ServiceCopilotCodeRepositoryService";
import ServiceCatalogDependencyService, {
Service as ServiceCatalogDependencyServiceType,
} from "Common/Server/Services/ServiceCatalogDependencyService";
@@ -272,6 +263,11 @@ import ServiceCatalogTelemetryServiceService, {
Service as ServiceCatalogTelemetryServiceServiceType,
} from "Common/Server/Services/ServiceCatalogTelemetryServiceService";
import ServiceCatalogCodeRepository from "Common/Models/DatabaseModels/ServiceCatalogCodeRepository";
import ServiceCatalogCodeRepositoryService, {
Service as ServiceCatalogCodeRepositoryServiceType,
} from "Common/Server/Services/ServiceCatalogCodeRepositoryService";
import ShortLinkService, {
Service as ShortLinkServiceType,
} from "Common/Server/Services/ShortLinkService";
@@ -360,6 +356,10 @@ import ProbeOwnerUserService, {
Service as ProbeOwnerUserServiceType,
} from "Common/Server/Services/ProbeOwnerUserService";
import LlmLogService, {
Service as LlmLogServiceType,
} from "Common/Server/Services/LlmLogService";
import TelemetryExceptionService, {
Service as TelemetryExceptionServiceType,
} from "Common/Server/Services/TelemetryExceptionService";
@@ -384,7 +384,6 @@ import EmailLog from "Common/Models/DatabaseModels/EmailLog";
import EmailVerificationToken from "Common/Models/DatabaseModels/EmailVerificationToken";
import Dashboard from "Common/Models/DatabaseModels/Dashboard";
import Alert from "Common/Models/DatabaseModels/Alert";
import AlertCustomField from "Common/Models/DatabaseModels/AlertCustomField";
import AlertNoteTemplate from "Common/Models/DatabaseModels/AlertNoteTemplate";
import AlertOwnerTeam from "Common/Models/DatabaseModels/AlertOwnerTeam";
@@ -393,7 +392,6 @@ import AlertSeverity from "Common/Models/DatabaseModels/AlertSeverity";
import AlertState from "Common/Models/DatabaseModels/AlertState";
import AlertStateTimeline from "Common/Models/DatabaseModels/AlertStateTimeline";
import Incident from "Common/Models/DatabaseModels/Incident";
import IncidentCustomField from "Common/Models/DatabaseModels/IncidentCustomField";
import IncidentNoteTemplate from "Common/Models/DatabaseModels/IncidentNoteTemplate";
import IncidentPostmortemTemplate from "Common/Models/DatabaseModels/IncidentPostmortemTemplate";
@@ -430,8 +428,8 @@ import OnCallDutyPolicyScheduleLayerUser from "Common/Models/DatabaseModels/OnCa
import ProjectCallSMSConfig from "Common/Models/DatabaseModels/ProjectCallSMSConfig";
import ProjectSmtpConfig from "Common/Models/DatabaseModels/ProjectSmtpConfig";
import PromoCode from "Common/Models/DatabaseModels/PromoCode";
import CodeRepository from "Common/Models/DatabaseModels/CodeRepository";
import Reseller from "Common/Models/DatabaseModels/Reseller";
import ScheduledMaintenance from "Common/Models/DatabaseModels/ScheduledMaintenance";
import ScheduledMaintenanceCustomField from "Common/Models/DatabaseModels/ScheduledMaintenanceCustomField";
import ScheduledMaintenanceNoteTemplate from "Common/Models/DatabaseModels/ScheduledMaintenanceNoteTemplate";
import ScheduledMaintenanceOwnerTeam from "Common/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam";
@@ -441,7 +439,6 @@ import ScheduledMaintenanceStateTimeline from "Common/Models/DatabaseModels/Sche
import ServiceCatalog from "Common/Models/DatabaseModels/ServiceCatalog";
import ServiceCatalogOwnerTeam from "Common/Models/DatabaseModels/ServiceCatalogOwnerTeam";
import ServiceCatalogOwnerUser from "Common/Models/DatabaseModels/ServiceCatalogOwnerUser";
import ServiceCopilotCodeRepository from "Common/Models/DatabaseModels/ServiceCopilotCodeRepository";
import ShortLink from "Common/Models/DatabaseModels/ShortLink";
import SmsLog from "Common/Models/DatabaseModels/SmsLog";
// Custom Fields API
@@ -470,10 +467,10 @@ import WorkflowLog from "Common/Models/DatabaseModels/WorkflowLog";
import WorkflowVariable from "Common/Models/DatabaseModels/WorkflowVariable";
import ProbeOwnerTeam from "Common/Models/DatabaseModels/ProbeOwnerTeam";
import ProbeOwnerUser from "Common/Models/DatabaseModels/ProbeOwnerUser";
import LlmLog from "Common/Models/DatabaseModels/LlmLog";
import ServiceCatalogDependency from "Common/Models/DatabaseModels/ServiceCatalogDependency";
import ExceptionInstance from "Common/Models/AnalyticsModels/ExceptionInstance";
import TelemetyException from "Common/Models/DatabaseModels/TelemetryException";
import CopilotActionTypePriority from "Common/Models/DatabaseModels/CopilotActionTypePriority";
import WorkspaceNotificationLogService, {
Service as WorkspaceNotificationLogServiceType,
} from "Common/Server/Services/WorkspaceNotificationLogService";
@@ -511,6 +508,7 @@ import ScheduledMaintenanceFeedService, {
import SlackAPI from "Common/Server/API/SlackAPI";
import MicrosoftTeamsAPI from "Common/Server/API/MicrosoftTeamsAPI";
import GitHubAPI from "Common/Server/API/GitHubAPI";
import WorkspaceProjectAuthToken from "Common/Models/DatabaseModels/WorkspaceProjectAuthToken";
import WorkspaceProjectAuthTokenService, {
@@ -573,6 +571,18 @@ import StatusPageAnnouncementTemplateService, {
Service as StatusPageAnnouncementTemplateServiceType,
} from "Common/Server/Services/StatusPageAnnouncementTemplateService";
// status page subscriber notification templates
import StatusPageSubscriberNotificationTemplate from "Common/Models/DatabaseModels/StatusPageSubscriberNotificationTemplate";
import StatusPageSubscriberNotificationTemplateService, {
Service as StatusPageSubscriberNotificationTemplateServiceType,
} from "Common/Server/Services/StatusPageSubscriberNotificationTemplateService";
// status page subscriber notification template status page (linking table)
import StatusPageSubscriberNotificationTemplateStatusPage from "Common/Models/DatabaseModels/StatusPageSubscriberNotificationTemplateStatusPage";
import StatusPageSubscriberNotificationTemplateStatusPageService, {
Service as StatusPageSubscriberNotificationTemplateStatusPageServiceType,
} from "Common/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService";
// ProjectSCIM
import ProjectSCIM from "Common/Models/DatabaseModels/ProjectSCIM";
import ProjectSCIMService, {
@@ -647,6 +657,30 @@ const BaseAPIFeatureSet: FeatureSet = {
).getRouter(),
);
// status page subscriber notification templates
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<
StatusPageSubscriberNotificationTemplate,
StatusPageSubscriberNotificationTemplateServiceType
>(
StatusPageSubscriberNotificationTemplate,
StatusPageSubscriberNotificationTemplateService,
).getRouter(),
);
// status page subscriber notification template status page (linking table)
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<
StatusPageSubscriberNotificationTemplateStatusPage,
StatusPageSubscriberNotificationTemplateStatusPageServiceType
>(
StatusPageSubscriberNotificationTemplateStatusPage,
StatusPageSubscriberNotificationTemplateStatusPageService,
).getRouter(),
);
// OnCallDutyPolicyTimeLogService
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
@@ -788,10 +822,7 @@ const BaseAPIFeatureSet: FeatureSet = {
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<Alert, AlertServiceType>(Alert, AlertService).getRouter(),
);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new AlertAPI().getRouter());
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
@@ -893,17 +924,6 @@ const BaseAPIFeatureSet: FeatureSet = {
new BaseAnalyticsAPI<Log, LogServiceType>(Log, LogService).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<
CopilotActionTypePriority,
CopilotActionTypePriorityServiceType
>(
CopilotActionTypePriority,
CopilotActionTypePriorityService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<Dashboard, DashboardServiceType>(
@@ -990,6 +1010,17 @@ const BaseAPIFeatureSet: FeatureSet = {
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<
ServiceCatalogCodeRepository,
ServiceCatalogCodeRepositoryServiceType
>(
ServiceCatalogCodeRepository,
ServiceCatalogCodeRepositoryService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<MonitorProbe, MonitorProbeServiceType>(
@@ -1032,17 +1063,6 @@ const BaseAPIFeatureSet: FeatureSet = {
new BaseAPI<Team, TeamServiceType>(Team, TeamService).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<
ServiceCopilotCodeRepository,
ServiceCopilotCodeRepositoryType
>(
ServiceCopilotCodeRepository,
ServiceCopilotCodeRepositoryService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<MonitorGroupOwnerUser, MonitorGroupOwnerUserServiceType>(
@@ -1268,20 +1288,11 @@ const BaseAPIFeatureSet: FeatureSet = {
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<Incident, IncidentServiceType>(
Incident,
IncidentService,
).getRouter(),
);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new IncidentAPI().getRouter());
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<ScheduledMaintenance, ScheduledMaintenanceServiceType>(
ScheduledMaintenance,
ScheduledMaintenanceService,
).getRouter(),
new ScheduledMaintenanceAPI().getRouter(),
);
app.use(
@@ -1634,26 +1645,12 @@ const BaseAPIFeatureSet: FeatureSet = {
`/${APP_NAME.toLocaleLowerCase()}`,
new MicrosoftTeamsAPI().getRouter(),
);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new GitHubAPI().getRouter());
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new GlobalConfigAPI().getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new CopilotCodeRepositoryAPI().getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new CopilotActionAPI().getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new CopilotPullRequestAPI().getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new UserNotificationLogTimelineAPI().getRouter(),
@@ -1675,6 +1672,15 @@ const BaseAPIFeatureSet: FeatureSet = {
);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new UserPushAPI().getRouter());
app.use(`/${APP_NAME.toLocaleLowerCase()}`, new ProbeAPI().getRouter());
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new LlmProviderAPI().getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<LlmLog, LlmLogServiceType>(LlmLog, LlmLogService).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
@@ -1778,6 +1784,15 @@ const BaseAPIFeatureSet: FeatureSet = {
).getRouter(),
);
// Code Repository
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<CodeRepository, CodeRepositoryServiceType>(
CodeRepository,
CodeRepositoryService,
).getRouter(),
);
app.use(
`/${APP_NAME.toLocaleLowerCase()}`,
new BaseAPI<
@@ -1826,6 +1841,8 @@ const BaseAPIFeatureSet: FeatureSet = {
app.use(`/${APP_NAME.toLocaleLowerCase()}`, NotificationAPI);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, AIBillingAPI);
app.use(`/${APP_NAME.toLocaleLowerCase()}`, TelemetryAPI);
//attach api's

View File

@@ -13,10 +13,8 @@
{{> DetailBoxField title="Current State: " text=currentState }}
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
{{> DetailBoxField title="Severity: " text=alertSeverity }}
{{> DetailBoxField title="Root Cause: " text="" }}
{{> DetailBoxField title="" text=rootCause }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=alertDescription }}
{{> DetailBoxField title="Root Cause: " text=rootCause }}
{{> DetailBoxField title="Description: " text=alertDescription }}
{{> DetailBoxEnd this }}

View File

@@ -13,10 +13,8 @@
{{> DetailBoxField title="Current State: " text=currentState }}
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
{{> DetailBoxField title="Severity: " text=incidentSeverity }}
{{> DetailBoxField title="Root Cause: " text="" }}
{{> DetailBoxField title="" text=rootCause }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=incidentDescription }}
{{> DetailBoxField title="Root Cause: " text=rootCause }}
{{> DetailBoxField title="Description: " text=incidentDescription }}
{{> DetailBoxEnd this }}

View File

@@ -13,8 +13,7 @@
{{> DetailBoxField title="Current State: " text=currentState }}
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
{{> DetailBoxField title="Severity: " text=alertSeverity }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=alertDescription }}
{{> DetailBoxField title="Description: " text=alertDescription }}
{{> DetailBoxEnd this }}

View File

@@ -14,11 +14,10 @@
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
{{> DetailBoxField title="Severity: " text=alertSeverity }}
{{#if isPrivateNote}}
{{> DetailBoxField title="Private Note: " text="" }}
{{> DetailBoxField title="Private Note: " text=note }}
{{else}}
{{> DetailBoxField title="Public Note: " text="" }}
{{> DetailBoxField title="Public Note: " text=note }}
{{/if}}
{{> DetailBoxField title="" text=note }}
{{> DetailBoxEnd this }}

View File

@@ -13,16 +13,12 @@
{{> DetailBoxField title="Current State: " text=currentState }}
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
{{> DetailBoxField title="Alert Declared By: " text=declaredBy }}
{{> DetailBoxField title="Alert Declared At: " text="" }}
{{> DetailBoxField title="" text=declaredAt }}
{{> DetailBoxField title="Alert Declared At: " text=declaredAt }}
{{> DetailBoxField title="Severity: " text=alertSeverity }}
{{> DetailBoxField title="Root Cause: " text="" }}
{{> DetailBoxField title="" text=rootCause }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=alertDescription }}
{{> DetailBoxField title="Root Cause: " text=rootCause }}
{{> DetailBoxField title="Description: " text=alertDescription }}
{{#ifNotCond remediationNotes ""}}
{{> DetailBoxField title="Remediation Notes: " text="" }}
{{> DetailBoxField title="" text=remediationNotes }}
{{> DetailBoxField title="Remediation Notes: " text=remediationNotes }}
{{/ifNotCond}}
{{> DetailBoxEnd this }}

View File

@@ -4,19 +4,20 @@
{{> Logo this}}
{{> EmailTitle title=(concat "Alert: " alertTitle) }}
{{> InfoBlock info=(concat "Alert state changed to - " currentState)}}
{{> InfoBlock info="Alert state has changed"}}
{{> InfoBlock info="Here are the details: "}}
{{> DetailBoxStart this }}
{{> StateTransition this}}
{{#ifNotCond previousStateDurationText ""}}
{{> DetailBoxField title="Duration in Previous State:" text=previousStateDurationText }}
{{/ifNotCond}}
{{> DetailBoxField title="Alert Title:" text=alertTitle }}
{{> DetailBoxField title="New State: " text=currentState }}
{{> DetailBoxField title="State changed at: " text="" }}
{{> DetailBoxField title="" text=stateChangedAt }}
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
{{> DetailBoxField title="Severity: " text=alertSeverity }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=alertDescription }}
{{> DetailBoxField title="State changed at:" text=stateChangedAt }}
{{> DetailBoxField title="Resources Affected:" text=resourcesAffected }}
{{> DetailBoxField title="Severity:" text=alertSeverity }}
{{> DetailBoxField title="Description:" text=alertDescription }}
{{> DetailBoxEnd this }}

View File

@@ -0,0 +1 @@
{{{body}}}

View File

@@ -2,15 +2,20 @@
{{> Logo this}}
{{> EmailTitle title="Forgot Password? We're here to help." }}
{{> EmailTitle title="Reset Your Password" }}
{{> InfoBlock info="Please click on the 'Reset your password' button below which will help you reset your password and once you're done, You're good to go!"}}
{{> InfoBlock info="We received a request to reset your password. Click the button below to create a new password for your account."}}
{{> ButtonBlock buttonUrl=tokenVerifyUrl buttonText="Reset your password"}}
{{> ButtonBlock buttonUrl=tokenVerifyUrl buttonText="Reset Password"}}
{{> InfoBlock info="You can also copy and paste this link:"}}
{{> VerticalSpace this}}
{{> InfoBlock info="Or copy and paste this link into your browser:"}}
{{> InfoBlock info=tokenVerifyUrl}}
{{> InfoBlock info="This password reset link expires in 24 hours."}}
{{> VerticalSpace this}}
{{> InfoBlock info="<strong>Note:</strong> This password reset link will expire in 24 hours. If you didn't request this reset, you can safely ignore this email."}}
{{> SupportBlock this }}

View File

@@ -13,8 +13,7 @@
{{> DetailBoxField title="Current State: " text=currentState }}
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
{{> DetailBoxField title="Severity: " text=incidentSeverity }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=incidentDescription }}
{{> DetailBoxField title="Description: " text=incidentDescription }}
{{> DetailBoxEnd this }}

View File

@@ -14,11 +14,10 @@
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
{{> DetailBoxField title="Severity: " text=incidentSeverity }}
{{#if isPrivateNote}}
{{> DetailBoxField title="Private Note: " text="" }}
{{> DetailBoxField title="Private Note: " text=note }}
{{else}}
{{> DetailBoxField title="Public Note: " text="" }}
{{> DetailBoxField title="Public Note: " text=note }}
{{/if}}
{{> DetailBoxField title="" text=note }}
{{> DetailBoxEnd this }}

View File

@@ -13,16 +13,12 @@
{{> DetailBoxField title="Current State: " text=currentState }}
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
{{> DetailBoxField title="Incident Declared By: " text=declaredBy }}
{{> DetailBoxField title="Incident Declared At: " text="" }}
{{> DetailBoxField title="" text=declaredAt }}
{{> DetailBoxField title="Incident Declared At: " text=declaredAt }}
{{> DetailBoxField title="Severity: " text=incidentSeverity }}
{{> DetailBoxField title="Root Cause: " text="" }}
{{> DetailBoxField title="" text=rootCause }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=incidentDescription }}
{{> DetailBoxField title="Root Cause: " text=rootCause }}
{{> DetailBoxField title="Description: " text=incidentDescription }}
{{#ifNotCond remediationNotes ""}}
{{> DetailBoxField title="Remediation Notes: " text="" }}
{{> DetailBoxField title="" text=remediationNotes }}
{{> DetailBoxField title="Remediation Notes: " text=remediationNotes }}
{{/ifNotCond}}
{{> DetailBoxEnd this }}

View File

@@ -4,19 +4,20 @@
{{> Logo this}}
{{> EmailTitle title=(concat "Incident: " incidentTitle) }}
{{> InfoBlock info=(concat "Incident state changed to - " currentState)}}
{{> InfoBlock info="Incident state has changed"}}
{{> InfoBlock info="Here are the details: "}}
{{> DetailBoxStart this }}
{{> StateTransition this}}
{{#ifNotCond previousStateDurationText ""}}
{{> DetailBoxField title="Duration in Previous State:" text=previousStateDurationText }}
{{/ifNotCond}}
{{> DetailBoxField title="Incident Title:" text=incidentTitle }}
{{> DetailBoxField title="New State: " text=currentState }}
{{> DetailBoxField title="State changed at: " text="" }}
{{> DetailBoxField title="" text=stateChangedAt }}
{{> DetailBoxField title="Resources Affected: " text=resourcesAffected }}
{{> DetailBoxField title="Severity: " text=incidentSeverity }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=incidentDescription }}
{{> DetailBoxField title="State changed at:" text=stateChangedAt }}
{{> DetailBoxField title="Resources Affected:" text=resourcesAffected }}
{{> DetailBoxField title="Severity:" text=incidentSeverity }}
{{> DetailBoxField title="Description:" text=incidentDescription }}
{{> DetailBoxEnd this }}

View File

@@ -2,28 +2,33 @@
{{> Logo this}}
{{> EmailTitle title=(concat "You have been invited to " projectName) }}
{{> EmailTitle title=(concat "👋 You're Invited to " projectName) }}
{{#ifCond isNewUser "true"}}
{{> InfoBlock info="Please sign up to a new account to accept this invitation"}}
{{> InfoBlock info="You've been invited to join a project on OneUptime. Create your account to get started."}}
{{> ButtonBlock buttonUrl=registerLink buttonText="Sign up to a new account"}}
{{> ButtonBlock buttonUrl=registerLink buttonText="Create Your Account"}}
{{> InfoBlock info="You can also copy and paste this link:"}}
{{> VerticalSpace this}}
{{> InfoBlock info="Or copy and paste this link into your browser:"}}
{{> InfoBlock info=registerLink}}
{{/ifCond}}
{{#ifCond isNewUser "false"}}
{{> InfoBlock info="Please sign in to your account to see all your invitations and manage them."}}
{{> InfoBlock info="You've been invited to join a project on OneUptime. Sign in to view and manage your invitations."}}
{{> ButtonBlock buttonUrl=signInLink buttonText="Sign in to OneUptime"}}
{{> ButtonBlock buttonUrl=signInLink buttonText="Sign In to OneUptime"}}
{{> InfoBlock info="You can also copy and paste this link:"}}
{{> VerticalSpace this}}
{{> InfoBlock info="Or copy and paste this link into your browser:"}}
{{> InfoBlock info=signInLink}}
{{/ifCond}}
{{> VerticalSpace this}}
{{> InfoBlock info="If you have not signed up to OneUptime so far. You'll be redirected to the account sign up page to sign up first."}}
{{> InfoBlock info="<em>If you don't have an account yet, you'll be redirected to create one first.</em>"}}
{{> SupportBlock this }}

View File

@@ -10,9 +10,15 @@
{{> DetailBoxStart this }}
{{> DetailBoxField title="Monitor Name:" text=monitorName }}
{{#ifNotCond monitorDestination ""}}
{{#ifCond monitorType "API"}}
{{> DetailBoxField title="Monitor URL:" text=(concat requestType " " monitorDestination) }}
{{else}}
{{> DetailBoxField title="Monitor Destination:" text=monitorDestination }}
{{/ifCond}}
{{/ifNotCond}}
{{> DetailBoxField title="Current Status: " text=currentStatus }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=monitorDescription }}
{{> DetailBoxField title="Description: " text=monitorDescription }}
{{> DetailBoxEnd this }}

View File

@@ -10,9 +10,15 @@
{{> DetailBoxStart this }}
{{> DetailBoxField title="Monitor Name:" text=monitorName }}
{{#ifNotCond monitorDestination ""}}
{{#ifCond monitorType "API"}}
{{> DetailBoxField title="Monitor URL:" text=(concat requestType " " monitorDestination) }}
{{else}}
{{> DetailBoxField title="Monitor Destination:" text=monitorDestination }}
{{/ifCond}}
{{/ifNotCond}}
{{> DetailBoxField title="Current Status: " text=currentStatus }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=monitorDescription }}
{{> DetailBoxField title="Description: " text=monitorDescription }}
{{> DetailBoxEnd this }}

View File

@@ -4,21 +4,28 @@
{{> Logo this}}
{{> EmailTitle title=(concat "Monitor: " monitorName) }}
{{> InfoBlock info=(concat "Monitor status changed to - " currentStatus)}}
{{> InfoBlock info="Monitor status has changed"}}
{{> InfoBlock info="Here are the details: "}}
{{> DetailBoxStart this }}
{{> DetailBoxField title="Monitor Name:" text=monitorName }}
{{> DetailBoxField title="New Status: " text=currentStatus }}
{{#ifNotCond rootCause ""}}
{{> DetailBoxField title="Root Cause: " text="" }}
{{> DetailBoxField title="" text=rootCause }}
{{> StatusTransition this}}
{{#ifNotCond previousStatusDurationText ""}}
{{> DetailBoxField title="Duration in Previous Status:" text=previousStatusDurationText }}
{{/ifNotCond}}
{{> DetailBoxField title="Status changed at: " text="" }}
{{> DetailBoxField title="" text=statusChangedAt }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=monitorDescription }}
{{> DetailBoxField title="Monitor Name:" text=monitorName }}
{{#ifNotCond monitorDestination ""}}
{{#ifCond monitorType "API"}}
{{> DetailBoxField title="Monitor URL:" text=(concat requestType " " monitorDestination) }}
{{else}}
{{> DetailBoxField title="Monitor Destination:" text=monitorDestination }}
{{/ifCond}}
{{/ifNotCond}}
{{#ifNotCond rootCause ""}}
{{> DetailBoxField title="Root Cause:" text=rootCause }}
{{/ifNotCond}}
{{> DetailBoxField title="Status changed at:" text=statusChangedAt }}
{{> DetailBoxField title="Description:" text=monitorDescription }}
{{> DetailBoxEnd this }}

View File

@@ -8,8 +8,14 @@
{{> DetailBoxStart this }}
{{> DetailBoxField title="Monitor Name:" text=monitorName }}
{{> DetailBoxField title="Monitor Description: " text="" }}
{{> DetailBoxField title="" text=monitorDescription }}
{{#ifNotCond monitorDestination ""}}
{{#ifCond monitorType "API"}}
{{> DetailBoxField title="Monitor URL:" text=(concat requestType " " monitorDestination) }}
{{else}}
{{> DetailBoxField title="Monitor Destination:" text=monitorDestination }}
{{/ifCond}}
{{/ifNotCond}}
{{> DetailBoxField title="Monitor Description: " text=monitorDescription }}
{{> DetailBoxField title="Probe Status: " text=currentStatus }}
{{> DetailBoxEnd this }}

View File

@@ -1,3 +1,4 @@
<!-- Primary Action Button -->
<table class="st-Copy st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
width="600" style="min-width: 600px;">
<tbody>
@@ -8,26 +9,26 @@
<div class="st-Spacer st-Spacer--filler"></div>
</td>
<td class="st-Font st-Font--body"
style="border: 0; margin: 0; padding: 0; color: #000000; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 16px; line-height: 24px;">
style="border: 0; margin: 0; padding: 0; color: #1a1a2e; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 16px; line-height: 24px;">
<!-- Button & Modifier: fullWidth -->
<!-- Button & Modifier: fullWidth with gradient -->
<table class="st-Button st-Button--fullWidth" border="0" cellpadding="0" cellspacing="0"
width="100%">
<tbody>
<tr>
<td align="center" class="st-Button-area" height="38" valign="middle"
style="border: 0; margin: 0; padding: 0; background-color: #000000; border-radius: 5px; text-align: center;">
<td align="center" class="st-Button-area" height="48" valign="middle"
style="border: 0; margin: 0; padding: 0; background: linear-gradient(135deg, #1a1a2e 0%, #000000 100%); border-radius: 8px; text-align: center; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);">
<a class="st-Button-link"
style="border: 0; margin: 0; padding: 0; color: #ffffff; display: block; height: 38px; text-align: center; text-decoration: none;"
style="border: 0; margin: 0; padding: 0; color: #ffffff; display: block; height: 48px; text-align: center; text-decoration: none;"
href={{buttonUrl}}>
<span class="st-Button-internal"
style="border: 0; margin: 0; padding: 0; color: #ffffff; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 16px; font-weight: bold; height: 38px; line-height: 38px; mso-line-height-rule: exactly; text-decoration: none; vertical-align: middle; white-space: nowrap; width: 100%;">{{buttonText}}</span>
style="border: 0; margin: 0; padding: 0; color: #ffffff; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 15px; font-weight: 600; height: 48px; line-height: 48px; mso-line-height-rule: exactly; text-decoration: none; vertical-align: middle; white-space: nowrap; width: 100%; letter-spacing: 0.3px;">{{buttonText}}</span>
</a>
</td>
</tr>
</tbody>
</table>
<!-- /Button & Modifier: fullWidth -->
<!-- /Button & Modifier: fullWidth with gradient -->
</td>
<td class="st-Spacer st-Spacer--gutter"
@@ -37,10 +38,11 @@
</td>
</tr>
<tr>
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="12"
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="16"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
</tr>
</tbody>
</table>
</table>
<!-- /Primary Action Button -->

View File

@@ -19,7 +19,7 @@
<a style="border: 0; margin: 0; padding: 0; text-decoration: none;" href={{homeURL}}>
<img alt="OneUptime" height="70" border="0"
style="height:70px; border: 0; margin: 0; padding: 0; color: #000000; display: block; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 12px; font-weight: normal;"
style="height:70px; border: 0; margin: 0; padding: 0; color: #000000; display: block; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 12px; font-weight: normal; border-radius: 10%;"
src="{{logoUrl}}">
</a>
</div>

View File

@@ -1,4 +1,4 @@
<!-- End Detail Card Field Container -->
</td>
</tr>
</tbody>
@@ -10,4 +10,5 @@
</td>
</tr>
</tbody>
</table>
</table>
<!-- /Detail Card Container -->

View File

@@ -1,7 +1,9 @@
<p style="Margin:0;font-size:16px;font-family:'inter','helvetica neue',helvetica,arial,sans-serif;line-height:30px;color:#424761">
<!-- Detail Card Field -->
<div class="st-DetailCard-field" style="padding: 10px 0; border-bottom: 1px solid #e2e8f0;">
{{#if title}}
<strong>{{{title}}} </strong>{{{text}}} </span>
{{else}}
{{{text}}}
<p class="st-DetailCard-label" style="Margin:0 0 4px 0;font-size:11px;font-family:'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;line-height:16px;color:#64748b;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;">{{{title}}}</p>
{{/if}}
</p>
{{#if text}}
<p class="st-DetailCard-value" style="Margin:0;font-size:15px;font-family:'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;line-height:24px;color:#1e293b;font-weight:500;">{{{text}}}</p>
{{/if}}
</div>

View File

@@ -1,19 +1,20 @@
<table class="st-Copy st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
width="500" style="min-width: 500px;margin: 10px 50px;">
<!-- Detail Card Container -->
<table class="st-Copy st-Width st-Width--mobile st-DetailCard" border="0" cellpadding="0" cellspacing="0"
width="472" style="min-width: 472px; margin: 16px 64px; border-radius: 12px; overflow: hidden;">
<tbody>
<tr style="border-collapse:collapse">
<td width="720" align="center" valign="top" style="padding:0;Margin:0"></td>
<td width="100%" align="center" valign="top" style="padding:0;Margin:0"></td>
</tr>
<tr style="border-collapse:collapse">
<td align="left"
style="padding:0;Margin:0;padding-top:0px;padding-left:40px;padding-right:40px;padding-bottom:30px;background-color:#f7f8fa;border-radius: 5px">
style="padding:0;Margin:0;padding-top:0px;padding-left:0;padding-right:0;padding-bottom:0;background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);border-radius: 12px; border: 1px solid #e2e8f0; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);">
<table cellpadding="0" cellspacing="0" width="100%"
style="border-collapse:collapse;border-spacing:0px">
<tbody>
<tr style="border-collapse:collapse">
<td width="720" align="center" valign="top" style="padding:0;Margin:0">
<td width="100%" align="center" valign="top" style="padding:0;Margin:0">
<table cellpadding="0" cellspacing="0" width="100%" role="presentation"
style="border-collapse:collapse;border-spacing:0px">
<tbody>
<tr style="border-collapse:collapse">
<td align="left" style="padding:0;Margin:0;padding-top:30px">
<td align="left" style="padding:24px 28px 0 28px;Margin:0;">

View File

@@ -1,3 +1,4 @@
<!-- Email Title Block -->
<table class="st-Copy st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
width="600" style="min-width: 600px;">
<tbody>
@@ -7,10 +8,10 @@
width="64">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
<td class="st-Font st-Font--body"
style="color: #000000 !important; border:0;margin:0;padding:0; font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Ubuntu,sans-serif;font-size:16px;line-height:24px">
<td class="st-Font st-Font--title"
style="color: #1a1a2e !important; border:0;margin:0;padding:0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif;font-size:24px;line-height:32px;font-weight:700;">
<h3>{{title}}</h3>
<h2 style="margin: 0; padding: 0; font-size: 24px; line-height: 32px; font-weight: 700; color: #1a1a2e;">{{title}}</h2>
</td>
<td class="st-Spacer st-Spacer--gutter"
@@ -20,10 +21,11 @@
</td>
</tr>
<tr>
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="12"
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="16"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
</tr>
</tbody>
</table>
</table>
<!-- /Email Title Block -->

View File

@@ -7,7 +7,7 @@
</td>
</tr>
<tr>
<td class="st-Spacer st-Spacer--emailEnd" height="64"
<td class="st-Spacer st-Spacer--emailEnd" height="48"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler">&nbsp;</div>
</td>

View File

@@ -1,8 +1,9 @@
<!-- Footer Block -->
<table class="st-Footer st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
width="600" style="min-width: 600px;">
<tbody>
<tr>
<td class="st-Spacer st-Spacer--divider" colspan="3" height="20"
<td class="st-Spacer st-Spacer--divider" colspan="3" height="24"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; max-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
@@ -13,7 +14,7 @@
width="64">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
<td bgcolor="#fdfdfd" colspan="2" height="1"
<td bgcolor="#e5e7eb" colspan="2" height="1"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; max-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
@@ -24,7 +25,7 @@
</td>
</tr>
<tr>
<td class="st-Spacer st-Spacer--divider" colspan="3" height="31"
<td class="st-Spacer st-Spacer--divider" colspan="3" height="24"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
@@ -36,10 +37,10 @@
<div class="st-Spacer st-Spacer--filler"></div>
</td>
<td class="st-Font st-Font--caption"
style="border: 0; margin: 0;padding: 0; color: #8898aa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 12px; line-height: 16px;">
style="border: 0; margin: 0;padding: 0; color: #6b7280; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 13px; line-height: 18px; text-align: center;">
<span class="st-Delink st-Delink--footer"
style="border: 0; margin: 0; padding: 0; color: #8898aa; text-decoration: none;">
© {{year}} OneUptime
style="border: 0; margin: 0; padding: 0; color: #6b7280; text-decoration: none;">
© {{year}} OneUptime · Powered by <a href="https://oneuptime.com" style="color: #1a1a2e; text-decoration: none; font-weight: 500;">OneUptime</a>
</span>
</td>
<td class="st-Spacer st-Spacer--gutter"
@@ -49,10 +50,11 @@
</td>
</tr>
<tr>
<td class="st-Spacer st-Spacer--emailEnd" colspan="3" height="64"
<td class="st-Spacer st-Spacer--emailEnd" colspan="3" height="48"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
</tr>
</tbody>
</table>
</table>
<!-- /Footer Block -->

View File

@@ -1,4 +1,4 @@
<!-- Info Block -->
<table class="st-Copy st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
width="600" style="min-width: 600px;">
<tbody>
@@ -9,7 +9,7 @@
<div class="st-Spacer st-Spacer--filler"></div>
</td>
<td class="st-Font st-Font--body"
style="border: 0; margin: 0; padding: 0; color: #000000 !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 16px; line-height: 24px;">
style="border: 0; margin: 0; padding: 0; color: #374151 !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 15px; line-height: 26px;">
{{{info}}}
</td>
<td class="st-Spacer st-Spacer--gutter"
@@ -19,12 +19,11 @@
</td>
</tr>
<tr>
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="12"
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="14"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
</tr>
</tbody>
</table>
<!-- /Info Block -->

View File

@@ -18,7 +18,7 @@
<a style="border: 0; margin: 0; padding: 0; text-decoration: none;" href={{homeURL}}>
<img height="70" width="70" alt="OneUptime" border="0"
style="height:70px; width:70px; border: 0; margin: 0; padding: 0; color: #000000; display: block; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 12px; font-weight: normal;"
style="height:70px; width:70px; border: 0; margin: 0; padding: 0; color: #000000; display: block; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 12px; font-weight: normal; border-radius: 10%;"
src="https://res.cloudinary.com/deityhub/image/upload/v1637736803/1png.png">
</a>
</div>

View File

@@ -5,21 +5,33 @@
{{> Header}}
<body class="st-Email" bgcolor="f7f7f7"
<body class="st-Email" bgcolor="f3f4f6"
style="border: 0; margin: 0; padding: 0; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; min-width: 100%; width: 100%;"
override="fix">
<!-- Background -->
<table class="st-Background" bgcolor="f7f7f7" border="0" cellpadding="0" cellspacing="0" width="100%"
<table class="st-Background" bgcolor="f3f4f6" border="0" cellpadding="0" cellspacing="0" width="100%"
style="border: 0; margin: 0; padding: 0;">
<tbody>
<tr>
<td style="border: 0; margin: 0; padding: 0;">
<!-- Top Spacer -->
<table align="center" border="0" cellpadding="0" cellspacing="0" width="600" style="min-width: 600px;">
<tbody>
<tr>
<td height="32" style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px;">
<div>&nbsp;</div>
</td>
</tr>
</tbody>
</table>
<!-- /Top Spacer -->
<!-- Wrapper -->
<table class="st-Wrapper" align="center" bgcolor="ffffff" border="0" cellpadding="0" cellspacing="0"
width="600"
style="border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; margin: 0 auto; min-width: 600px;">
style="border-radius: 12px; margin: 0 auto; min-width: 600px; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03); border-top: 4px solid #1a1a2e;">
<tbody>
<tr>
<td style="border: 0; margin: 0; padding: 0;">

View File

@@ -0,0 +1,31 @@
<!-- State Transition Block - Inline version for DetailBox -->
<div class="st-DetailCard-field" style="padding: 16px 0; border-bottom: 1px solid #e2e8f0;">
<p class="st-DetailCard-label" style="Margin:0 0 12px 0;font-size:11px;font-family:'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;line-height:16px;color:#64748b;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;">STATE CHANGE</p>
<table cellpadding="0" cellspacing="0" border="0" style="border-collapse: collapse;">
<tbody>
<tr>
{{#if previousState}}
<!-- Previous State Badge -->
<td align="center" valign="middle" style="padding: 0;">
<span style="display: inline-block; white-space: nowrap; padding: 6px 14px; border-radius: 6px; font-size: 13px; font-weight: 600; background-color: transparent; color: {{previousStateColor}}; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; line-height: 16px; vertical-align: middle;">
<span style="width: 10px; height: 10px; border-radius: 4px; background-color: {{previousStateColor}}; display: inline-block; margin-right: 8px; vertical-align: middle;"></span>
<span style="display: inline-block; line-height: 16px; vertical-align: middle;">{{previousState}}</span>
</span>
</td>
<!-- Arrow -->
<td align="center" valign="middle" style="padding: 0 12px;">
<span style="font-size: 20px; color: #94a3b8; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif;">→</span>
</td>
{{/if}}
<!-- Current State Badge -->
<td align="center" valign="middle" style="padding: 0;">
<span style="display: inline-block; white-space: nowrap; padding: 6px 14px; border-radius: 6px; font-size: 13px; font-weight: 600; background-color: transparent; color: {{currentStateColor}}; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; line-height: 16px; vertical-align: middle;">
<span style="width: 10px; height: 10px; border-radius: 4px; background-color: {{currentStateColor}}; display: inline-block; margin-right: 8px; vertical-align: middle;"></span>
<span style="display: inline-block; line-height: 16px; vertical-align: middle;">{{currentState}}</span>
</span>
</td>
</tr>
</tbody>
</table>
</div>
<!-- /State Transition Block -->

View File

@@ -0,0 +1,58 @@
<!-- Status Badge - Used for incident states, severity levels, etc. -->
<table class="st-Copy st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
width="600" style="min-width: 600px;">
<tbody>
<tr>
<td class="st-Spacer st-Spacer--gutter"
style="border: 0; margin:0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;"
width="64">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
<td style="border: 0; margin: 0; padding: 0;">
{{#ifCond badgeType "critical"}}
<span class="st-Badge st-Badge--critical" style="display: inline-block; padding: 6px 14px; border-radius: 9999px; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; background-color: #fef2f2; color: #dc2626; border: 1px solid #fecaca; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif;">
{{badgeText}}
</span>
{{/ifCond}}
{{#ifCond badgeType "warning"}}
<span class="st-Badge st-Badge--warning" style="display: inline-block; padding: 6px 14px; border-radius: 9999px; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; background-color: #fffbeb; color: #d97706; border: 1px solid #fde68a; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif;">
{{badgeText}}
</span>
{{/ifCond}}
{{#ifCond badgeType "success"}}
<span class="st-Badge st-Badge--success" style="display: inline-block; padding: 6px 14px; border-radius: 9999px; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; background-color: #f0fdf4; color: #16a34a; border: 1px solid #bbf7d0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif;">
{{badgeText}}
</span>
{{/ifCond}}
{{#ifCond badgeType "info"}}
<span class="st-Badge st-Badge--info" style="display: inline-block; padding: 6px 14px; border-radius: 9999px; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; background-color: #eff6ff; color: #2563eb; border: 1px solid #bfdbfe; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif;">
{{badgeText}}
</span>
{{/ifCond}}
{{#ifCond badgeType "neutral"}}
<span class="st-Badge st-Badge--neutral" style="display: inline-block; padding: 6px 14px; border-radius: 9999px; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; background-color: #f3f4f6; color: #4b5563; border: 1px solid #d1d5db; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif;">
{{badgeText}}
</span>
{{/ifCond}}
</td>
<td class="st-Spacer st-Spacer--gutter"
style="border: 0; margin:0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;"
width="64">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
</tr>
<tr>
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="12"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
</tr>
</tbody>
</table>
<!-- /Status Badge -->

View File

@@ -0,0 +1,31 @@
<!-- Status Transition Block - Inline version for DetailBox -->
<div class="st-DetailCard-field" style="padding: 16px 0; border-bottom: 1px solid #e2e8f0;">
<p class="st-DetailCard-label" style="Margin:0 0 12px 0;font-size:11px;font-family:'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;line-height:16px;color:#64748b;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;">STATUS CHANGE</p>
<table cellpadding="0" cellspacing="0" border="0" style="border-collapse: collapse;">
<tbody>
<tr>
{{#if previousStatus}}
<!-- Previous Status Badge -->
<td align="center" valign="middle" style="padding: 0;">
<span style="display: inline-block; white-space: nowrap; padding: 6px 14px; border-radius: 6px; font-size: 13px; font-weight: 600; background-color: transparent; color: {{previousStatusColor}}; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; line-height: 16px; vertical-align: middle;">
<span style="width: 10px; height: 10px; border-radius: 9999px; background-color: {{previousStatusColor}}; display: inline-block; margin-right: 8px; vertical-align: middle;"></span>
<span style="display: inline-block; line-height: 16px; vertical-align: middle;">{{previousStatus}}</span>
</span>
</td>
<!-- Arrow -->
<td align="center" valign="middle" style="padding: 0 12px;">
<span style="font-size: 20px; color: #94a3b8; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif;">→</span>
</td>
{{/if}}
<!-- Current Status Badge -->
<td align="center" valign="middle" style="padding: 0;">
<span style="display: inline-block; white-space: nowrap; padding: 6px 14px; border-radius: 6px; font-size: 13px; font-weight: 600; background-color: transparent; color: {{currentStatusColor}}; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; line-height: 16px; vertical-align: middle;">
<span style="width: 10px; height: 10px; border-radius: 9999px; background-color: {{currentStatusColor}}; display: inline-block; margin-right: 8px; vertical-align: middle;"></span>
<span style="display: inline-block; line-height: 16px; vertical-align: middle;">{{currentStatus}}</span>
</span>
</td>
</tr>
</tbody>
</table>
</div>
<!-- /Status Transition Block -->

View File

@@ -52,7 +52,7 @@
**/
span.st-Delink a {
color: #000000 !important;
color: #1a1a2e !important;
text-decoration: none !important;
}
@@ -66,7 +66,7 @@
/** Modifier: title */
span.st-Delink.st-Delink--title a {
color: #000000 !important;
color: #1a1a2e !important;
text-decoration: none !important;
}
@@ -74,14 +74,111 @@
/** Modifier: footer */
span.st-Delink.st-Delink--footer a {
color: #8898aa !important;
color: #6b7280 !important;
text-decoration: none !important;
}
/** */
.ii a[href] {
color: #000000;
color: #1a1a2e;
}
/**
* # Links
* - Styled links with modern colors
**/
a.st-Link {
color: #1a1a2e !important;
text-decoration: none !important;
transition: color 0.2s ease !important;
}
a.st-Link:hover {
color: #000000 !important;
text-decoration: underline !important;
}
/**
* # Status Badges
* - Colored badges for incident/alert states
**/
.st-Badge {
display: inline-block !important;
padding: 4px 12px !important;
border-radius: 9999px !important;
font-size: 12px !important;
font-weight: 600 !important;
text-transform: uppercase !important;
letter-spacing: 0.5px !important;
}
.st-Badge--critical {
background-color: #fef2f2 !important;
color: #dc2626 !important;
border: 1px solid #fecaca !important;
}
.st-Badge--warning {
background-color: #fffbeb !important;
color: #d97706 !important;
border: 1px solid #fde68a !important;
}
.st-Badge--success {
background-color: #f0fdf4 !important;
color: #16a34a !important;
border: 1px solid #bbf7d0 !important;
}
.st-Badge--info {
background-color: #f3f4f6 !important;
color: #1a1a2e !important;
border: 1px solid #d1d5db !important;
}
.st-Badge--neutral {
background-color: #f3f4f6 !important;
color: #4b5563 !important;
border: 1px solid #d1d5db !important;
}
/**
* # Detail Cards
* - Modern card styling for detail boxes
**/
.st-DetailCard {
background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%) !important;
border: 1px solid #e2e8f0 !important;
border-radius: 12px !important;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05) !important;
}
.st-DetailCard-field {
padding: 12px 0 !important;
border-bottom: 1px solid #e2e8f0 !important;
}
.st-DetailCard-field:last-child {
border-bottom: none !important;
}
.st-DetailCard-label {
color: #64748b !important;
font-size: 12px !important;
font-weight: 600 !important;
text-transform: uppercase !important;
letter-spacing: 0.5px !important;
margin-bottom: 4px !important;
}
.st-DetailCard-value {
color: #1e293b !important;
font-size: 15px !important;
font-weight: 500 !important;
}
/**
@@ -107,7 +204,7 @@
/** Modifier: gutter */
body[override] td.st-Spacer.st-Spacer--gutter {
width: 32px !important;
width: 24px !important;
}
/** */
@@ -134,8 +231,8 @@
body[override] td.st-Font.st-Font--title,
body[override] td.st-Font.st-Font--title span,
body[override] td.st-Font.st-Font--title a {
font-size: 28px !important;
line-height: 36px !important;
font-size: 26px !important;
line-height: 34px !important;
}
/** */
@@ -144,8 +241,8 @@
body[override] td.st-Font.st-Font--header,
body[override] td.st-Font.st-Font--header span,
body[override] td.st-Font.st-Font--header a {
font-size: 24px !important;
line-height: 32px !important;
font-size: 22px !important;
line-height: 30px !important;
}
/** */
@@ -154,8 +251,8 @@
body[override] td.st-Font.st-Font--body,
body[override] td.st-Font.st-Font--body span,
body[override] td.st-Font.st-Font--body a {
font-size: 18px !important;
line-height: 28px !important;
font-size: 16px !important;
line-height: 26px !important;
}
/** */
@@ -164,8 +261,8 @@
body[override] td.st-Font.st-Font--caption,
body[override] td.st-Font.st-Font--caption span,
body[override] td.st-Font.st-Font--caption a {
font-size: 14px !important;
line-height: 20px !important;
font-size: 13px !important;
line-height: 19px !important;
}
/** */
@@ -185,7 +282,7 @@
body[override] table.st-Divider td.st-Spacer.st-Spacer--gutter,
body[override] tr.st-Divider td.st-Spacer.st-Spacer--gutter {
background-color: #000000;
background-color: #1a1a2e;
}
/**
@@ -212,10 +309,23 @@
body[override] table.st-Button td.st-Button-area,
body[override] table.st-Button td.st-Button-area a.st-Button-link,
body[override] table.st-Button td.st-Button-area span.st-Button-internal {
height: 44px !important;
line-height: 44px !important;
font-size: 18px !important;
height: 48px !important;
line-height: 48px !important;
font-size: 16px !important;
vertical-align: middle !important;
}
/**
* # Detail Cards - Mobile
**/
body[override] .st-DetailCard {
border-radius: 8px !important;
}
body[override] .st-Badge {
font-size: 11px !important;
padding: 3px 10px !important;
}
}
</style>

View File

@@ -1,3 +1,4 @@
{{> InfoBlock info="If you need help. Please do not hesitate to contact OneUptime support team at support@oneuptime.com."}}
<!-- Support Block -->
{{> InfoBlock info="Need help? Contact our support team at <a href='mailto:support@oneuptime.com' style='color: #1a1a2e; text-decoration: none; font-weight: 500;'>support@oneuptime.com</a>"}}
{{> Thanks }}
<!-- /Support Block -->

View File

@@ -1,2 +1,3 @@
{{> InfoBlock info="Thanks, have a great day."}}
{{> InfoBlock info="OneUptime Team."}}
<!-- Thanks Block -->
{{> InfoBlock info="<span style='color: #374151;'>Best regards,</span><br><strong style='color: #1a1a2e;'>The OneUptime Team</strong>"}}
<!-- /Thanks Block -->

View File

@@ -1,4 +1,4 @@
<!-- Title Block -->
<table class="st-Copy st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
width="600" style="min-width: 600px;">
<tbody>
@@ -9,8 +9,8 @@ width="600" style="min-width: 600px;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
<td class="st-Font st-Font--body"
style="border: 0; margin: 0; padding: 0; color: #000000 !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 16px; line-height: 24px;">
<strong>{{{title}}}</strong>
style="border: 0; margin: 0; padding: 0; color: #1a1a2e !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 15px; line-height: 26px;">
<strong style="color: #1a1a2e; font-weight: 600;">{{{title}}}</strong>
</td>
<td class="st-Spacer st-Spacer--gutter"
style="border: 0; margin:0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;"
@@ -19,11 +19,11 @@ width="600" style="min-width: 600px;">
</td>
</tr>
<tr>
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="12"
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="14"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
</tr>
</tbody>
</table>
<!-- /Title Block -->

View File

@@ -1,3 +1,4 @@
<!-- Unsubscribe Block -->
<table class="st-Copy st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
width="600" style="min-width: 600px;">
<tbody>
@@ -7,10 +8,10 @@
width="64">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
<td class="st-Font st-Font--body"
style="border: 0; margin: 0; padding: 0; color: #000000 !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 12px; line-height: 20px;">
<td class="st-Font st-Font--caption"
style="border: 0; margin: 0; padding: 0; color: #6b7280 !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ubuntu, sans-serif; font-size: 13px; line-height: 20px;">
If you wish to change preferences or unsubscribe, please click <a href="{{unsubscribeUrl}}">here.</a>
<span style="color: #6b7280;">Want to change your notification preferences?</span> <a href="{{unsubscribeUrl}}" style="color: #1a1a2e; text-decoration: none; font-weight: 500;">Manage subscription</a>
</td>
<td class="st-Spacer st-Spacer--gutter"
@@ -20,10 +21,11 @@
</td>
</tr>
<tr>
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="12"
<td class="st-Spacer st-Spacer--stacked" colspan="3" height="14"
style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler"></div>
</td>
</tr>
</tbody>
</table>
</table>
<!-- /Unsubscribe Block -->

View File

@@ -1,3 +1,12 @@
<div style="margin-top: 10px; margin-bottom: 10px">
</div>
<!-- Vertical Spacer -->
<table class="st-Copy st-Width st-Width--mobile" border="0" cellpadding="0" cellspacing="0"
width="600" style="min-width: 600px;">
<tbody>
<tr>
<td height="20" style="border: 0; margin: 0; padding: 0; font-size: 1px; line-height: 1px; mso-line-height-rule: exactly;">
<div class="st-Spacer st-Spacer--filler">&nbsp;</div>
</td>
</tr>
</tbody>
</table>
<!-- /Vertical Spacer -->

View File

@@ -10,8 +10,7 @@
{{> DetailBoxField title="Probe Name:" text=probeName }}
{{> DetailBoxField title="Probe Description:" text=probeDescription }}
{{> DetailBoxField title="Probe Status:" text=probeStatus }}
{{> DetailBoxField title="Status Since:" text="" }}
{{> DetailBoxField title="" text=lastAlive }}
{{> DetailBoxField title="Status Since:" text=lastAlive }}
{{> DetailBoxField title="Project Name: " text=projectName }}
{{> DetailBoxEnd this }}

View File

@@ -11,8 +11,7 @@
{{> DetailBoxStart this }}
{{> DetailBoxField title="Scheduled Maintenance Title:" text=scheduledMaintenanceTitle }}
{{> DetailBoxField title="Current State: " text=currentState }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=scheduledMaintenanceDescription }}
{{> DetailBoxField title="Description: " text=scheduledMaintenanceDescription }}
{{> DetailBoxEnd this }}

View File

@@ -12,11 +12,10 @@
{{> DetailBoxField title="Scheduled Maintenance Title:" text=scheduledMaintenanceTitle }}
{{> DetailBoxField title="Current State: " text=currentState }}
{{#if isPrivateNote}}
{{> DetailBoxField title="Private Note: " text="" }}
{{> DetailBoxField title="Private Note: " text=note }}
{{else}}
{{> DetailBoxField title="Public Note: " text="" }}
{{> DetailBoxField title="Public Note: " text=note }}
{{/if}}
{{> DetailBoxField title="" text=note }}
{{> DetailBoxEnd this }}

View File

@@ -11,8 +11,7 @@
{{> DetailBoxStart this }}
{{> DetailBoxField title="Scheduled Maintenance Title:" text=scheduledMaintenanceTitle }}
{{> DetailBoxField title="Current State: " text=currentState }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=scheduledMaintenanceDescription }}
{{> DetailBoxField title="Description: " text=scheduledMaintenanceDescription }}
{{> DetailBoxEnd this }}

View File

@@ -4,17 +4,18 @@
{{> Logo this}}
{{> EmailTitle title=(concat "Scheduled Maintenance: " scheduledMaintenanceTitle) }}
{{> InfoBlock info=(concat "Scheduled Maintenance status changed to - " currentState)}}
{{> InfoBlock info="Scheduled Maintenance state has changed"}}
{{> InfoBlock info="Here are the details: "}}
{{> DetailBoxStart this }}
{{> StateTransition this}}
{{#ifNotCond previousStateDurationText ""}}
{{> DetailBoxField title="Duration in Previous State:" text=previousStateDurationText }}
{{/ifNotCond}}
{{> DetailBoxField title="Scheduled Maintenance Title:" text=scheduledMaintenanceTitle }}
{{> DetailBoxField title="New State: " text=currentState }}
{{> DetailBoxField title="State changed at: " text="" }}
{{> DetailBoxField title="" text=stateChangedAt }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=scheduledMaintenanceDescription }}
{{> DetailBoxField title="State changed at:" text=stateChangedAt }}
{{> DetailBoxField title="Description:" text=scheduledMaintenanceDescription }}
{{> DetailBoxEnd this }}

View File

@@ -1,14 +1,20 @@
{{> Start this}}
{{> Logo this}}
{{> EmailTitle title="Welcome to OneUptime. Please verify your email." }}
{{> InfoBlock info="Thank you for signing up. Next step would be to verify your email account. Can you please click on 'Verify Email' button which will help us to get your email verified. "}}
{{> ButtonBlock buttonUrl=tokenVerifyUrl buttonText="Verify Email"}}
{{> EmailTitle title="🎉 Welcome to OneUptime!" }}
{{> InfoBlock info="You can also copy and paste this link:"}}
{{> InfoBlock info="Thank you for signing up! To get started, please verify your email address by clicking the button below."}}
{{> ButtonBlock buttonUrl=tokenVerifyUrl buttonText="Verify Email Address"}}
{{> VerticalSpace this}}
{{> InfoBlock info="Or copy and paste this link into your browser:"}}
{{> InfoBlock info=tokenVerifyUrl}}
{{> VerticalSpace this}}
{{> SupportBlock this }}
{{> Footer this}}

View File

@@ -10,8 +10,7 @@
{{> DetailBoxStart this }}
{{> DetailBoxField title="Status Page Name:" text=statusPageName }}
{{> DetailBoxField title="Description: " text="" }}
{{> DetailBoxField title="" text=statusPageDescription }}
{{> DetailBoxField title="Description: " text=statusPageDescription }}
{{> DetailBoxEnd this }}

Some files were not shown because too many files have changed in this diff Show More