Skip to content

Commit c7eda5b

Browse files
authored
feat(rich-editor): rich markdown field + @ mentions for skill & deploy modals (#5215)
* feat(rich-editor): rich markdown field + @ mentions for skill & deploy modals - Add controlled, file-less RichMarkdownField (sibling of the file editor) used for skill Content and deploy version descriptions; placeholder/typography match chip fields - Add @-mention menu (TipTap suggestion) inserting portable [label](sim:kind/id) links; wired into the field and the file viewer via a shared useEditorMentions hook - Extract a shared suggestion-popup renderer + menu chrome (slash + mention) - Fix false dirty-on-open: normalize the editor's dirty baseline to canonical markdown - Always show the deployment version number (v3 · name) so named versions keep a short ref - Skill import: drop the paste box (Create-tab editor auto-destructures a pasted SKILL.md), reorder GitHub → Upload * fix(rich-editor): address review feedback on modal field - RichMarkdownField reports the original value when the doc matches its canonical form, so a non-canonical input never reads as a false unsaved change (skill + version description modals) - Add sim: mention link navigation (Cmd/Ctrl-click) to the modal field - versions: keep the v{n} fallback as the rename guard/seed so re-submitting the displayed token is a no-op (no redundant "v3 · v3"); document the clear-name no-op - Clarify the lazy query-gating comment in useMarkdownMentions * fix(skills): re-seed Content editor when initialValues changes Bump the field's remount key in the reset guard so the seed-once rich editor re-seeds when content is reset from a changed initialValues (same skill id keeps the React key otherwise stable), keeping the editor and saved value in sync. * feat(rich-editor): render mentions as icon chips + menu/limit polish - Render @ mentions as an inline chip node (entity icon + label) instead of a blue link; still serializes to the portable [label](sim:kind/id) markdown so it round-trips and stays agent-readable (shared mentionIcon resolver) - Cap the mention/slash menu height + width and scroll it, matching the chat menu - Give the version description editor more height; lift the 2000-char limit to a high anti-abuse cap (client + contract) and drop the visible counter * fix(rich-editor): make suggestion menus scrollable inside modals - Mount the slash/@ menu popup inside the host dialog (when present) instead of document.body: Radix's scroll-lock blocks wheel events outside the dialog subtree, so a body-level popup couldn't scroll in a modal. position:fixed keeps it viewport-positioned (the modal centers via flex, no transform) so it isn't clipped - Fix the invalid max-w arbitrary value (calc needs spaces) that left the menu uncapped - Match the version-description editor's dynamic-import loading height to the field so the modal doesn't grow when the chunk loads * fix(rich-editor): escape bracketed mention labels + disable images in field editors - Escape/unescape `[`/`]` in mention labels so an entity named e.g. `data[1].csv` round-trips into a chip instead of degrading to a plain link - Hide the `/Image` command where image upload isn't wired (the skill + version description field editors), so images can't be inserted there; the file viewer keeps image support * fix(rich-editor): keep suggestion keyboard nav working after async items load The suggestion plugin captures the list's onKeyDown handle via ReactRenderer.ref once at mount. The mention list's items arrive asynchronously from the workspace store, so the captured handle closed over an empty `flat` and returned false for arrow/enter — letting the editor move the caret instead of navigating the menu. Read live values through a ref so the mount-time handle always sees current items/activeIndex. Hardened the slash list the same way. * test(rich-editor): cover suggestion keyboard nav through ReactRenderer; drop inline comments Adds a test that drives the real ReactRenderer path the suggestion plugin uses: the captured onKeyDown handle returns false while the store is empty and true once async workspace items land, and arrow+enter select the right item. Removes the explanatory inline comments from the two imperative handles. * fix(rich-editor): suggestion menus keep arrow keys when a divider is adjacent The leaf-selection keymap (ArrowUp/Down selects an adjacent divider/image) runs at priority 1000, above the suggestion plugins, so it stole ArrowDown to select the next horizontal rule instead of moving the open @/ menu selection. It now yields while a mention or slash menu is active, detected via the plugins' exported keys. * feat(rich-editor): Tab accepts a suggestion; unify list keyboard nav; match chip styling - Extract useSuggestionKeyboard: one hook owns the @/ menus' active-row state, scroll-into-view, and arrow/enter/tab handling (removes the duplication between the two list components) - Tab now accepts the active item like Enter, matching the chat composer - Render the mention chip like the chat input's mention token: borderless inline icon + label (no pill), 12px icon with brand color via getBareIconStyle, so the styling is consistent across surfaces * fix(rich-editor): harden editor edge cases found in full audit - Skill paste: only auto-destructure on a real YAML name key, so a stray `---` break or heading snippet no longer overwrites all three fields (parseSkillMarkdown reports nameFromFrontmatter) - Skill modal: reset by skill id, not object identity, so a background refetch of the open skill can't clobber in-progress edits - Field editor: claim Mod+K (inline link editor wins over global search) and swallow file drops so the browser doesn't navigate away from the modal - File editor: swallow non-image file drops (same navigation guard) - Frontmatter: a leading `---` thematic break (e.g. a changelog) is no longer mistaken for frontmatter and hidden from the editor - Mention chip: renderText emits the portable link so copying a chip into a plain-text target (e.g. chat) pastes back as a mention - Suggestion nav: clamp a one-frame stale active index on Enter/Tab * style(rich-editor): selected link reads as normal text, not standout blue Follows the standard MD-editor convention (Linear, Slack): a highlighted link takes the primary text color so the selection stays legible, instead of keeping its blue on the selection highlight. Scoped to selected links only — no effect on unselected links, regular text, the selection background, or any other surface. * fix(rich-editor): guard async suggestion + generate lifecycles against teardown - Suggestion onStart can fire after the editor is destroyed (the update awaits items()), throwing on its now-gone view/storage — e.g. a modal closing while the menu opens. Bail when the editor is destroyed; optional-chain mention storage. This also removes the unhandled rejections the headless keymap test surfaced. - Generate version description: thread an AbortSignal so closing the modal mid-stream aborts the diff fetches + SSE read instead of streaming into a gone component. * refactor(rich-editor): fold inline comments into TSDoc; display-only chip; polish - Convert the editor's inline `//` comments to TSDoc on the nearest declaration and drop the self-explanatory ones (no logic change) - Mention chip is now display-only (icon + label), matching the chat input exactly: removes select-none (so a range selection highlights the label), the cursor-pointer over-promise, and the cmd-click nav that could route away from a modal mid-edit - Don't log a deliberate generate-abort as an error - Selected strike-through text reads in the primary color so the selection is uniform * fix(rich-editor): clean selection for the mention chip The chip is an inline atom, so a range selection now highlights it as a whole unit (the prior select-none left it an un-highlighted gap). A direct click selects it with a subtle fill instead of the block-leaf outline ring meant for dividers/images. * feat(rich-editor): Cmd/Ctrl-click a mention to its resource in the file viewer Threads a `navigable` flag through the mention storage: the file viewer opts in so a chip routes to its file/table/workflow/etc., while modal fields stay inert so a click can't navigate away from an unsaved edit. Styling is identical either way. * fix(rich-editor): icon fallback for removed integrations; smoother divider nav - A mention to a since-removed integration falls back to a generic icon so the chip is never icon-less (indistinguishable from prose) - Arrowing from a selected divider/image to an adjacent one selects it directly instead of stopping on the gap cursor between them, so stepping through a run of dividers is one press each * fix(rich-editor): integration mentions are display-only; robust chip selection - An integration mention's id is a block type (gmail_v2), not a routable resource — /integrations/[block] expects a slug and a type maps to zero-or-many credentials — so it no longer links to a 404. The chip only shows a pointer/navigates on kinds that resolve to a real page. - Scope the block-leaf selection ring off the mention chip robustly (covers a node-view wrapper via :has), so a selected chip shows a subtle fill, not the outline. * feat(icypeas): update brand icon and bgColor; regenerate integration docs * fix(rich-editor): remove the misfiring chip selection fill (full-width gray band) The :has fill could paint a full-width band; drop it. A selected chip just skips the block-leaf outline ring and uses the same native text-selection highlight as the prose. * feat(rich-editor): show an "Uploading…" toast while an image uploads A persistent progress toast appears per image during upload and is dismissed once it settles, when the upload hook's "Uploaded"/"Failed" toast takes over — previously nothing showed until the upload finished. * refactor(rich-editor): drop inline comments (TSDoc on the declarations instead) Fold the image-upload toast note into the insert function's TSDoc and remove the remaining inline // comments. * refactor(rich-editor): cleanup + simplify pass over the markdown editor - Delete dead parseSimHref (+ barrel/test); mentions parse via the node tokenizer - Extract serializeMarkdownDocument — one canonical serialize pipeline shared by the dirty-check baseline and the round-trip-safety probe (was inlined in both) - Extract selectLeafAcross — shared tail of the two arrow leaf-selection handlers - Reset the suggestion active-row during render (prevX idiom) instead of an effect - Inline the skill modal's trivial hasChanges (drop the useMemo) - image.tsx: cn() over a template-literal className * refactor(rich-editor): share the suggestion-list shell and link-URL editor - Extract SuggestionList: the grouped-list surface, empty state, listbox/option a11y structure, and active-row/hover/select wiring shared by the @ and / menus. Each menu keeps only its own grouping + itemKey/renderItem. - Extract link-editing (LinkUrlInput + applyLink): the inline link field and the normalize→extendMarkRange→set/unset commit logic, shared by the bubble menu and the link hover card. * improvement(settings): align access-control detail UI + nav-driven docs link - Move permission-group Save/Discard into the detail header (matching secrets/whitelabeling) and delete the one-off sticky 'Unsaved changes' bar - Convert the Platform and Blocks config tabs to SettingsSection (drop the custom multi-column masonry + hand-rolled section labels); add an optional far-right action slot to SettingsSection for the per-section Select All - Replace the file-share auth-mode checkboxes with a multi-select ChipDropdown - Normalize per-tab spacing to gap-7, align the expand-chevron token to --text-icon, and match the list-row arrow size to the integrations precedent - Add a nav docsLink surfaced as a header 'Docs' ChipLink by SettingsPanel, wired for the six enterprise settings pages * feat(rich-editor): copy-link button shows a checkmark on copy Use the shared useCopyToClipboard hook so the link hover card's Copy button swaps to a Check for ~2s after copying, matching the rest of the platform. * fix(rich-editor): RichMarkdownField falls back to raw text for lossy markdown Mirror the file editor's safety gate: decide once from the initial value via isRoundTripSafe — round-trip-safe content opens in the WYSIWYG editor, while lossy markdown (raw HTML, footnotes, comments) edits as raw text, so an edit can't silently drop those constructs. * feat(rich-editor): divider/leaf editing — backspace, select-all, gap cursor - Backspace at the start of an empty block whose previous sibling is a divider/image removes the blank line (instead of deleting the leaf) and selects the divider above; a non-empty block selects the leaf so a second Backspace deletes it (highlight-before-delete). - Select-all (and any range selection) now visibly highlights dividers/images, which the native text highlight skips because leaves carry no text — via a decoration that paints a selection band. - The gap cursor between two adjacent leaves no longer draws its stray caret (matching Linear); the position stays functional. Leading/trailing gap cursors keep their caret. - Unit tests for the backspace + select-all behavior. * refactor(rich-editor): decouple headless bundle, fix linked-image round-trip, a11y - Split mention-node into the schema-only `MarkdownMention` (mention-node.ts, no React/registry) and the live `MentionChip` node view (mention-chip.tsx); move the live factory to editor-extensions.ts and inject node views via DI. The headless round-trip path (markdown-parse/normalize-content/round-trip-safety) no longer pulls the 269-block registry — it now bundles for the browser with zero node-builtin deps. - A sized + linked image serializes as `[![alt](src)](href)` (dropping the unrepresentable size) instead of `[<img>](href)`, which the tokenizer can't reparse — the link is preserved, no silent data loss. Also escape the href title symmetrically. - Wire the suggestion menus as an ARIA combobox: while open, the editor gets aria-haspopup/expanded/controls and an aria-activedescendant tracking the active option, so screen readers announce it; cleared on close. Empty state is a role=status live region. * fix(rich-editor): exempt an active @-mention query from the per-group cap The per-group MAX_PER_GROUP limit is meant to keep the unfiltered menu from flooding; applying it while a query is active hid matches past the eighth in a category, so search couldn't reach them. Cap only when there's no query. Adds a regression test (12 matches shown when searching). * fix(rich-editor): mention icon fallback + typed sim-link input rule - mentionIcon never returns undefined: an empty/unrecognized kind (schema default '', or a future kind on a sim: link) falls back to a generic icon instead of crashing the chip's render. Adds tests. - Add a mention input rule so typing `[label](sim:kind/id)` becomes a chip on the closing paren — matching the paste/load path (the tokenizer), which previously left typed syntax as literal text. A plain InputRule (full-range replace) is used; nodeInputRule would keep the surrounding brackets. * fix(rich-editor): raw-fallback paste hook + bound the filtered mention list - RawMarkdownField now honors onPasteText (e.g. skill SKILL.md destructuring), so a full-document paste is intercepted in the raw fallback too, not only the WYSIWYG path. - Bound the @-mention list while filtering (MAX_WHEN_FILTERED) so lifting the per-group cap for search can't render thousands of rows in the non-virtualized menu on a broad query; search still reaches deep matches well before the bound. Adds a test. - Tighten an extensions.ts doc comment (the headless path omits the registry + node-view construction, not React itself).
1 parent 954de05 commit c7eda5b

66 files changed

Lines changed: 3385 additions & 814 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/docs/components/icons.tsx

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3425,36 +3425,6 @@ export function AzureIcon(props: SVGProps<SVGSVGElement>) {
34253425
)
34263426
}
34273427

3428-
export function AzureDevOpsIcon(props: SVGProps<SVGSVGElement>) {
3429-
const id = useId()
3430-
const gradientId = `azure_devops_gradient_${id}`
3431-
return (
3432-
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 128 128' {...props}>
3433-
<defs>
3434-
<linearGradient
3435-
id={gradientId}
3436-
gradientUnits='userSpaceOnUse'
3437-
x1='9'
3438-
y1='16.97'
3439-
x2='9'
3440-
y2='1.03'
3441-
gradientTransform='scale(7.11111)'
3442-
>
3443-
<stop offset='0' stopColor='#0078d4' />
3444-
<stop offset='.16' stopColor='#1380da' />
3445-
<stop offset='.53' stopColor='#3c91e5' />
3446-
<stop offset='.82' stopColor='#559cec' />
3447-
<stop offset='1' stopColor='#5ea0ef' />
3448-
</linearGradient>
3449-
</defs>
3450-
<path
3451-
fill={`url(#${gradientId})`}
3452-
d='M120.89 28.445v69.262l-28.445 23.324-44.09-16.07v15.93L23.395 88.25l72.746 5.688V31.574ZM96.64 31.93 55.82 7.11v16.285L18.348 34.418 7.109 48.852v32.785l16.075 7.11V46.718Zm0 0'
3453-
/>
3454-
</svg>
3455-
)
3456-
}
3457-
34583428
export const GroqIcon = (props: SVGProps<SVGSVGElement>) => (
34593429
<svg
34603430
{...props}
@@ -3480,6 +3450,16 @@ export const DeepseekIcon = (props: SVGProps<SVGSVGElement>) => (
34803450
</svg>
34813451
)
34823452

3453+
export const SakanaIcon = (props: SVGProps<SVGSVGElement>) => (
3454+
<svg {...props} height='1em' viewBox='152 5 38 30' width='1em' xmlns='http://www.w3.org/2000/svg'>
3455+
<title>Sakana AI</title>
3456+
<path
3457+
d='m187.2 7.8-2.5-0.7c-6.3-1.8-12.7-1.2-18 1.5l-10.2 5.7c-1.2 0.7-0.2 2.5 1 1.8l7.6-4.4c0.8 1.7 1.5 4 1.1 7.7-1.4-0.3-6-1.4-10.9 1.5-0.6 0.3-0.8 1.1-0.3 1.7 0.5 0.5 1.2 0.3 1.3 0.2 2.2-1.3 5.6-2.4 9.6-1.4-0.7 2.5-2.5 5.6-6 7.8-1.5 0.7-0.4 2.3 0.7 1.8 1.8-1 5.3-3.4 6.9-9 2.1 0.9 4.2 2.4 5.9 4.6l-7.2 4.1c-1.2 0.6-0.3 2.4 1.1 1.7l9-5c4.6-2.7 8.3-7.5 10.1-13.1l1.3-5.3c0.4-0.4 0-1.1-0.5-1.2zm-11.5 17.5-0.6 0.4c-2-2.6-4.5-4.7-7.5-5.7 0.5-3.8-0.3-6.8-1.2-9.1l1.1-0.6c4.8-2 9.8-2.7 16.2-0.9l1.6 0.4-0.8 2.7c-1.5 4.9-4.5 9.6-8.8 12.8z'
3458+
fill='#E60000'
3459+
/>
3460+
</svg>
3461+
)
3462+
34833463
export function GeminiIcon(props: SVGProps<SVGSVGElement>) {
34843464
const id = useId()
34853465
const gradientId = `gemini_gradient_${id}`
@@ -7989,20 +7969,28 @@ export function DropcontactIcon(props: SVGProps<SVGSVGElement>) {
79897969
)
79907970
}
79917971

7992-
/** Icypeas brand icon: dark tile with the teal ring + rising-chart mark. */
7972+
/** Icypeas brand icon: light tile with the teal ring + rising-step mark. */
79937973
export function IcypeasIcon(props: SVGProps<SVGSVGElement>) {
79947974
return (
7995-
<svg {...props} viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'>
7996-
<rect width='24' height='24' rx='5' fill='#011C21' />
7997-
<circle cx='12' cy='12' r='7' stroke='#02C29F' strokeWidth='1.7' />
7998-
<path
7999-
d='M7.2 13.8H9.2V11.8H11.2V9.8H13.2V8.2'
8000-
stroke='#02C29F'
8001-
strokeWidth='1.7'
8002-
strokeLinecap='round'
8003-
strokeLinejoin='round'
8004-
/>
8005-
<rect x='13.5' y='5.8' width='2.9' height='2.9' rx='0.8' fill='#02C29F' />
7975+
<svg {...props} viewBox='0 0 35 33' fill='none' xmlns='http://www.w3.org/2000/svg'>
7976+
<rect width='35' height='33' rx='5' fill='#d4d4d4' />
7977+
<g clipPath='url(#clip0_4921_13194)'>
7978+
<path
7979+
fillRule='evenodd'
7980+
clipRule='evenodd'
7981+
d='M28.3135 26.7188C30.6959 23.8465 31.9998 20.2319 31.9996 16.5001C31.9997 16.4657 31.9997 16.4313 31.9995 16.3969C31.9984 16.1571 31.8011 15.9668 31.5613 15.9668H28.8968C28.6439 15.9668 28.4428 16.1775 28.444 16.4304C28.4441 16.4536 28.4441 16.4769 28.4441 16.5001C28.4468 19.302 27.5055 22.0231 25.772 24.2243C24.0385 26.4256 21.614 27.9786 18.8896 28.6329C16.1651 29.2871 13.2998 29.0044 10.7557 27.8304C8.2117 26.6563 6.13739 24.6594 4.8675 22.1619C3.5976 19.6643 3.20617 16.8118 3.75638 14.0644C4.30658 11.3171 5.76632 8.83529 7.90008 7.01938C10.0338 5.20347 12.7172 4.15938 15.5171 4.05558C18.317 3.95178 21.0703 4.79433 23.3326 6.44727C23.7452 6.74856 24.1384 7.0753 24.5101 7.42553C24.6375 7.54563 24.805 7.61515 24.9801 7.61515H27.3326C27.5781 7.61515 27.7771 7.41617 27.7771 7.17071V5.92856C27.7771 5.76143 27.7147 5.59993 27.5996 5.47875C25.093 2.83948 21.7593 1.13142 18.1474 0.641099C14.4495 0.139119 10.6925 0.945072 7.52589 2.91961C4.35929 4.89414 1.98218 7.91312 0.805595 11.4546C-0.370995 14.996 -0.273106 18.8373 1.08234 22.3142C2.43778 25.7911 4.96556 28.6851 8.22863 30.4958C11.4917 32.3064 15.2849 32.92 18.9524 32.2303C22.6199 31.5406 25.9311 29.5911 28.3135 26.7188Z'
7982+
fill='#02C29F'
7983+
/>
7984+
<path
7985+
d='M34.2217 9.16585C34.2217 9.53404 33.9232 9.83252 33.555 9.83252H30.8883C30.5202 9.83252 30.2217 10.131 30.2217 10.4992V13.1668C30.2217 13.535 29.9232 13.8335 29.555 13.8335H26.8883C26.5202 13.8335 26.2217 14.132 26.2217 14.5002V17.1659C26.2217 17.534 25.9232 17.8325 25.555 17.8325H22.8874C22.5192 17.8325 22.2207 18.131 22.2207 18.4992V21.1668C22.2207 21.535 21.9222 21.8335 21.554 21.8335H18.8883C18.5202 21.8335 18.2217 22.132 18.2217 22.5002V25.1659C18.2217 25.534 17.9232 25.8325 17.555 25.8325H14.444C14.0758 25.8325 13.7773 25.534 13.7773 25.1659V22.5002C13.7773 22.132 13.4789 21.8335 13.1107 21.8335H10.443C10.0748 21.8335 9.77637 21.535 9.77637 21.1668V18.4992C9.77637 18.131 9.47789 17.8325 9.1097 17.8325H6.44401C6.07582 17.8325 5.77734 17.534 5.77734 17.1659V14.0548C5.77734 13.6867 6.07582 13.3882 6.44401 13.3882H9.55501C9.9232 13.3882 10.2217 13.6867 10.2217 14.0548V16.7225C10.2217 17.0907 10.5202 17.3892 10.8883 17.3892H13.554C13.9222 17.3892 14.2207 17.6876 14.2207 18.0558V20.7215C14.2207 21.0897 14.5192 21.3882 14.8874 21.3882H17.1097C17.4779 21.3882 17.7764 21.0897 17.7764 20.7215V18.0558C17.7764 17.6876 18.0748 17.3892 18.443 17.3892H21.1107C21.4789 17.3892 21.7773 17.0907 21.7773 16.7225V14.0549C21.7773 13.6867 22.0758 13.3882 22.444 13.3882H25.1107C25.4789 13.3882 25.7773 13.0897 25.7773 12.7215V10.0558C25.7773 9.68764 26.0758 9.38916 26.444 9.38916H29.1107C29.4789 9.38916 29.7773 9.09068 29.7773 8.72249V6.05485C29.7773 5.68666 30.0758 5.38818 30.444 5.38818H33.555C33.9232 5.38818 34.2217 5.68666 34.2217 6.05485V9.16585Z'
7986+
fill='#02C29F'
7987+
/>
7988+
</g>
7989+
<defs>
7990+
<clipPath id='clip0_4921_13194'>
7991+
<rect width='35' height='33' fill='white' />
7992+
</clipPath>
7993+
</defs>
80067994
</svg>
80077995
)
80087996
}

apps/docs/content/docs/en/integrations/file.mdx

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: File
3-
description: Read, get content, fetch, write, append, compress, and decompress files
3+
description: Read, get content, fetch, write, append, compress, decompress, and manage sharing for files
44
---
55

66
import { BlockInfoCard } from "@/components/ui/block-info-card"
@@ -12,7 +12,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
1212

1313
## Usage Instructions
1414

15-
Read workspace file objects, extract the text content of files, fetch and parse files from URLs with optional headers, write new workspace files, append content to existing files, compress files into a .zip archive, or extract a .zip archive into the workspace.
15+
Read workspace file objects, extract the text content of files, fetch and parse files from URLs with optional headers, write new workspace files, append content to existing files, compress files into a .zip archive, extract a .zip archive into the workspace, or manage the public share link for a file.
1616

1717

1818

@@ -147,4 +147,29 @@ Extract the contents of a .zip archive into the workspace, preserving the archiv
147147
| --------- | ---- | ----------- |
148148
| `files` | file[] | Extracted workspace file objects |
149149

150+
### `file_manage_sharing`
151+
152+
Enable or disable the public share link for a workspace file, and set its access mode (public, password, email, or SSO). Idempotent: the public link stays stable across changes.
153+
154+
#### Input
155+
156+
| Parameter | Type | Required | Description |
157+
| --------- | ---- | -------- | ----------- |
158+
| `fileId` | string | No | Canonical ID of the workspace file to update sharing for. |
159+
| `fileInput` | file | No | Selected workspace file object \(from the file picker\). |
160+
| `isActive` | boolean | Yes | Whether the public link is enabled. Set to false to make the file private. |
161+
| `authType` | string | No | Access mode for the link: "public", "password", "email", or "sso". Defaults to "public". |
162+
| `password` | string | No | Password to protect the link. Required when authType is "password". |
163+
| `allowedEmails` | array | No | Allowed emails or "@domain" patterns. Required when authType is "email" or "sso". |
164+
165+
#### Output
166+
167+
| Parameter | Type | Description |
168+
| --------- | ---- | ----------- |
169+
| `url` | string | Public share URL for the file |
170+
| `isActive` | boolean | Whether the public link is enabled |
171+
| `authType` | string | Access mode: public, password, email, or sso |
172+
| `hasPassword` | boolean | Whether the share is password-protected |
173+
| `allowedEmails` | array | Allowed emails/domains for email or SSO access |
174+
150175

apps/docs/content/docs/en/integrations/icypeas.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
77

88
<BlockInfoCard
99
type="icypeas"
10-
color="#0EA5E9"
10+
color="#d4d4d4"
1111
/>
1212

1313
{/* MANUAL-CONTENT-START:intro */}

apps/docs/content/docs/en/integrations/pagerduty.mdx

Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,3 +215,245 @@ List current on-call entries from PagerDuty.
215215
| `more` | boolean | Whether more results are available |
216216

217217

218+
219+
## Triggers
220+
221+
A **Trigger** is a block that starts a workflow when an event happens in this service.
222+
223+
### PagerDuty Incident Acknowledged
224+
225+
Trigger workflow when an incident is acknowledged in PagerDuty
226+
227+
#### Configuration
228+
229+
| Parameter | Type | Required | Description |
230+
| --------- | ---- | -------- | ----------- |
231+
| `apiKey` | string | Yes | Used to create the webhook subscription. Must be a read/write REST API key. |
232+
233+
#### Output
234+
235+
| Parameter | Type | Description |
236+
| --------- | ---- | ----------- |
237+
| `event_id` | string | Unique ID of the webhook event |
238+
| `event_type` | string | Event type \(e.g. incident.triggered, incident.resolved\) |
239+
| `occurred_at` | string | When the event occurred \(ISO 8601\) |
240+
| `agent` | json | The user or service that caused the event \(may be null\) |
241+
| `incident` | object | incident output from the tool |
242+
|`id` | string | Incident ID |
243+
|`number` | number | Incident number |
244+
|`title` | string | Incident title |
245+
|`status` | string | Incident status \(triggered, acknowledged, resolved\) |
246+
|`urgency` | string | Incident urgency \(high or low\) |
247+
|`html_url` | string | Web URL of the incident |
248+
|`created_at` | string | Incident creation timestamp |
249+
|`priority` | string | Priority label \(may be null\) |
250+
|`service` | object | service output from the tool |
251+
|`id` | string | Service ID |
252+
|`summary` | string | Service name |
253+
|`html_url` | string | Service web URL |
254+
|`escalation_policy` | object | escalation_policy output from the tool |
255+
|`id` | string | Escalation policy ID |
256+
|`summary` | string | Escalation policy name |
257+
|`html_url` | string | Escalation policy web URL |
258+
|`assignees` | json | Array of assignee references \(\{ id, summary, html_url \}\) |
259+
260+
261+
---
262+
263+
### PagerDuty Incident Escalated
264+
265+
Trigger workflow when an incident is escalated in PagerDuty
266+
267+
#### Configuration
268+
269+
| Parameter | Type | Required | Description |
270+
| --------- | ---- | -------- | ----------- |
271+
| `apiKey` | string | Yes | Used to create the webhook subscription. Must be a read/write REST API key. |
272+
273+
#### Output
274+
275+
| Parameter | Type | Description |
276+
| --------- | ---- | ----------- |
277+
| `event_id` | string | Unique ID of the webhook event |
278+
| `event_type` | string | Event type \(e.g. incident.triggered, incident.resolved\) |
279+
| `occurred_at` | string | When the event occurred \(ISO 8601\) |
280+
| `agent` | json | The user or service that caused the event \(may be null\) |
281+
| `incident` | object | incident output from the tool |
282+
|`id` | string | Incident ID |
283+
|`number` | number | Incident number |
284+
|`title` | string | Incident title |
285+
|`status` | string | Incident status \(triggered, acknowledged, resolved\) |
286+
|`urgency` | string | Incident urgency \(high or low\) |
287+
|`html_url` | string | Web URL of the incident |
288+
|`created_at` | string | Incident creation timestamp |
289+
|`priority` | string | Priority label \(may be null\) |
290+
|`service` | object | service output from the tool |
291+
|`id` | string | Service ID |
292+
|`summary` | string | Service name |
293+
|`html_url` | string | Service web URL |
294+
|`escalation_policy` | object | escalation_policy output from the tool |
295+
|`id` | string | Escalation policy ID |
296+
|`summary` | string | Escalation policy name |
297+
|`html_url` | string | Escalation policy web URL |
298+
|`assignees` | json | Array of assignee references \(\{ id, summary, html_url \}\) |
299+
300+
301+
---
302+
303+
### PagerDuty Incident Event
304+
305+
Trigger workflow from any PagerDuty incident event
306+
307+
#### Configuration
308+
309+
| Parameter | Type | Required | Description |
310+
| --------- | ---- | -------- | ----------- |
311+
| `apiKey` | string | Yes | Used to create the webhook subscription. Must be a read/write REST API key. |
312+
313+
#### Output
314+
315+
| Parameter | Type | Description |
316+
| --------- | ---- | ----------- |
317+
| `event_id` | string | Unique ID of the webhook event |
318+
| `event_type` | string | Event type \(e.g. incident.triggered, incident.resolved\) |
319+
| `occurred_at` | string | When the event occurred \(ISO 8601\) |
320+
| `agent` | json | The user or service that caused the event \(may be null\) |
321+
| `incident` | object | incident output from the tool |
322+
|`id` | string | Incident ID |
323+
|`number` | number | Incident number |
324+
|`title` | string | Incident title |
325+
|`status` | string | Incident status \(triggered, acknowledged, resolved\) |
326+
|`urgency` | string | Incident urgency \(high or low\) |
327+
|`html_url` | string | Web URL of the incident |
328+
|`created_at` | string | Incident creation timestamp |
329+
|`priority` | string | Priority label \(may be null\) |
330+
|`service` | object | service output from the tool |
331+
|`id` | string | Service ID |
332+
|`summary` | string | Service name |
333+
|`html_url` | string | Service web URL |
334+
|`escalation_policy` | object | escalation_policy output from the tool |
335+
|`id` | string | Escalation policy ID |
336+
|`summary` | string | Escalation policy name |
337+
|`html_url` | string | Escalation policy web URL |
338+
|`assignees` | json | Array of assignee references \(\{ id, summary, html_url \}\) |
339+
340+
341+
---
342+
343+
### PagerDuty Incident Reassigned
344+
345+
Trigger workflow when an incident is reassigned in PagerDuty
346+
347+
#### Configuration
348+
349+
| Parameter | Type | Required | Description |
350+
| --------- | ---- | -------- | ----------- |
351+
| `apiKey` | string | Yes | Used to create the webhook subscription. Must be a read/write REST API key. |
352+
353+
#### Output
354+
355+
| Parameter | Type | Description |
356+
| --------- | ---- | ----------- |
357+
| `event_id` | string | Unique ID of the webhook event |
358+
| `event_type` | string | Event type \(e.g. incident.triggered, incident.resolved\) |
359+
| `occurred_at` | string | When the event occurred \(ISO 8601\) |
360+
| `agent` | json | The user or service that caused the event \(may be null\) |
361+
| `incident` | object | incident output from the tool |
362+
|`id` | string | Incident ID |
363+
|`number` | number | Incident number |
364+
|`title` | string | Incident title |
365+
|`status` | string | Incident status \(triggered, acknowledged, resolved\) |
366+
|`urgency` | string | Incident urgency \(high or low\) |
367+
|`html_url` | string | Web URL of the incident |
368+
|`created_at` | string | Incident creation timestamp |
369+
|`priority` | string | Priority label \(may be null\) |
370+
|`service` | object | service output from the tool |
371+
|`id` | string | Service ID |
372+
|`summary` | string | Service name |
373+
|`html_url` | string | Service web URL |
374+
|`escalation_policy` | object | escalation_policy output from the tool |
375+
|`id` | string | Escalation policy ID |
376+
|`summary` | string | Escalation policy name |
377+
|`html_url` | string | Escalation policy web URL |
378+
|`assignees` | json | Array of assignee references \(\{ id, summary, html_url \}\) |
379+
380+
381+
---
382+
383+
### PagerDuty Incident Resolved
384+
385+
Trigger workflow when an incident is resolved in PagerDuty
386+
387+
#### Configuration
388+
389+
| Parameter | Type | Required | Description |
390+
| --------- | ---- | -------- | ----------- |
391+
| `apiKey` | string | Yes | Used to create the webhook subscription. Must be a read/write REST API key. |
392+
393+
#### Output
394+
395+
| Parameter | Type | Description |
396+
| --------- | ---- | ----------- |
397+
| `event_id` | string | Unique ID of the webhook event |
398+
| `event_type` | string | Event type \(e.g. incident.triggered, incident.resolved\) |
399+
| `occurred_at` | string | When the event occurred \(ISO 8601\) |
400+
| `agent` | json | The user or service that caused the event \(may be null\) |
401+
| `incident` | object | incident output from the tool |
402+
|`id` | string | Incident ID |
403+
|`number` | number | Incident number |
404+
|`title` | string | Incident title |
405+
|`status` | string | Incident status \(triggered, acknowledged, resolved\) |
406+
|`urgency` | string | Incident urgency \(high or low\) |
407+
|`html_url` | string | Web URL of the incident |
408+
|`created_at` | string | Incident creation timestamp |
409+
|`priority` | string | Priority label \(may be null\) |
410+
|`service` | object | service output from the tool |
411+
|`id` | string | Service ID |
412+
|`summary` | string | Service name |
413+
|`html_url` | string | Service web URL |
414+
|`escalation_policy` | object | escalation_policy output from the tool |
415+
|`id` | string | Escalation policy ID |
416+
|`summary` | string | Escalation policy name |
417+
|`html_url` | string | Escalation policy web URL |
418+
|`assignees` | json | Array of assignee references \(\{ id, summary, html_url \}\) |
419+
420+
421+
---
422+
423+
### PagerDuty Incident Triggered
424+
425+
Trigger workflow when a new incident is triggered in PagerDuty
426+
427+
#### Configuration
428+
429+
| Parameter | Type | Required | Description |
430+
| --------- | ---- | -------- | ----------- |
431+
| `apiKey` | string | Yes | Used to create the webhook subscription. Must be a read/write REST API key. |
432+
433+
#### Output
434+
435+
| Parameter | Type | Description |
436+
| --------- | ---- | ----------- |
437+
| `event_id` | string | Unique ID of the webhook event |
438+
| `event_type` | string | Event type \(e.g. incident.triggered, incident.resolved\) |
439+
| `occurred_at` | string | When the event occurred \(ISO 8601\) |
440+
| `agent` | json | The user or service that caused the event \(may be null\) |
441+
| `incident` | object | incident output from the tool |
442+
|`id` | string | Incident ID |
443+
|`number` | number | Incident number |
444+
|`title` | string | Incident title |
445+
|`status` | string | Incident status \(triggered, acknowledged, resolved\) |
446+
|`urgency` | string | Incident urgency \(high or low\) |
447+
|`html_url` | string | Web URL of the incident |
448+
|`created_at` | string | Incident creation timestamp |
449+
|`priority` | string | Priority label \(may be null\) |
450+
|`service` | object | service output from the tool |
451+
|`id` | string | Service ID |
452+
|`summary` | string | Service name |
453+
|`html_url` | string | Service web URL |
454+
|`escalation_policy` | object | escalation_policy output from the tool |
455+
|`id` | string | Escalation policy ID |
456+
|`summary` | string | Escalation policy name |
457+
|`html_url` | string | Escalation policy web URL |
458+
|`assignees` | json | Array of assignee references \(\{ id, summary, html_url \}\) |
459+

0 commit comments

Comments
 (0)