@opengeni/react 6.5.2-canary.41607687019001 → 6.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/app-state.d.ts +4 -0
- package/dist/app/app-state.js +19 -14
- package/dist/app/components/Composer.js +25 -23
- package/dist/app/components/agent/agent-capability-picker.js +10 -8
- package/dist/app/components/artifacts/artifact-browse-controls.js +4 -4
- package/dist/app/components/artifacts/artifact-library.js +21 -19
- package/dist/app/components/artifacts/artifact-page-chrome.js +3 -3
- package/dist/app/components/artifacts/artifact-viewer.js +23 -22
- package/dist/app/components/artifacts/artifact-viewer.js.map +1 -1
- package/dist/app/components/artifacts/chat-interactive-block.js +12 -12
- package/dist/app/components/artifacts/copy-artifact-link.js +7 -5
- package/dist/app/components/artifacts/file-reach-dialog.js +11 -9
- package/dist/app/components/artifacts/inline-chat-image.js +18 -18
- package/dist/app/components/artifacts/retained-file-preview.js +24 -23
- package/dist/app/components/artifacts/retained-text-preview.js +3 -3
- package/dist/app/components/artifacts/site-audience.js +6 -5
- package/dist/app/components/artifacts/site-conversations.js +16 -14
- package/dist/app/components/artifacts/site-data.js +18 -16
- package/dist/app/components/artifacts/site-public-link.js +3 -2
- package/dist/app/components/artifacts/site-publishing-page.js +39 -37
- package/dist/app/components/artifacts/site-publishing.js +34 -32
- package/dist/app/components/artifacts/site-settings.js +38 -36
- package/dist/app/components/artifacts/site-version-menu.js +8 -7
- package/dist/app/components/billing-class-mark.js +3 -3
- package/dist/app/components/bots/bot-launch-strip.js +17 -17
- package/dist/app/components/bots/bot-template-dialog.js +30 -28
- package/dist/app/components/bots/bot-template-shortcuts.js +19 -19
- package/dist/app/components/bots/bot-templates-page.js +38 -36
- package/dist/app/components/bots/bot-templates-page.js.map +1 -1
- package/dist/app/components/capabilities/capability-detail-sheet.js +13 -11
- package/dist/app/components/capabilities/capability-logo-source.js +13 -13
- package/dist/app/components/capabilities/capability-logo.js +4 -3
- package/dist/app/components/capabilities/connector-tool-permissions.js +8 -6
- package/dist/app/components/capabilities/native-connect-setup.js +14 -14
- package/dist/app/components/capabilities/own-logins-shared-heads-up.js +7 -6
- package/dist/app/components/capabilities/perform-capability-action.js +7 -6
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +17 -17
- package/dist/app/components/capabilities/session-capability-card.js +72 -70
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.js +28 -26
- package/dist/app/components/capabilities/session-connection-accounts.js +4 -3
- package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -19
- package/dist/app/components/capabilities/session-github-card.js +22 -20
- package/dist/app/components/capabilities/session-machine-card.js +27 -25
- package/dist/app/components/capabilities/session-personal-github-card.js +16 -16
- package/dist/app/components/capabilities/session-plugin-card.js +10 -9
- package/dist/app/components/capabilities/use-capabilities-catalog.js +4 -3
- package/dist/app/components/capabilities/use-connection-accounts.js +5 -4
- package/dist/app/components/command-menu/chat-status.js +15 -13
- package/dist/app/components/command-menu/chat-switcher.js +35 -33
- package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
- package/dist/app/components/command-menu/command-menu.js +53 -50
- package/dist/app/components/command-menu/command-menu.js.map +1 -1
- package/dist/app/components/command-menu/shortcut-sheet.js +18 -16
- package/dist/app/components/command-menu/shortcut-sheet.js.map +1 -1
- package/dist/app/components/common.js +4 -3
- package/dist/app/components/composer-capabilities-menu-body.js +4 -4
- package/dist/app/components/composer-mobile-plus-panel.js +8 -8
- package/dist/app/components/composer-mobile-plus.js +1 -1
- package/dist/app/components/credit-required-gate.js +3 -3
- package/dist/app/components/credit-required-prompt.js +10 -8
- package/dist/app/components/credit-required-prompt.js.map +1 -1
- package/dist/app/components/credits/checkout-credits-celebration.js +3 -2
- package/dist/app/components/credits/checkout-return.js +3 -2
- package/dist/app/components/credits/checkout-return.js.map +1 -1
- package/dist/app/components/credits/coupon-redeem.js +5 -4
- package/dist/app/components/credits/credit-refusal-notice.js +7 -5
- package/dist/app/components/cross-slot-deep-link-recovery.js +5 -4
- package/dist/app/components/desktop/app-shots.js +13 -11
- package/dist/app/components/desktop/computer-use.js +6 -4
- package/dist/app/components/desktop/this-computer.js +9 -7
- package/dist/app/components/feedback.js +5 -4
- package/dist/app/components/follow-up-repository-menu-body.js +8 -6
- package/dist/app/components/follow-up-repository-menu-body.js.map +1 -1
- package/dist/app/components/follow-up-repository-picker.js +1 -1
- package/dist/app/components/github-app-connect-launcher.js +5 -4
- package/dist/app/components/in-app-help-link.js +3 -3
- package/dist/app/components/knowledge/agent-learning-settings.js +3 -2
- package/dist/app/components/knowledge/agent-learning-settings.js.map +1 -1
- package/dist/app/components/machines/connect-machine-dialog.js +18 -16
- package/dist/app/components/manual-repository-editor.js +3 -2
- package/dist/app/components/markdown.js +6 -6
- package/dist/app/components/models/models-ui.js +12 -10
- package/dist/app/components/my-things.js +12 -10
- package/dist/app/components/my-things.js.map +1 -1
- package/dist/app/components/new-session-starters.js +3 -3
- package/dist/app/components/own-where-it-works.js +9 -7
- package/dist/app/components/personal-resource-attachment-surface.js +4 -4
- package/dist/app/components/pickers.js +5 -5
- package/dist/app/components/rail/channel-create-dialog.js +7 -5
- package/dist/app/components/rail/project-glyph.js +17 -17
- package/dist/app/components/rail/project-profile.js +31 -29
- package/dist/app/components/rail/rail-context.js +3 -3
- package/dist/app/components/rail/rail-sections.js +68 -66
- package/dist/app/components/rail/session-header.js +59 -57
- package/dist/app/components/rail/session-list.js +66 -64
- package/dist/app/components/rail/session-row-content.js +4 -4
- package/dist/app/components/rail/session-row-hover-details.js +14 -12
- package/dist/app/components/rail/session-shell.js +90 -88
- package/dist/app/components/rail/site-session-group-heading.js +8 -8
- package/dist/app/components/repository-picker.js +8 -6
- package/dist/app/components/secrets/session-secrets-panel.js +4 -3
- package/dist/app/components/secrets/vault-model.js +3 -2
- package/dist/app/components/session/agent-configuration-panel.js +25 -23
- package/dist/app/components/session/agent-configuration-panel.js.map +1 -1
- package/dist/app/components/session/artifact-link-boundary.js +3 -3
- package/dist/app/components/session/artifact-session-page.js +11 -9
- package/dist/app/components/session/banners.js +8 -8
- package/dist/app/components/session/codex-usage-notice.js +5 -3
- package/dist/app/components/session/console-new-conversation.js +42 -40
- package/dist/app/components/session/context-text-reader.js +3 -2
- package/dist/app/components/session/descendant-requests.js +39 -37
- package/dist/app/components/session/descendant-requests.js.map +1 -1
- package/dist/app/components/session/editable-artifacts-workspace.js +36 -34
- package/dist/app/components/session/editable-artifacts-workspace.js.map +1 -1
- package/dist/app/components/session/failed-session-banner.js +13 -11
- package/dist/app/components/session/failed-session-banner.js.map +1 -1
- package/dist/app/components/session/failure-recovery-boundary.js +3 -3
- package/dist/app/components/session/human-input-delegation-record.js +2 -2
- package/dist/app/components/session/human-input.js +33 -31
- package/dist/app/components/session/inspector.js +57 -55
- package/dist/app/components/session/inspector.js.map +1 -1
- package/dist/app/components/session/message-actions.js +5 -4
- package/dist/app/components/session/message-actions.js.map +1 -1
- package/dist/app/components/session/message-resource-attachments.js +12 -11
- package/dist/app/components/session/message-resource-attachments.js.map +1 -1
- package/dist/app/components/session/model-context-inspector.js +6 -4
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +11 -9
- package/dist/app/components/session/new-session-setup-strip.js +18 -18
- package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
- package/dist/app/components/session/sandbox-switcher.js +10 -9
- package/dist/app/components/session/sandbox-workspace.js +47 -46
- package/dist/app/components/session/search-markdown-highlight.js +7 -7
- package/dist/app/components/session/search-results-view.js +8 -8
- package/dist/app/components/session/session-admin-access.js +13 -11
- package/dist/app/components/session/session-admission-notice.js +7 -5
- package/dist/app/components/session/session-avatar-picker.js +22 -20
- package/dist/app/components/session/session-avatar.js +16 -16
- package/dist/app/components/session/session-machine-access-notice.js +7 -5
- package/dist/app/components/session/session-profile-dialog.js +29 -27
- package/dist/app/components/session/session-profile-editor.js +30 -28
- package/dist/app/components/session/session-retention.js +10 -8
- package/dist/app/components/session/session-search-dialog.js +10 -10
- package/dist/app/components/session/session-skill-reviews.js +2 -1
- package/dist/app/components/session/session-skill-reviews.js.map +1 -1
- package/dist/app/components/session/session-tenancy-control.js +13 -11
- package/dist/app/components/session/session-tenancy-control.js.map +1 -1
- package/dist/app/components/session/session-unattended-setting.js +7 -5
- package/dist/app/components/session/session-usage-limit-section.js +11 -9
- package/dist/app/components/session/share-chat-dialog.js +9 -7
- package/dist/app/components/session/site-origin-link.js +3 -3
- package/dist/app/components/session/subagents.js +8 -8
- package/dist/app/components/session/subscription-account-indicator.js +6 -6
- package/dist/app/components/session-connectors-menu-body.js +4 -3
- package/dist/app/components/session-connectors-menu-body.js.map +1 -1
- package/dist/app/components/settings/row-select.js +7 -5
- package/dist/app/components/toaster.js +3 -2
- package/dist/app/components/transcription-settings.js +11 -9
- package/dist/app/components/ui/destructive-confirm.js +11 -9
- package/dist/app/components/usage/usage-entry.js +5 -5
- package/dist/app/components/window-bar.js +16 -14
- package/dist/app/components/workspace-composer-plus.js +22 -21
- package/dist/app/components/workspace-reach.js +6 -4
- package/dist/app/components/workspace-tenant-boundary.js +5 -4
- package/dist/app/embed/memory-navigation.js +3 -3
- package/dist/app/embed/session-app.js +211 -209
- package/dist/app/lib/actions/actions-provider.js +15 -13
- package/dist/app/lib/agent-capabilities.js +3 -3
- package/dist/app/lib/app-surfaces.js +7 -6
- package/dist/app/lib/archive-session.d.ts +9 -4
- package/dist/app/lib/archive-session.js +4 -2
- package/dist/app/lib/bot-templates.js +3 -2
- package/dist/app/lib/capabilities.js +3 -2
- package/dist/app/lib/codex-usage-query.js +2 -2
- package/dist/app/lib/composer-connectors.js +17 -16
- package/dist/app/lib/console-site.js +2 -2
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/events.js +9 -9
- package/dist/app/lib/failed-session-copy.js +3 -3
- package/dist/app/lib/inbox.js +4 -2
- package/dist/app/lib/model-access-onboarding.js +3 -3
- package/dist/app/lib/move-chat-to-machine.js +3 -3
- package/dist/app/lib/navigation.js +2 -2
- package/dist/app/lib/session-branch-cache.js +6 -6
- package/dist/app/lib/session-create.js +4 -4
- package/dist/app/lib/session-group-pagination.js +6 -6
- package/dist/app/lib/session-hover-facts.js +13 -11
- package/dist/app/lib/session-model.js +2 -2
- package/dist/app/lib/session-rail.js +3 -3
- package/dist/app/lib/session-rename.js +3 -3
- package/dist/app/lib/session-restart-operation-controller.js +4 -3
- package/dist/app/lib/session-tenancy.js +3 -2
- package/dist/app/lib/session-usage-limit.js +3 -2
- package/dist/app/lib/sessions-group.js +5 -5
- package/dist/app/lib/site-publishing.js +3 -2
- package/dist/app/lib/site-tool-consent-dialog.js +9 -7
- package/dist/app/lib/site-tool-consent-dialog.js.map +1 -1
- package/dist/app/lib/site-tool-consent.js +1 -1
- package/dist/app/lib/subscription-plans.js +3 -2
- package/dist/app/lib/toast.js +2 -1
- package/dist/app/lib/turn-failure-analytics.js +4 -4
- package/dist/app/lib/use-duplicate-site.js +6 -5
- package/dist/app/lib/use-follow-up-repositories.js +6 -5
- package/dist/app/lib/use-workspace-integrations.js +4 -3
- package/dist/app/lib/use-workspace-machines.js +4 -4
- package/dist/app/lib/use-workspace-model-catalog.js +5 -4
- package/dist/app/lib/use-workspace-rigs.js +2 -2
- package/dist/app/lib/workspace-navigation-preference.js +4 -4
- package/dist/app/lib/workspace-scope-context.js +3 -3
- package/dist/app/routes/artifacts.js +67 -66
- package/dist/app/routes/artifacts.js.map +1 -1
- package/dist/app/routes/retained-artifact.js +42 -40
- package/dist/app/routes/retained-artifact.js.map +1 -1
- package/dist/app/routes/session-unavailable.js +8 -7
- package/dist/app/routes/session.js +119 -117
- package/dist/app/routes/sessions-index-hydration.js +5 -5
- package/dist/app/routes/sessions-index.js +104 -102
- package/dist/app/routes/site-view.js +67 -65
- package/dist/app/routes/site-view.js.map +1 -1
- package/dist/artifacts-document.js +4 -4
- package/dist/artifacts-presentation.js +4 -4
- package/dist/artifacts-spreadsheet.js +4 -4
- package/dist/artifacts.js +10 -10
- package/dist/automations.js +17 -15
- package/dist/automations.js.map +1 -1
- package/dist/browser-viewer-TC27OCIP.js +23 -0
- package/dist/chat-interactive-block-RWPQBHVS.js +18 -0
- package/dist/chunk-2BDT3UZQ.js +229 -0
- package/dist/chunk-2CLNIEK4.js +373 -0
- package/dist/chunk-2FSBSCZJ.js +451 -0
- package/dist/chunk-2I7HDP53.js +199 -0
- package/dist/chunk-2INLDVK3.js +15 -0
- package/dist/chunk-2KALVELR.js +126 -0
- package/dist/chunk-2M3J7ZWQ.js +418 -0
- package/dist/chunk-2OP6WLGV.js +708 -0
- package/dist/chunk-2RG7NIAS.js +2936 -0
- package/dist/chunk-2STUPWEL.js +135 -0
- package/dist/chunk-2YUOVM3G.js +271 -0
- package/dist/chunk-2Z3NQNTM.js +3670 -0
- package/dist/chunk-3CPWWGNK.js +920 -0
- package/dist/chunk-3ED2U6XE.js +37 -0
- package/dist/chunk-3GZA4BUW.js +216 -0
- package/dist/chunk-3IK6UYO6.js +1022 -0
- package/dist/chunk-3PZ7JZI2.js +431 -0
- package/dist/chunk-4DVJ6ONS.js +50 -0
- package/dist/chunk-4DVNUCRR.js +2386 -0
- package/dist/chunk-4DVNUCRR.js.map +1 -0
- package/dist/chunk-4E3ZJRTZ.js +41 -0
- package/dist/chunk-4SAWSRAA.js +141 -0
- package/dist/chunk-53AGXXZM.js +307 -0
- package/dist/chunk-54YW6SZZ.js +818 -0
- package/dist/chunk-57AZS3IE.js +2317 -0
- package/dist/chunk-5CPEEAFD.js +143 -0
- package/dist/chunk-5EWSRZ2Y.js +340 -0
- package/dist/chunk-5IE76VCY.js +387 -0
- package/dist/chunk-5NWEKLDZ.js +170 -0
- package/dist/chunk-5O2FCCHZ.js +198 -0
- package/dist/chunk-5QAY6K77.js +399 -0
- package/dist/chunk-5YKW2K6I.js +625 -0
- package/dist/chunk-5YKW2K6I.js.map +1 -0
- package/dist/chunk-6BCXNDEI.js +4116 -0
- package/dist/chunk-6BCXNDEI.js.map +1 -0
- package/dist/chunk-6DK6Z4UN.js +2599 -0
- package/dist/chunk-6DVCC7QS.js +702 -0
- package/dist/chunk-6JHU2UBS.js +2058 -0
- package/dist/chunk-6PZ7OBYU.js +490 -0
- package/dist/chunk-6WD2INST.js +539 -0
- package/dist/chunk-6WD2INST.js.map +1 -0
- package/dist/chunk-6WGRDRMA.js +163 -0
- package/dist/chunk-77WAKEAH.js +186 -0
- package/dist/chunk-7T2ZE3VT.js +5558 -0
- package/dist/chunk-7T2ZE3VT.js.map +1 -0
- package/dist/chunk-7TDO3CUM.js +393 -0
- package/dist/chunk-7TIX2UAR.js +247 -0
- package/dist/chunk-7V5REBCP.js +148 -0
- package/dist/chunk-7VMZGLYI.js +339 -0
- package/dist/chunk-7W37NS3I.js +236 -0
- package/dist/chunk-7X6SDK2C.js +111 -0
- package/dist/chunk-7ZNUHRP5.js +95 -0
- package/dist/chunk-A36PZALD.js +84 -0
- package/dist/chunk-AUI6VA63.js +107 -0
- package/dist/chunk-AW2MQB37.js +24 -0
- package/dist/chunk-AWKES45Y.js +198 -0
- package/dist/chunk-AXHZYXUV.js +132 -0
- package/dist/chunk-BHNSJVBC.js +129 -0
- package/dist/chunk-BJEJFISW.js +50 -0
- package/dist/chunk-BJFH6JI5.js +422 -0
- package/dist/chunk-BMICEQZQ.js +960 -0
- package/dist/chunk-BTLBYBLU.js +29 -0
- package/dist/chunk-BXBDYNRP.js +89 -0
- package/dist/chunk-C372BFOV.js +357 -0
- package/dist/chunk-C43KRXGA.js +234 -0
- package/dist/chunk-C43KRXGA.js.map +1 -0
- package/dist/chunk-CMKGILJK.js +4824 -0
- package/dist/chunk-CRAOSVHC.js +50 -0
- package/dist/chunk-CRU35QQH.js +281 -0
- package/dist/chunk-CUIWCGMA.js +172 -0
- package/dist/chunk-D5TWNFFE.js +38 -0
- package/dist/chunk-DF5EAHDN.js +4461 -0
- package/dist/chunk-DJAXC5OK.js +56 -0
- package/dist/chunk-DXBYWSL5.js +3550 -0
- package/dist/chunk-DXR5PDFP.js +84 -0
- package/dist/chunk-DZWARC4M.js +267 -0
- package/dist/chunk-DZXEDSQI.js +106 -0
- package/dist/chunk-E7XERZWC.js +48 -0
- package/dist/chunk-ECJBYNLJ.js +79 -0
- package/dist/chunk-EDI6SJ2N.js +43 -0
- package/dist/chunk-EWSOC6WF.js +114 -0
- package/dist/chunk-F2OPHAUN.js +103 -0
- package/dist/chunk-F4ISQGGM.js +81 -0
- package/dist/chunk-FO4LYKJL.js +197 -0
- package/dist/chunk-FPXASDG5.js +73 -0
- package/dist/chunk-FSOQDUCG.js +117 -0
- package/dist/chunk-FSOQDUCG.js.map +1 -0
- package/dist/chunk-FVXBNBHO.js +157 -0
- package/dist/chunk-FYWT2O76.js +34 -0
- package/dist/chunk-FYWT2O76.js.map +1 -0
- package/dist/chunk-FZC5N55X.js +981 -0
- package/dist/chunk-GAVYGBFI.js +99 -0
- package/dist/chunk-GFIMOUDT.js +846 -0
- package/dist/chunk-GFIMOUDT.js.map +1 -0
- package/dist/chunk-GKVJIDHF.js +33 -0
- package/dist/chunk-GVN5SZLX.js +212 -0
- package/dist/chunk-H3T7IWNA.js +134 -0
- package/dist/chunk-HAX4LCR5.js +261 -0
- package/dist/chunk-HC4JFZVU.js +121 -0
- package/dist/chunk-HEFPPMBQ.js +581 -0
- package/dist/chunk-HGKTHF2U.js +1356 -0
- package/dist/chunk-HGKTHF2U.js.map +1 -0
- package/dist/chunk-HNLR7Q4Z.js +83 -0
- package/dist/chunk-HSOXMJOT.js +12 -0
- package/dist/chunk-I4MRDSUF.js +281 -0
- package/dist/chunk-I4QEJ62Y.js +202 -0
- package/dist/chunk-I5B5L6Q4.js +56 -0
- package/dist/chunk-I5QZJODL.js +264 -0
- package/dist/chunk-I7ITSXSJ.js +603 -0
- package/dist/chunk-I7XIZRFD.js +390 -0
- package/dist/chunk-IDANQPRH.js +82 -0
- package/dist/chunk-IFB3WJ36.js +212 -0
- package/dist/chunk-IHTAKKTK.js +264 -0
- package/dist/chunk-IKXNLWAL.js +205 -0
- package/dist/chunk-IKXNLWAL.js.map +1 -0
- package/dist/chunk-ILDXWY37.js +173 -0
- package/dist/chunk-IMDQUHBJ.js +570 -0
- package/dist/chunk-IMZCQBOT.js +119 -0
- package/dist/chunk-IXPTECSC.js +403 -0
- package/dist/chunk-J255A3N5.js +71 -0
- package/dist/chunk-J5F5HPPW.js +141 -0
- package/dist/chunk-JDTGRRNU.js +5045 -0
- package/dist/chunk-JDTGRRNU.js.map +1 -0
- package/dist/chunk-JEA3QDX7.js +2469 -0
- package/dist/chunk-JEUPAVYY.js +156 -0
- package/dist/chunk-JKHKLL5W.js +194 -0
- package/dist/chunk-JQL7ZH6C.js +650 -0
- package/dist/chunk-JWB44UGJ.js +57 -0
- package/dist/chunk-JZ4NLCAP.js +333 -0
- package/dist/chunk-K2A5PXQ5.js +412 -0
- package/dist/chunk-K56XV3C3.js +623 -0
- package/dist/chunk-K6GAXXVA.js +23 -0
- package/dist/chunk-KCBMFSMS.js +199 -0
- package/dist/chunk-KF2FV3ZJ.js +268 -0
- package/dist/chunk-KJD65EJP.js +278 -0
- package/dist/chunk-KLEUWIMZ.js +386 -0
- package/dist/chunk-KODELWYT.js +309 -0
- package/dist/chunk-KRDR5RJD.js +83 -0
- package/dist/chunk-KUDGXAF7.js +914 -0
- package/dist/chunk-KY2R73CG.js +171 -0
- package/dist/chunk-KY2R73CG.js.map +1 -0
- package/dist/chunk-KYS77RPN.js +85 -0
- package/dist/chunk-L7YTNTIK.js +368 -0
- package/dist/chunk-LHPNABDH.js +686 -0
- package/dist/chunk-MFROMEKA.js +401 -0
- package/dist/chunk-MIHN76LX.js +2656 -0
- package/dist/chunk-MIYFS2XN.js +42 -0
- package/dist/chunk-MJUCFQMS.js +65 -0
- package/dist/chunk-MM4FNWI4.js +3064 -0
- package/dist/chunk-MNZG4OHU.js +790 -0
- package/dist/chunk-MVW6HNPI.js +250 -0
- package/dist/chunk-MVW6HNPI.js.map +1 -0
- package/dist/chunk-N6AACDUW.js +200 -0
- package/dist/chunk-NC55IFN3.js +781 -0
- package/dist/chunk-NC7PVOEK.js +98 -0
- package/dist/chunk-NCYMNCJO.js +70 -0
- package/dist/chunk-ND2BXV3P.js +259 -0
- package/dist/chunk-NDBTFUO6.js +272 -0
- package/dist/chunk-NDQJZ7HF.js +206 -0
- package/dist/chunk-NGJJJPZZ.js +162 -0
- package/dist/chunk-NJTSNNE7.js +251 -0
- package/dist/chunk-NPGISCU6.js +4159 -0
- package/dist/chunk-NPGISCU6.js.map +1 -0
- package/dist/chunk-NRTE7DNV.js +1270 -0
- package/dist/chunk-NULUNM7H.js +290 -0
- package/dist/chunk-NUNZS36W.js +227 -0
- package/dist/chunk-NW53H5RW.js +2424 -0
- package/dist/chunk-NXCMHIKI.js +263 -0
- package/dist/chunk-O3LKCBP5.js +159 -0
- package/dist/chunk-O4EA4F3W.js +103 -0
- package/dist/chunk-O4EA4F3W.js.map +1 -0
- package/dist/chunk-O4OOG3D6.js +116 -0
- package/dist/chunk-O4OOG3D6.js.map +1 -0
- package/dist/chunk-O6N4ABCA.js +376 -0
- package/dist/chunk-O732GAFC.js +112 -0
- package/dist/chunk-OF4TIKYC.js +690 -0
- package/dist/chunk-OMPVOMPP.js +70 -0
- package/dist/chunk-OPJJSKUK.js +118 -0
- package/dist/chunk-OPWCMA4D.js +196 -0
- package/dist/chunk-ORJPS5VN.js +1193 -0
- package/dist/chunk-OSY5K7L7.js +187 -0
- package/dist/chunk-OV6QJRT4.js +45 -0
- package/dist/chunk-OVKYVZMW.js +108 -0
- package/dist/chunk-OZCBM3UC.js +171 -0
- package/dist/chunk-P3A2EINJ.js +61 -0
- package/dist/chunk-PTAG4PDC.js +27 -0
- package/dist/chunk-PTF5B7TJ.js +298 -0
- package/dist/chunk-Q3DPEYX4.js +848 -0
- package/dist/chunk-Q6CGOPJD.js +215 -0
- package/dist/chunk-Q6CGOPJD.js.map +1 -0
- package/dist/chunk-QB2KMIDP.js +100 -0
- package/dist/chunk-QCSJ4CWE.js +1067 -0
- package/dist/chunk-QIOQ2NPQ.js +414 -0
- package/dist/chunk-QK5EFEUT.js +353 -0
- package/dist/chunk-QPQBLYQJ.js +41 -0
- package/dist/chunk-QPSGCC5D.js +184 -0
- package/dist/chunk-QZAAUQRN.js +474 -0
- package/dist/chunk-QZM6YDJW.js +489 -0
- package/dist/chunk-QZM6YDJW.js.map +1 -0
- package/dist/chunk-RGBI63KJ.js +188 -0
- package/dist/chunk-RLBKLAEY.js +138 -0
- package/dist/chunk-RMFKVOM7.js +304 -0
- package/dist/chunk-ROKQU7WG.js +258 -0
- package/dist/chunk-RPVREAU7.js +251 -0
- package/dist/chunk-RQKLF42C.js +723 -0
- package/dist/chunk-SC6RRD2D.js +38 -0
- package/dist/chunk-SC6RRD2D.js.map +1 -0
- package/dist/chunk-SEO7TICN.js +94 -0
- package/dist/chunk-SHHJCL7X.js +432 -0
- package/dist/chunk-SIRLACNZ.js +114 -0
- package/dist/chunk-SKPHMYAA.js +237 -0
- package/dist/chunk-SODC7T6L.js +1583 -0
- package/dist/chunk-SQJIKMN3.js +366 -0
- package/dist/chunk-SVINDKVW.js +26 -0
- package/dist/chunk-SYCDHPZF.js +335 -0
- package/dist/chunk-T2QX3FDP.js +133 -0
- package/dist/chunk-T3OWFVMS.js +1187 -0
- package/dist/chunk-T6XI5FLY.js +61 -0
- package/dist/chunk-T7OXJZCX.js +62 -0
- package/dist/chunk-TAT5USZN.js +353 -0
- package/dist/chunk-TPQTRNER.js +172 -0
- package/dist/chunk-TUIN4MB7.js +266 -0
- package/dist/chunk-TX3VECZU.js +71 -0
- package/dist/chunk-TXLIEOJX.js +9624 -0
- package/dist/chunk-U3DN4HEY.js +27 -0
- package/dist/chunk-U7XM7CB4.js +191 -0
- package/dist/chunk-UJK53QFL.js +140 -0
- package/dist/chunk-UMTXA2TH.js +319 -0
- package/dist/chunk-UPDSXFK5.js +199 -0
- package/dist/chunk-UTIAXH52.js +269 -0
- package/dist/chunk-UVN5TMHU.js +1184 -0
- package/dist/chunk-V4Z4B2E3.js +52 -0
- package/dist/chunk-V4Z4B2E3.js.map +1 -0
- package/dist/chunk-VGYXW3VG.js +246 -0
- package/dist/chunk-VS7AHPCZ.js +255 -0
- package/dist/chunk-VTTAJOQ7.js +121 -0
- package/dist/chunk-VWPOLUAO.js +99 -0
- package/dist/chunk-X3MWB2QU.js +3851 -0
- package/dist/chunk-X6KAJI3V.js +211 -0
- package/dist/chunk-XBLRHV5R.js +50 -0
- package/dist/chunk-XDFP2LMW.js +605 -0
- package/dist/chunk-XEQMZB3C.js +525 -0
- package/dist/chunk-XEYLT5VA.js +223 -0
- package/dist/chunk-XHIQ5I6N.js +918 -0
- package/dist/chunk-XLH7QY2R.js +378 -0
- package/dist/chunk-XWFAMUZQ.js +113 -0
- package/dist/chunk-Y4BB2KS2.js +294 -0
- package/dist/chunk-Y4BB2KS2.js.map +1 -0
- package/dist/chunk-Y4OBB2VN.js +84 -0
- package/dist/chunk-YCVD6CI3.js +234 -0
- package/dist/chunk-YENLNISG.js +270 -0
- package/dist/chunk-YIRVLKAX.js +351 -0
- package/dist/chunk-YL73CVNK.js +390 -0
- package/dist/chunk-YLS6QE5G.js +288 -0
- package/dist/chunk-YNF2OC54.js +366 -0
- package/dist/chunk-YNF2OC54.js.map +1 -0
- package/dist/chunk-YPWU5KPE.js +147 -0
- package/dist/chunk-YQXTDZSU.js +2984 -0
- package/dist/chunk-YSJEAAOL.js +178 -0
- package/dist/chunk-YWIFM7D7.js +499 -0
- package/dist/chunk-YWVI6ZMK.js +103 -0
- package/dist/chunk-Z4FMAFNH.js +847 -0
- package/dist/chunk-Z654FWNU.js +136 -0
- package/dist/chunk-Z7Y523PS.js +130 -0
- package/dist/chunk-ZD67RM6G.js +60 -0
- package/dist/chunk-ZEG4VPBL.js +187 -0
- package/dist/chunk-ZHDFQITM.js +283 -0
- package/dist/chunk-ZHDFQITM.js.map +1 -0
- package/dist/chunk-ZLYCOBHW.js +75 -0
- package/dist/chunk-ZNJ5MTXV.js +89 -0
- package/dist/chunk-ZSGY3H53.js +155 -0
- package/dist/chunk-ZTPXACWB.js +1788 -0
- package/dist/chunk-ZUA3JMI6.js +107 -0
- package/dist/chunk-ZYAZUPPV.js +559 -0
- package/dist/composer.js +8 -8
- package/dist/computer-viewer-TDDO25AV.js +21 -0
- package/dist/connect.js +12 -12
- package/dist/desktop-dictation.js +12 -10
- package/dist/desktop-dictation.js.map +1 -1
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/embedded-new-voice-2G3VLPVQ.js +24 -0
- package/dist/embedded-voice-T5IWOWGD.js +24 -0
- package/dist/fleet-decision-row-WM64KXP3.js +361 -0
- package/dist/in-chat-connect-model.js +5 -5
- package/dist/index.js +51 -51
- package/dist/interaction.js +5 -5
- package/dist/machines.js +3 -3
- package/dist/meetings-recorder.js +1 -1
- package/dist/meetings.js +40 -32
- package/dist/meetings.js.map +1 -1
- package/dist/messages/en.d.ts +3 -0
- package/dist/messages.js +1 -1
- package/dist/model-policy-picker-menu-SMC6J6QN.js +22 -0
- package/dist/payment-page-card-G4U63KUV.js +223 -0
- package/dist/platform-activity-row-BUZGZAKZ.js +128 -0
- package/dist/queue-surface-implementation-4KUZ4PJV.js +908 -0
- package/dist/realtime.js +4 -4
- package/dist/recorder-host-WF2RRR56.js +69 -0
- package/dist/recorder-host-WF2RRR56.js.map +1 -0
- package/dist/recordings.js +3 -3
- package/dist/sandbox-files-ESDMOFSD.js +27 -0
- package/dist/session-app.js +211 -209
- package/dist/session-connect-cards-Q53KMMYY.js +25 -0
- package/dist/session-list-model.js +2 -2
- package/dist/session-realtime-CF3I35WJ.js +30 -0
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +33 -31
- package/dist/session.js +5 -5
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline-annotation-markers-CJK4RYZ4.js +157 -0
- package/dist/timeline-annotation-selection-67GF5H26.js +208 -0
- package/dist/timeline-annotations-dialog-ONJPQDJQ.js +283 -0
- package/dist/ui/access-list.js +11 -9
- package/dist/ui/access-list.js.map +1 -1
- package/dist/ui/api-error.d.ts +6 -3
- package/dist/ui/api-error.js +2 -1
- package/dist/ui/cadence-picker.js +6 -4
- package/dist/ui/choice-cards.js +5 -3
- package/dist/ui/confirm-dialog.js +2 -2
- package/dist/ui/copy-field.js +5 -3
- package/dist/ui/detail-page.js +2 -2
- package/dist/ui/detail-sheet.js +2 -2
- package/dist/ui/diff-view.js +4 -3
- package/dist/ui/disclosure.js +3 -3
- package/dist/ui/email-chips-input.js +5 -3
- package/dist/ui/error-message.js +2 -1
- package/dist/ui/error-reference.d.ts +15 -0
- package/dist/ui/error-text.d.ts +10 -0
- package/dist/ui/error-text.js +9 -0
- package/dist/ui/error-text.js.map +1 -0
- package/dist/ui/field.js +4 -2
- package/dist/ui/flush-form-page.js +8 -6
- package/dist/ui/form-dialog.js +7 -5
- package/dist/ui/list-row.js +3 -3
- package/dist/ui/load-failure.js +3 -2
- package/dist/ui/load-failure.js.map +1 -1
- package/dist/ui/notice.js +3 -1
- package/dist/ui/relative-time.js +2 -2
- package/dist/ui/revision-history.js +9 -7
- package/dist/ui/revision-history.js.map +1 -1
- package/dist/ui/role-select.js +10 -8
- package/dist/ui/segmented-control.js +4 -2
- package/dist/ui/select-menu.js +5 -3
- package/dist/ui/setting-row.js +3 -1
- package/dist/ui/switch.js +4 -2
- package/dist/ui/usage-meter.js +3 -3
- package/dist/ui/word-list-row.js +4 -2
- package/dist/usage.js +2 -2
- package/dist/workbench.js +4 -4
- package/package.json +5 -6
- package/src/app/app-state.tsx +126 -14
- package/src/app/components/artifacts/site-data.tsx +2 -2
- package/src/app/components/artifacts/site-settings.tsx +2 -2
- package/src/app/components/rail/session-list.tsx +7 -8
- package/src/app/components/rail/session-shell.tsx +3 -3
- package/src/app/components/repository-picker.tsx +8 -1
- package/src/app/components/session/model-context-inspector.tsx +2 -1
- package/src/app/components/session/session-admin-access.tsx +2 -2
- package/src/app/lib/actions/chat-operations.ts +4 -4
- package/src/app/lib/archive-session.test.tsx +265 -2
- package/src/app/lib/archive-session.tsx +175 -9
- package/src/app/lib/copy-link.ts +2 -2
- package/src/app/lib/inbox.tsx +2 -2
- package/src/app/lib/session-failure-toasts.ts +3 -2
- package/src/app/lib/toast.test.tsx +215 -0
- package/src/app/lib/toast.tsx +67 -2
- package/src/app/personal-github-reconnect.test.tsx +356 -0
- package/src/app/routes/artifacts.tsx +1 -2
- package/src/components/tool-action-review.tsx +14 -1
- package/src/meetings/delete-meeting-dialog.tsx +2 -1
- package/src/meetings/meeting-ask.tsx +2 -1
- package/src/meetings/meeting-detail-page.tsx +2 -1
- package/src/meetings/meeting-notes.tsx +2 -1
- package/src/meetings/meeting-settings.tsx +4 -1
- package/src/meetings/meeting-transcript.tsx +4 -1
- package/src/meetings/recorder-context.tsx +10 -0
- package/src/meetings/recorder-host.test.tsx +60 -2
- package/src/meetings/recorder-host.tsx +16 -3
- package/src/meetings/recorder-panel.tsx +2 -1
- package/src/meetings/recorder-workspace.test.tsx +26 -1
- package/src/messages/en.ts +6 -0
- package/src/ui/api-error.test.ts +29 -5
- package/src/ui/api-error.tsx +10 -4
- package/src/ui/error-message.tsx +8 -0
- package/src/ui/error-reference.test.ts +54 -0
- package/src/ui/error-reference.ts +51 -0
- package/src/ui/error-text.test.tsx +66 -0
- package/src/ui/error-text.tsx +49 -0
- package/src/ui/field.tsx +4 -1
- package/src/ui/notice.tsx +7 -2
- package/src/ui/setting-row.tsx +4 -1
- package/styles/app.css +12 -0
- package/styles/compiled.css +9 -0
- package/dist/browser-viewer-NOP5EAUO.js +0 -23
- package/dist/chat-interactive-block-G7O44JHR.js +0 -18
- package/dist/chunk-26RWVLRD.js +0 -135
- package/dist/chunk-2AHTY7OT.js +0 -247
- package/dist/chunk-2GDNWKSC.js +0 -3670
- package/dist/chunk-2JENKGCE.js +0 -339
- package/dist/chunk-2KYQC4T5.js +0 -155
- package/dist/chunk-2RREGDQH.js +0 -708
- package/dist/chunk-2T7DX6KR.js +0 -353
- package/dist/chunk-2VB2O4FQ.js +0 -920
- package/dist/chunk-2VTTKH23.js +0 -94
- package/dist/chunk-2XNG2KNT.js +0 -172
- package/dist/chunk-2YC6JQRO.js +0 -399
- package/dist/chunk-2ZVRJRXC.js +0 -27
- package/dist/chunk-35737UT4.js +0 -162
- package/dist/chunk-366XZ4PM.js +0 -41
- package/dist/chunk-36MIDGAH.js +0 -199
- package/dist/chunk-3FD76LXM.js +0 -212
- package/dist/chunk-3OVIXY4O.js +0 -213
- package/dist/chunk-3OVIXY4O.js.map +0 -1
- package/dist/chunk-3QNRBEYH.js +0 -432
- package/dist/chunk-3QX55WLC.js +0 -15
- package/dist/chunk-3USJPT2S.js +0 -1022
- package/dist/chunk-42CMQ5VR.js +0 -251
- package/dist/chunk-4LPOWQJY.js +0 -42
- package/dist/chunk-4NBTZRKT.js +0 -79
- package/dist/chunk-4OXI6HCV.js +0 -118
- package/dist/chunk-4SZZAFYQ.js +0 -2317
- package/dist/chunk-4TQL3WP2.js +0 -140
- package/dist/chunk-4Y6BK7IU.js +0 -196
- package/dist/chunk-4YD7YZC5.js +0 -373
- package/dist/chunk-5DTST3TP.js +0 -81
- package/dist/chunk-5FH5LQVS.js +0 -130
- package/dist/chunk-5KWMYPJV.js +0 -847
- package/dist/chunk-5MUJDC6C.js +0 -84
- package/dist/chunk-5QM2WPKV.js +0 -41
- package/dist/chunk-5WUN7XPD.js +0 -1184
- package/dist/chunk-64PO2WXU.js +0 -1067
- package/dist/chunk-6AHATAAY.js +0 -431
- package/dist/chunk-6ED2YWBT.js +0 -56
- package/dist/chunk-6GXVYAGR.js +0 -170
- package/dist/chunk-6H4SJBPE.js +0 -85
- package/dist/chunk-6MT3HHUB.js +0 -84
- package/dist/chunk-6UHCBH4G.js +0 -198
- package/dist/chunk-6WLX3NR3.js +0 -198
- package/dist/chunk-73NXYYWE.js +0 -112
- package/dist/chunk-76ERNKIZ.js +0 -603
- package/dist/chunk-776QZ573.js +0 -57
- package/dist/chunk-7BYWOFVH.js +0 -171
- package/dist/chunk-7O5CGGIQ.js +0 -108
- package/dist/chunk-7QOHRZ67.js +0 -251
- package/dist/chunk-7WIDB4PL.js +0 -2058
- package/dist/chunk-7WKP3DYJ.js +0 -37
- package/dist/chunk-7XOVTPDI.js +0 -227
- package/dist/chunk-AB5MBIXY.js +0 -281
- package/dist/chunk-ADNMXBCX.js +0 -1193
- package/dist/chunk-AFBJTUFK.js +0 -202
- package/dist/chunk-ALVRWCXE.js +0 -61
- package/dist/chunk-AOHU6O3M.js +0 -247
- package/dist/chunk-AOHU6O3M.js.map +0 -1
- package/dist/chunk-APW4T4SW.js +0 -270
- package/dist/chunk-AXBSYWKX.js +0 -2656
- package/dist/chunk-B2I5ZW35.js +0 -422
- package/dist/chunk-B3LMRTRF.js +0 -223
- package/dist/chunk-BE2XENG2.js +0 -292
- package/dist/chunk-BE2XENG2.js.map +0 -1
- package/dist/chunk-BF4SADKX.js +0 -29
- package/dist/chunk-BKP43KK4.js +0 -1788
- package/dist/chunk-BM3NEZ6X.js +0 -781
- package/dist/chunk-BT3BAGB5.js +0 -216
- package/dist/chunk-BTSYDIVJ.js +0 -357
- package/dist/chunk-BUBNGKWG.js +0 -70
- package/dist/chunk-BVUJV5WR.js +0 -126
- package/dist/chunk-BZO5ZMUP.js +0 -27
- package/dist/chunk-C3HUF3M2.js +0 -157
- package/dist/chunk-C5QCAOES.js +0 -264
- package/dist/chunk-CGK6ALQU.js +0 -159
- package/dist/chunk-CPYGO76Q.js +0 -335
- package/dist/chunk-CQH4FWYA.js +0 -490
- package/dist/chunk-CZP5QXNB.js +0 -234
- package/dist/chunk-D2TOWEYH.js +0 -266
- package/dist/chunk-D6L4GHRH.js +0 -340
- package/dist/chunk-DKT3N37I.js +0 -50
- package/dist/chunk-DMMJIFKA.js +0 -84
- package/dist/chunk-DO74DQC7.js +0 -26
- package/dist/chunk-DOFJZ2JU.js +0 -83
- package/dist/chunk-DSXVY5WZ.js +0 -119
- package/dist/chunk-E337C2VK.js +0 -82
- package/dist/chunk-E6NRSRBE.js +0 -114
- package/dist/chunk-E6SQKHAU.js +0 -114
- package/dist/chunk-E7UIVD7F.js +0 -236
- package/dist/chunk-EGBII4CP.js +0 -229
- package/dist/chunk-EILSAQVJ.js +0 -200
- package/dist/chunk-ELL6HSYR.js +0 -307
- package/dist/chunk-EUBGLFFR.js +0 -73
- package/dist/chunk-EW6RNWSH.js +0 -212
- package/dist/chunk-EYUT5Y6V.js +0 -2599
- package/dist/chunk-F7U3QPZ3.js +0 -304
- package/dist/chunk-FBTJKSTM.js +0 -1270
- package/dist/chunk-FC2FTSK3.js +0 -2424
- package/dist/chunk-FOGNA3BU.js +0 -148
- package/dist/chunk-FQFKHNC7.js +0 -650
- package/dist/chunk-FTCHM755.js +0 -50
- package/dist/chunk-FXSHP4JZ.js +0 -3550
- package/dist/chunk-G6ZZC543.js +0 -818
- package/dist/chunk-G7FU6PUA.js +0 -100
- package/dist/chunk-GA4YEAMX.js +0 -3851
- package/dist/chunk-GE33BGB7.js +0 -12
- package/dist/chunk-GQ67HSJY.js +0 -570
- package/dist/chunk-GXXZ3WAK.js +0 -106
- package/dist/chunk-H2TCRX3H.js +0 -237
- package/dist/chunk-HLL4PBO7.js +0 -60
- package/dist/chunk-HLOEPV5C.js +0 -259
- package/dist/chunk-HUAGBS4O.js +0 -56
- package/dist/chunk-I36GSRUJ.js +0 -211
- package/dist/chunk-I6VBHT7S.js +0 -261
- package/dist/chunk-ICNNNOXE.js +0 -333
- package/dist/chunk-ICX64J4U.js +0 -172
- package/dist/chunk-ID36Y46W.js +0 -5046
- package/dist/chunk-ID36Y46W.js.map +0 -1
- package/dist/chunk-IGVVXLKJ.js +0 -559
- package/dist/chunk-IKJLSBUI.js +0 -2984
- package/dist/chunk-IKMUFDVS.js +0 -50
- package/dist/chunk-IKUNOX7F.js +0 -255
- package/dist/chunk-ILKDYBON.js +0 -288
- package/dist/chunk-IVYJX3OY.js +0 -187
- package/dist/chunk-JCY4CMDH.js +0 -107
- package/dist/chunk-JJZPLGIP.js +0 -474
- package/dist/chunk-JW33RV4V.js +0 -143
- package/dist/chunk-JWPA6ZPZ.js +0 -351
- package/dist/chunk-JZ4QXS6D.js +0 -50
- package/dist/chunk-K42OUZQ3.js +0 -386
- package/dist/chunk-K5TOVX5A.js +0 -206
- package/dist/chunk-K63HGHZX.js +0 -99
- package/dist/chunk-K6R5T44I.js +0 -75
- package/dist/chunk-KHJ5PXFM.js +0 -914
- package/dist/chunk-KJZRQ55O.js +0 -2319
- package/dist/chunk-KJZRQ55O.js.map +0 -1
- package/dist/chunk-KKI55ZMW.js +0 -65
- package/dist/chunk-KRPLAAFP.js +0 -199
- package/dist/chunk-KVFEZDBO.js +0 -134
- package/dist/chunk-L4I665WK.js +0 -45
- package/dist/chunk-L4OF77LE.js +0 -110
- package/dist/chunk-L4OF77LE.js.map +0 -1
- package/dist/chunk-LA5T52RM.js +0 -70
- package/dist/chunk-LM2W5YAT.js +0 -401
- package/dist/chunk-LQ62ECE6.js +0 -390
- package/dist/chunk-LQDUHU3Y.js +0 -71
- package/dist/chunk-LRJIYTZW.js +0 -4157
- package/dist/chunk-LRJIYTZW.js.map +0 -1
- package/dist/chunk-LRN6GYAZ.js +0 -138
- package/dist/chunk-M4SDVTKJ.js +0 -790
- package/dist/chunk-MA6O7CM6.js +0 -99
- package/dist/chunk-MBIBB6GI.js +0 -197
- package/dist/chunk-MF3ZFB4H.js +0 -199
- package/dist/chunk-MJJGJMYJ.js +0 -98
- package/dist/chunk-MLJADQFI.js +0 -4824
- package/dist/chunk-MQG7RV3B.js +0 -62
- package/dist/chunk-MTTGSQA5.js +0 -186
- package/dist/chunk-MW7Y3T55.js +0 -525
- package/dist/chunk-MYUFMVCH.js +0 -121
- package/dist/chunk-N3OARGH2.js +0 -61
- package/dist/chunk-NB2HMRT2.js +0 -353
- package/dist/chunk-NFDFYWMV.js +0 -141
- package/dist/chunk-NWGNFN3N.js +0 -1187
- package/dist/chunk-NWJRPDIO.js +0 -840
- package/dist/chunk-NWJRPDIO.js.map +0 -1
- package/dist/chunk-NXWBBZJV.js +0 -267
- package/dist/chunk-NY2QWROL.js +0 -71
- package/dist/chunk-O2IOPP3R.js +0 -848
- package/dist/chunk-O2UWH5RG.js +0 -141
- package/dist/chunk-O5YWDLYF.js +0 -393
- package/dist/chunk-OBMCZO7E.js +0 -121
- package/dist/chunk-OD3DCCCB.js +0 -132
- package/dist/chunk-OMH7R6I3.js +0 -390
- package/dist/chunk-OSA5EQG5.js +0 -113
- package/dist/chunk-OSJ3MUTZ.js +0 -2936
- package/dist/chunk-OWAYJ2OV.js +0 -368
- package/dist/chunk-OYXBFSGK.js +0 -269
- package/dist/chunk-PC2EBA5G.js +0 -4116
- package/dist/chunk-PC2EBA5G.js.map +0 -1
- package/dist/chunk-PC2MVXIP.js +0 -363
- package/dist/chunk-PC2MVXIP.js.map +0 -1
- package/dist/chunk-PENGLDR5.js +0 -309
- package/dist/chunk-PSMAWRPL.js +0 -191
- package/dist/chunk-PW4IMTYR.js +0 -702
- package/dist/chunk-PW54V7T5.js +0 -387
- package/dist/chunk-Q2EXYSMO.js +0 -24
- package/dist/chunk-Q2XJK5I4.js +0 -51
- package/dist/chunk-Q2XJK5I4.js.map +0 -1
- package/dist/chunk-Q4EFRI6X.js +0 -258
- package/dist/chunk-Q52CXW6C.js +0 -48
- package/dist/chunk-Q6XQ2R37.js +0 -184
- package/dist/chunk-QAJ53XBW.js +0 -23
- package/dist/chunk-QDTKECT4.js +0 -129
- package/dist/chunk-QE3ZFGI3.js +0 -43
- package/dist/chunk-QHHSUR2Y.js +0 -298
- package/dist/chunk-QHNVNR7B.js +0 -173
- package/dist/chunk-QIK2Q6N5.js +0 -376
- package/dist/chunk-QWL4L366.js +0 -38
- package/dist/chunk-R3J2PTVQ.js +0 -690
- package/dist/chunk-RBRX5ZS3.js +0 -319
- package/dist/chunk-REX6JIC7.js +0 -33
- package/dist/chunk-RGZ7EEC3.js +0 -537
- package/dist/chunk-RGZ7EEC3.js.map +0 -1
- package/dist/chunk-RIPS7GFR.js +0 -960
- package/dist/chunk-RTBZNFNV.js +0 -1354
- package/dist/chunk-RTBZNFNV.js.map +0 -1
- package/dist/chunk-SKMNW4SW.js +0 -187
- package/dist/chunk-SRFARKXC.js +0 -623
- package/dist/chunk-SWIHWCTW.js +0 -4461
- package/dist/chunk-TA5CFTO4.js +0 -103
- package/dist/chunk-TF4ZVJLI.js +0 -156
- package/dist/chunk-TG7DADJR.js +0 -9624
- package/dist/chunk-TI4R2ZD5.js +0 -623
- package/dist/chunk-TI4R2ZD5.js.map +0 -1
- package/dist/chunk-TNKWOUWP.js +0 -412
- package/dist/chunk-TNUSPXPW.js +0 -5555
- package/dist/chunk-TNUSPXPW.js.map +0 -1
- package/dist/chunk-TNYFHKVV.js +0 -366
- package/dist/chunk-TPMZBOFH.js +0 -178
- package/dist/chunk-TW3LKRJF.js +0 -263
- package/dist/chunk-TZAO65I4.js +0 -83
- package/dist/chunk-U5EFEMYU.js +0 -89
- package/dist/chunk-U6M4LS3M.js +0 -378
- package/dist/chunk-UI4HI5QK.js +0 -918
- package/dist/chunk-UJDOWCQ3.js +0 -272
- package/dist/chunk-UJUQ2QOX.js +0 -581
- package/dist/chunk-UQ3IM6FY.js +0 -133
- package/dist/chunk-UYE47LO6.js +0 -246
- package/dist/chunk-VADHIT26.js +0 -89
- package/dist/chunk-VFQ3H6CO.js +0 -163
- package/dist/chunk-VGUN6VB2.js +0 -188
- package/dist/chunk-VGWWEVSD.js +0 -723
- package/dist/chunk-VIEFJ2DM.js +0 -2469
- package/dist/chunk-VLXM36VS.js +0 -268
- package/dist/chunk-W3BFRR2G.js +0 -499
- package/dist/chunk-W5MPXR3A.js +0 -981
- package/dist/chunk-W5OWKVZG.js +0 -136
- package/dist/chunk-W6FRORMX.js +0 -486
- package/dist/chunk-W6FRORMX.js.map +0 -1
- package/dist/chunk-W7XROSZO.js +0 -232
- package/dist/chunk-W7XROSZO.js.map +0 -1
- package/dist/chunk-WEZ5PXZP.js +0 -403
- package/dist/chunk-WHWUWN2X.js +0 -197
- package/dist/chunk-WHWUWN2X.js.map +0 -1
- package/dist/chunk-WLEDGIVS.js +0 -114
- package/dist/chunk-WLEDGIVS.js.map +0 -1
- package/dist/chunk-WNDAKLHG.js +0 -281
- package/dist/chunk-WTJ4PLMU.js +0 -103
- package/dist/chunk-WV2KPJUW.js +0 -107
- package/dist/chunk-X3VY5EGY.js +0 -277
- package/dist/chunk-X3VY5EGY.js.map +0 -1
- package/dist/chunk-XDBYWVCW.js +0 -418
- package/dist/chunk-XF7MA4U5.js +0 -36
- package/dist/chunk-XF7MA4U5.js.map +0 -1
- package/dist/chunk-XOSQP3YA.js +0 -605
- package/dist/chunk-XYBV4ZJQ.js +0 -271
- package/dist/chunk-YBKVGLQR.js +0 -147
- package/dist/chunk-YDCUBUWH.js +0 -1583
- package/dist/chunk-YG6NARQY.js +0 -51
- package/dist/chunk-YG6NARQY.js.map +0 -1
- package/dist/chunk-YSVD5HI4.js +0 -278
- package/dist/chunk-YT3WGNG6.js +0 -290
- package/dist/chunk-YYICQDK4.js +0 -414
- package/dist/chunk-YYLMZLI6.js +0 -686
- package/dist/chunk-ZAMTKG5U.js +0 -95
- package/dist/chunk-ZDLYSXKN.js +0 -111
- package/dist/chunk-ZG447FSS.js +0 -194
- package/dist/chunk-ZIT5KD4Q.js +0 -264
- package/dist/chunk-ZUDOVDKR.js +0 -3064
- package/dist/chunk-ZW2ECJ3A.js +0 -451
- package/dist/computer-viewer-LPZ763KF.js +0 -21
- package/dist/embedded-new-voice-YVMKSLKJ.js +0 -24
- package/dist/embedded-voice-BJPQFXSU.js +0 -24
- package/dist/fleet-decision-row-AA4H5CDT.js +0 -361
- package/dist/model-policy-picker-menu-HSMWVO4P.js +0 -22
- package/dist/payment-page-card-3LTSFJGN.js +0 -223
- package/dist/platform-activity-row-5VYV6TX4.js +0 -128
- package/dist/queue-surface-implementation-NXHZUKD2.js +0 -908
- package/dist/recorder-host-ZKRWTDBM.js +0 -57
- package/dist/recorder-host-ZKRWTDBM.js.map +0 -1
- package/dist/sandbox-files-YCMLQUFU.js +0 -27
- package/dist/session-connect-cards-KSQLMRM5.js +0 -25
- package/dist/session-realtime-ZR6JLG3Y.js +0 -30
- package/dist/timeline-annotation-markers-YAHDPWVG.js +0 -157
- package/dist/timeline-annotation-selection-KHXNCEJP.js +0 -208
- package/dist/timeline-annotations-dialog-Y4XD3N7B.js +0 -283
- /package/dist/{browser-viewer-NOP5EAUO.js.map → browser-viewer-TC27OCIP.js.map} +0 -0
- /package/dist/{chat-interactive-block-G7O44JHR.js.map → chat-interactive-block-RWPQBHVS.js.map} +0 -0
- /package/dist/{chunk-EGBII4CP.js.map → chunk-2BDT3UZQ.js.map} +0 -0
- /package/dist/{chunk-4YD7YZC5.js.map → chunk-2CLNIEK4.js.map} +0 -0
- /package/dist/{chunk-ZW2ECJ3A.js.map → chunk-2FSBSCZJ.js.map} +0 -0
- /package/dist/{chunk-KRPLAAFP.js.map → chunk-2I7HDP53.js.map} +0 -0
- /package/dist/{chunk-3QX55WLC.js.map → chunk-2INLDVK3.js.map} +0 -0
- /package/dist/{chunk-BVUJV5WR.js.map → chunk-2KALVELR.js.map} +0 -0
- /package/dist/{chunk-XDBYWVCW.js.map → chunk-2M3J7ZWQ.js.map} +0 -0
- /package/dist/{chunk-2RREGDQH.js.map → chunk-2OP6WLGV.js.map} +0 -0
- /package/dist/{chunk-OSJ3MUTZ.js.map → chunk-2RG7NIAS.js.map} +0 -0
- /package/dist/{chunk-26RWVLRD.js.map → chunk-2STUPWEL.js.map} +0 -0
- /package/dist/{chunk-XYBV4ZJQ.js.map → chunk-2YUOVM3G.js.map} +0 -0
- /package/dist/{chunk-2GDNWKSC.js.map → chunk-2Z3NQNTM.js.map} +0 -0
- /package/dist/{chunk-2VB2O4FQ.js.map → chunk-3CPWWGNK.js.map} +0 -0
- /package/dist/{chunk-7WKP3DYJ.js.map → chunk-3ED2U6XE.js.map} +0 -0
- /package/dist/{chunk-BT3BAGB5.js.map → chunk-3GZA4BUW.js.map} +0 -0
- /package/dist/{chunk-3USJPT2S.js.map → chunk-3IK6UYO6.js.map} +0 -0
- /package/dist/{chunk-6AHATAAY.js.map → chunk-3PZ7JZI2.js.map} +0 -0
- /package/dist/{chunk-JZ4QXS6D.js.map → chunk-4DVJ6ONS.js.map} +0 -0
- /package/dist/{chunk-5QM2WPKV.js.map → chunk-4E3ZJRTZ.js.map} +0 -0
- /package/dist/{chunk-NFDFYWMV.js.map → chunk-4SAWSRAA.js.map} +0 -0
- /package/dist/{chunk-ELL6HSYR.js.map → chunk-53AGXXZM.js.map} +0 -0
- /package/dist/{chunk-G6ZZC543.js.map → chunk-54YW6SZZ.js.map} +0 -0
- /package/dist/{chunk-4SZZAFYQ.js.map → chunk-57AZS3IE.js.map} +0 -0
- /package/dist/{chunk-JW33RV4V.js.map → chunk-5CPEEAFD.js.map} +0 -0
- /package/dist/{chunk-D6L4GHRH.js.map → chunk-5EWSRZ2Y.js.map} +0 -0
- /package/dist/{chunk-PW54V7T5.js.map → chunk-5IE76VCY.js.map} +0 -0
- /package/dist/{chunk-6GXVYAGR.js.map → chunk-5NWEKLDZ.js.map} +0 -0
- /package/dist/{chunk-6UHCBH4G.js.map → chunk-5O2FCCHZ.js.map} +0 -0
- /package/dist/{chunk-2YC6JQRO.js.map → chunk-5QAY6K77.js.map} +0 -0
- /package/dist/{chunk-EYUT5Y6V.js.map → chunk-6DK6Z4UN.js.map} +0 -0
- /package/dist/{chunk-PW4IMTYR.js.map → chunk-6DVCC7QS.js.map} +0 -0
- /package/dist/{chunk-7WIDB4PL.js.map → chunk-6JHU2UBS.js.map} +0 -0
- /package/dist/{chunk-CQH4FWYA.js.map → chunk-6PZ7OBYU.js.map} +0 -0
- /package/dist/{chunk-VFQ3H6CO.js.map → chunk-6WGRDRMA.js.map} +0 -0
- /package/dist/{chunk-MTTGSQA5.js.map → chunk-77WAKEAH.js.map} +0 -0
- /package/dist/{chunk-O5YWDLYF.js.map → chunk-7TDO3CUM.js.map} +0 -0
- /package/dist/{chunk-2AHTY7OT.js.map → chunk-7TIX2UAR.js.map} +0 -0
- /package/dist/{chunk-FOGNA3BU.js.map → chunk-7V5REBCP.js.map} +0 -0
- /package/dist/{chunk-2JENKGCE.js.map → chunk-7VMZGLYI.js.map} +0 -0
- /package/dist/{chunk-E7UIVD7F.js.map → chunk-7W37NS3I.js.map} +0 -0
- /package/dist/{chunk-ZDLYSXKN.js.map → chunk-7X6SDK2C.js.map} +0 -0
- /package/dist/{chunk-ZAMTKG5U.js.map → chunk-7ZNUHRP5.js.map} +0 -0
- /package/dist/{chunk-DMMJIFKA.js.map → chunk-A36PZALD.js.map} +0 -0
- /package/dist/{chunk-WV2KPJUW.js.map → chunk-AUI6VA63.js.map} +0 -0
- /package/dist/{chunk-Q2EXYSMO.js.map → chunk-AW2MQB37.js.map} +0 -0
- /package/dist/{chunk-6WLX3NR3.js.map → chunk-AWKES45Y.js.map} +0 -0
- /package/dist/{chunk-OD3DCCCB.js.map → chunk-AXHZYXUV.js.map} +0 -0
- /package/dist/{chunk-QDTKECT4.js.map → chunk-BHNSJVBC.js.map} +0 -0
- /package/dist/{chunk-FTCHM755.js.map → chunk-BJEJFISW.js.map} +0 -0
- /package/dist/{chunk-B2I5ZW35.js.map → chunk-BJFH6JI5.js.map} +0 -0
- /package/dist/{chunk-RIPS7GFR.js.map → chunk-BMICEQZQ.js.map} +0 -0
- /package/dist/{chunk-BF4SADKX.js.map → chunk-BTLBYBLU.js.map} +0 -0
- /package/dist/{chunk-U5EFEMYU.js.map → chunk-BXBDYNRP.js.map} +0 -0
- /package/dist/{chunk-BTSYDIVJ.js.map → chunk-C372BFOV.js.map} +0 -0
- /package/dist/{chunk-MLJADQFI.js.map → chunk-CMKGILJK.js.map} +0 -0
- /package/dist/{chunk-DKT3N37I.js.map → chunk-CRAOSVHC.js.map} +0 -0
- /package/dist/{chunk-WNDAKLHG.js.map → chunk-CRU35QQH.js.map} +0 -0
- /package/dist/{chunk-2XNG2KNT.js.map → chunk-CUIWCGMA.js.map} +0 -0
- /package/dist/{chunk-QWL4L366.js.map → chunk-D5TWNFFE.js.map} +0 -0
- /package/dist/{chunk-SWIHWCTW.js.map → chunk-DF5EAHDN.js.map} +0 -0
- /package/dist/{chunk-HUAGBS4O.js.map → chunk-DJAXC5OK.js.map} +0 -0
- /package/dist/{chunk-FXSHP4JZ.js.map → chunk-DXBYWSL5.js.map} +0 -0
- /package/dist/{chunk-5MUJDC6C.js.map → chunk-DXR5PDFP.js.map} +0 -0
- /package/dist/{chunk-NXWBBZJV.js.map → chunk-DZWARC4M.js.map} +0 -0
- /package/dist/{chunk-GXXZ3WAK.js.map → chunk-DZXEDSQI.js.map} +0 -0
- /package/dist/{chunk-Q52CXW6C.js.map → chunk-E7XERZWC.js.map} +0 -0
- /package/dist/{chunk-4NBTZRKT.js.map → chunk-ECJBYNLJ.js.map} +0 -0
- /package/dist/{chunk-QE3ZFGI3.js.map → chunk-EDI6SJ2N.js.map} +0 -0
- /package/dist/{chunk-E6NRSRBE.js.map → chunk-EWSOC6WF.js.map} +0 -0
- /package/dist/{chunk-TA5CFTO4.js.map → chunk-F2OPHAUN.js.map} +0 -0
- /package/dist/{chunk-5DTST3TP.js.map → chunk-F4ISQGGM.js.map} +0 -0
- /package/dist/{chunk-MBIBB6GI.js.map → chunk-FO4LYKJL.js.map} +0 -0
- /package/dist/{chunk-EUBGLFFR.js.map → chunk-FPXASDG5.js.map} +0 -0
- /package/dist/{chunk-C3HUF3M2.js.map → chunk-FVXBNBHO.js.map} +0 -0
- /package/dist/{chunk-W5MPXR3A.js.map → chunk-FZC5N55X.js.map} +0 -0
- /package/dist/{chunk-MA6O7CM6.js.map → chunk-GAVYGBFI.js.map} +0 -0
- /package/dist/{chunk-REX6JIC7.js.map → chunk-GKVJIDHF.js.map} +0 -0
- /package/dist/{chunk-EW6RNWSH.js.map → chunk-GVN5SZLX.js.map} +0 -0
- /package/dist/{chunk-KVFEZDBO.js.map → chunk-H3T7IWNA.js.map} +0 -0
- /package/dist/{chunk-I6VBHT7S.js.map → chunk-HAX4LCR5.js.map} +0 -0
- /package/dist/{chunk-OBMCZO7E.js.map → chunk-HC4JFZVU.js.map} +0 -0
- /package/dist/{chunk-UJUQ2QOX.js.map → chunk-HEFPPMBQ.js.map} +0 -0
- /package/dist/{chunk-DOFJZ2JU.js.map → chunk-HNLR7Q4Z.js.map} +0 -0
- /package/dist/{chunk-GE33BGB7.js.map → chunk-HSOXMJOT.js.map} +0 -0
- /package/dist/{chunk-AB5MBIXY.js.map → chunk-I4MRDSUF.js.map} +0 -0
- /package/dist/{chunk-AFBJTUFK.js.map → chunk-I4QEJ62Y.js.map} +0 -0
- /package/dist/{chunk-6ED2YWBT.js.map → chunk-I5B5L6Q4.js.map} +0 -0
- /package/dist/{chunk-C5QCAOES.js.map → chunk-I5QZJODL.js.map} +0 -0
- /package/dist/{chunk-76ERNKIZ.js.map → chunk-I7ITSXSJ.js.map} +0 -0
- /package/dist/{chunk-OMH7R6I3.js.map → chunk-I7XIZRFD.js.map} +0 -0
- /package/dist/{chunk-E337C2VK.js.map → chunk-IDANQPRH.js.map} +0 -0
- /package/dist/{chunk-3FD76LXM.js.map → chunk-IFB3WJ36.js.map} +0 -0
- /package/dist/{chunk-ZIT5KD4Q.js.map → chunk-IHTAKKTK.js.map} +0 -0
- /package/dist/{chunk-QHNVNR7B.js.map → chunk-ILDXWY37.js.map} +0 -0
- /package/dist/{chunk-GQ67HSJY.js.map → chunk-IMDQUHBJ.js.map} +0 -0
- /package/dist/{chunk-DSXVY5WZ.js.map → chunk-IMZCQBOT.js.map} +0 -0
- /package/dist/{chunk-WEZ5PXZP.js.map → chunk-IXPTECSC.js.map} +0 -0
- /package/dist/{chunk-NY2QWROL.js.map → chunk-J255A3N5.js.map} +0 -0
- /package/dist/{chunk-O2UWH5RG.js.map → chunk-J5F5HPPW.js.map} +0 -0
- /package/dist/{chunk-VIEFJ2DM.js.map → chunk-JEA3QDX7.js.map} +0 -0
- /package/dist/{chunk-TF4ZVJLI.js.map → chunk-JEUPAVYY.js.map} +0 -0
- /package/dist/{chunk-ZG447FSS.js.map → chunk-JKHKLL5W.js.map} +0 -0
- /package/dist/{chunk-FQFKHNC7.js.map → chunk-JQL7ZH6C.js.map} +0 -0
- /package/dist/{chunk-776QZ573.js.map → chunk-JWB44UGJ.js.map} +0 -0
- /package/dist/{chunk-ICNNNOXE.js.map → chunk-JZ4NLCAP.js.map} +0 -0
- /package/dist/{chunk-TNKWOUWP.js.map → chunk-K2A5PXQ5.js.map} +0 -0
- /package/dist/{chunk-SRFARKXC.js.map → chunk-K56XV3C3.js.map} +0 -0
- /package/dist/{chunk-QAJ53XBW.js.map → chunk-K6GAXXVA.js.map} +0 -0
- /package/dist/{chunk-MF3ZFB4H.js.map → chunk-KCBMFSMS.js.map} +0 -0
- /package/dist/{chunk-VLXM36VS.js.map → chunk-KF2FV3ZJ.js.map} +0 -0
- /package/dist/{chunk-YSVD5HI4.js.map → chunk-KJD65EJP.js.map} +0 -0
- /package/dist/{chunk-K42OUZQ3.js.map → chunk-KLEUWIMZ.js.map} +0 -0
- /package/dist/{chunk-PENGLDR5.js.map → chunk-KODELWYT.js.map} +0 -0
- /package/dist/{chunk-TZAO65I4.js.map → chunk-KRDR5RJD.js.map} +0 -0
- /package/dist/{chunk-KHJ5PXFM.js.map → chunk-KUDGXAF7.js.map} +0 -0
- /package/dist/{chunk-6H4SJBPE.js.map → chunk-KYS77RPN.js.map} +0 -0
- /package/dist/{chunk-OWAYJ2OV.js.map → chunk-L7YTNTIK.js.map} +0 -0
- /package/dist/{chunk-YYLMZLI6.js.map → chunk-LHPNABDH.js.map} +0 -0
- /package/dist/{chunk-LM2W5YAT.js.map → chunk-MFROMEKA.js.map} +0 -0
- /package/dist/{chunk-AXBSYWKX.js.map → chunk-MIHN76LX.js.map} +0 -0
- /package/dist/{chunk-4LPOWQJY.js.map → chunk-MIYFS2XN.js.map} +0 -0
- /package/dist/{chunk-KKI55ZMW.js.map → chunk-MJUCFQMS.js.map} +0 -0
- /package/dist/{chunk-ZUDOVDKR.js.map → chunk-MM4FNWI4.js.map} +0 -0
- /package/dist/{chunk-M4SDVTKJ.js.map → chunk-MNZG4OHU.js.map} +0 -0
- /package/dist/{chunk-EILSAQVJ.js.map → chunk-N6AACDUW.js.map} +0 -0
- /package/dist/{chunk-BM3NEZ6X.js.map → chunk-NC55IFN3.js.map} +0 -0
- /package/dist/{chunk-MJJGJMYJ.js.map → chunk-NC7PVOEK.js.map} +0 -0
- /package/dist/{chunk-LA5T52RM.js.map → chunk-NCYMNCJO.js.map} +0 -0
- /package/dist/{chunk-HLOEPV5C.js.map → chunk-ND2BXV3P.js.map} +0 -0
- /package/dist/{chunk-UJDOWCQ3.js.map → chunk-NDBTFUO6.js.map} +0 -0
- /package/dist/{chunk-K5TOVX5A.js.map → chunk-NDQJZ7HF.js.map} +0 -0
- /package/dist/{chunk-35737UT4.js.map → chunk-NGJJJPZZ.js.map} +0 -0
- /package/dist/{chunk-42CMQ5VR.js.map → chunk-NJTSNNE7.js.map} +0 -0
- /package/dist/{chunk-FBTJKSTM.js.map → chunk-NRTE7DNV.js.map} +0 -0
- /package/dist/{chunk-YT3WGNG6.js.map → chunk-NULUNM7H.js.map} +0 -0
- /package/dist/{chunk-7XOVTPDI.js.map → chunk-NUNZS36W.js.map} +0 -0
- /package/dist/{chunk-FC2FTSK3.js.map → chunk-NW53H5RW.js.map} +0 -0
- /package/dist/{chunk-TW3LKRJF.js.map → chunk-NXCMHIKI.js.map} +0 -0
- /package/dist/{chunk-CGK6ALQU.js.map → chunk-O3LKCBP5.js.map} +0 -0
- /package/dist/{chunk-QIK2Q6N5.js.map → chunk-O6N4ABCA.js.map} +0 -0
- /package/dist/{chunk-73NXYYWE.js.map → chunk-O732GAFC.js.map} +0 -0
- /package/dist/{chunk-R3J2PTVQ.js.map → chunk-OF4TIKYC.js.map} +0 -0
- /package/dist/{chunk-BUBNGKWG.js.map → chunk-OMPVOMPP.js.map} +0 -0
- /package/dist/{chunk-4OXI6HCV.js.map → chunk-OPJJSKUK.js.map} +0 -0
- /package/dist/{chunk-4Y6BK7IU.js.map → chunk-OPWCMA4D.js.map} +0 -0
- /package/dist/{chunk-ADNMXBCX.js.map → chunk-ORJPS5VN.js.map} +0 -0
- /package/dist/{chunk-SKMNW4SW.js.map → chunk-OSY5K7L7.js.map} +0 -0
- /package/dist/{chunk-L4I665WK.js.map → chunk-OV6QJRT4.js.map} +0 -0
- /package/dist/{chunk-7O5CGGIQ.js.map → chunk-OVKYVZMW.js.map} +0 -0
- /package/dist/{chunk-7BYWOFVH.js.map → chunk-OZCBM3UC.js.map} +0 -0
- /package/dist/{chunk-ALVRWCXE.js.map → chunk-P3A2EINJ.js.map} +0 -0
- /package/dist/{chunk-BZO5ZMUP.js.map → chunk-PTAG4PDC.js.map} +0 -0
- /package/dist/{chunk-QHHSUR2Y.js.map → chunk-PTF5B7TJ.js.map} +0 -0
- /package/dist/{chunk-O2IOPP3R.js.map → chunk-Q3DPEYX4.js.map} +0 -0
- /package/dist/{chunk-G7FU6PUA.js.map → chunk-QB2KMIDP.js.map} +0 -0
- /package/dist/{chunk-64PO2WXU.js.map → chunk-QCSJ4CWE.js.map} +0 -0
- /package/dist/{chunk-YYICQDK4.js.map → chunk-QIOQ2NPQ.js.map} +0 -0
- /package/dist/{chunk-NB2HMRT2.js.map → chunk-QK5EFEUT.js.map} +0 -0
- /package/dist/{chunk-366XZ4PM.js.map → chunk-QPQBLYQJ.js.map} +0 -0
- /package/dist/{chunk-Q6XQ2R37.js.map → chunk-QPSGCC5D.js.map} +0 -0
- /package/dist/{chunk-JJZPLGIP.js.map → chunk-QZAAUQRN.js.map} +0 -0
- /package/dist/{chunk-VGUN6VB2.js.map → chunk-RGBI63KJ.js.map} +0 -0
- /package/dist/{chunk-LRN6GYAZ.js.map → chunk-RLBKLAEY.js.map} +0 -0
- /package/dist/{chunk-F7U3QPZ3.js.map → chunk-RMFKVOM7.js.map} +0 -0
- /package/dist/{chunk-Q4EFRI6X.js.map → chunk-ROKQU7WG.js.map} +0 -0
- /package/dist/{chunk-7QOHRZ67.js.map → chunk-RPVREAU7.js.map} +0 -0
- /package/dist/{chunk-VGWWEVSD.js.map → chunk-RQKLF42C.js.map} +0 -0
- /package/dist/{chunk-2VTTKH23.js.map → chunk-SEO7TICN.js.map} +0 -0
- /package/dist/{chunk-3QNRBEYH.js.map → chunk-SHHJCL7X.js.map} +0 -0
- /package/dist/{chunk-E6SQKHAU.js.map → chunk-SIRLACNZ.js.map} +0 -0
- /package/dist/{chunk-H2TCRX3H.js.map → chunk-SKPHMYAA.js.map} +0 -0
- /package/dist/{chunk-YDCUBUWH.js.map → chunk-SODC7T6L.js.map} +0 -0
- /package/dist/{chunk-TNYFHKVV.js.map → chunk-SQJIKMN3.js.map} +0 -0
- /package/dist/{chunk-DO74DQC7.js.map → chunk-SVINDKVW.js.map} +0 -0
- /package/dist/{chunk-CPYGO76Q.js.map → chunk-SYCDHPZF.js.map} +0 -0
- /package/dist/{chunk-UQ3IM6FY.js.map → chunk-T2QX3FDP.js.map} +0 -0
- /package/dist/{chunk-NWGNFN3N.js.map → chunk-T3OWFVMS.js.map} +0 -0
- /package/dist/{chunk-N3OARGH2.js.map → chunk-T6XI5FLY.js.map} +0 -0
- /package/dist/{chunk-MQG7RV3B.js.map → chunk-T7OXJZCX.js.map} +0 -0
- /package/dist/{chunk-2T7DX6KR.js.map → chunk-TAT5USZN.js.map} +0 -0
- /package/dist/{chunk-ICX64J4U.js.map → chunk-TPQTRNER.js.map} +0 -0
- /package/dist/{chunk-D2TOWEYH.js.map → chunk-TUIN4MB7.js.map} +0 -0
- /package/dist/{chunk-LQDUHU3Y.js.map → chunk-TX3VECZU.js.map} +0 -0
- /package/dist/{chunk-TG7DADJR.js.map → chunk-TXLIEOJX.js.map} +0 -0
- /package/dist/{chunk-2ZVRJRXC.js.map → chunk-U3DN4HEY.js.map} +0 -0
- /package/dist/{chunk-PSMAWRPL.js.map → chunk-U7XM7CB4.js.map} +0 -0
- /package/dist/{chunk-4TQL3WP2.js.map → chunk-UJK53QFL.js.map} +0 -0
- /package/dist/{chunk-RBRX5ZS3.js.map → chunk-UMTXA2TH.js.map} +0 -0
- /package/dist/{chunk-36MIDGAH.js.map → chunk-UPDSXFK5.js.map} +0 -0
- /package/dist/{chunk-OYXBFSGK.js.map → chunk-UTIAXH52.js.map} +0 -0
- /package/dist/{chunk-5WUN7XPD.js.map → chunk-UVN5TMHU.js.map} +0 -0
- /package/dist/{chunk-UYE47LO6.js.map → chunk-VGYXW3VG.js.map} +0 -0
- /package/dist/{chunk-IKUNOX7F.js.map → chunk-VS7AHPCZ.js.map} +0 -0
- /package/dist/{chunk-MYUFMVCH.js.map → chunk-VTTAJOQ7.js.map} +0 -0
- /package/dist/{chunk-K63HGHZX.js.map → chunk-VWPOLUAO.js.map} +0 -0
- /package/dist/{chunk-GA4YEAMX.js.map → chunk-X3MWB2QU.js.map} +0 -0
- /package/dist/{chunk-I36GSRUJ.js.map → chunk-X6KAJI3V.js.map} +0 -0
- /package/dist/{chunk-IKMUFDVS.js.map → chunk-XBLRHV5R.js.map} +0 -0
- /package/dist/{chunk-XOSQP3YA.js.map → chunk-XDFP2LMW.js.map} +0 -0
- /package/dist/{chunk-MW7Y3T55.js.map → chunk-XEQMZB3C.js.map} +0 -0
- /package/dist/{chunk-B3LMRTRF.js.map → chunk-XEYLT5VA.js.map} +0 -0
- /package/dist/{chunk-UI4HI5QK.js.map → chunk-XHIQ5I6N.js.map} +0 -0
- /package/dist/{chunk-U6M4LS3M.js.map → chunk-XLH7QY2R.js.map} +0 -0
- /package/dist/{chunk-OSA5EQG5.js.map → chunk-XWFAMUZQ.js.map} +0 -0
- /package/dist/{chunk-6MT3HHUB.js.map → chunk-Y4OBB2VN.js.map} +0 -0
- /package/dist/{chunk-CZP5QXNB.js.map → chunk-YCVD6CI3.js.map} +0 -0
- /package/dist/{chunk-APW4T4SW.js.map → chunk-YENLNISG.js.map} +0 -0
- /package/dist/{chunk-JWPA6ZPZ.js.map → chunk-YIRVLKAX.js.map} +0 -0
- /package/dist/{chunk-LQ62ECE6.js.map → chunk-YL73CVNK.js.map} +0 -0
- /package/dist/{chunk-ILKDYBON.js.map → chunk-YLS6QE5G.js.map} +0 -0
- /package/dist/{chunk-YBKVGLQR.js.map → chunk-YPWU5KPE.js.map} +0 -0
- /package/dist/{chunk-IKJLSBUI.js.map → chunk-YQXTDZSU.js.map} +0 -0
- /package/dist/{chunk-TPMZBOFH.js.map → chunk-YSJEAAOL.js.map} +0 -0
- /package/dist/{chunk-W3BFRR2G.js.map → chunk-YWIFM7D7.js.map} +0 -0
- /package/dist/{chunk-WTJ4PLMU.js.map → chunk-YWVI6ZMK.js.map} +0 -0
- /package/dist/{chunk-5KWMYPJV.js.map → chunk-Z4FMAFNH.js.map} +0 -0
- /package/dist/{chunk-W5OWKVZG.js.map → chunk-Z654FWNU.js.map} +0 -0
- /package/dist/{chunk-5FH5LQVS.js.map → chunk-Z7Y523PS.js.map} +0 -0
- /package/dist/{chunk-HLL4PBO7.js.map → chunk-ZD67RM6G.js.map} +0 -0
- /package/dist/{chunk-IVYJX3OY.js.map → chunk-ZEG4VPBL.js.map} +0 -0
- /package/dist/{chunk-K6R5T44I.js.map → chunk-ZLYCOBHW.js.map} +0 -0
- /package/dist/{chunk-VADHIT26.js.map → chunk-ZNJ5MTXV.js.map} +0 -0
- /package/dist/{chunk-2KYQC4T5.js.map → chunk-ZSGY3H53.js.map} +0 -0
- /package/dist/{chunk-BKP43KK4.js.map → chunk-ZTPXACWB.js.map} +0 -0
- /package/dist/{chunk-JCY4CMDH.js.map → chunk-ZUA3JMI6.js.map} +0 -0
- /package/dist/{chunk-IGVVXLKJ.js.map → chunk-ZYAZUPPV.js.map} +0 -0
- /package/dist/{computer-viewer-LPZ763KF.js.map → computer-viewer-TDDO25AV.js.map} +0 -0
- /package/dist/{embedded-new-voice-YVMKSLKJ.js.map → embedded-new-voice-2G3VLPVQ.js.map} +0 -0
- /package/dist/{embedded-voice-BJPQFXSU.js.map → embedded-voice-T5IWOWGD.js.map} +0 -0
- /package/dist/{fleet-decision-row-AA4H5CDT.js.map → fleet-decision-row-WM64KXP3.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-HSMWVO4P.js.map → model-policy-picker-menu-SMC6J6QN.js.map} +0 -0
- /package/dist/{payment-page-card-3LTSFJGN.js.map → payment-page-card-G4U63KUV.js.map} +0 -0
- /package/dist/{platform-activity-row-5VYV6TX4.js.map → platform-activity-row-BUZGZAKZ.js.map} +0 -0
- /package/dist/{queue-surface-implementation-NXHZUKD2.js.map → queue-surface-implementation-4KUZ4PJV.js.map} +0 -0
- /package/dist/{sandbox-files-YCMLQUFU.js.map → sandbox-files-ESDMOFSD.js.map} +0 -0
- /package/dist/{session-connect-cards-KSQLMRM5.js.map → session-connect-cards-Q53KMMYY.js.map} +0 -0
- /package/dist/{session-realtime-ZR6JLG3Y.js.map → session-realtime-CF3I35WJ.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-YAHDPWVG.js.map → timeline-annotation-markers-CJK4RYZ4.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-KHXNCEJP.js.map → timeline-annotation-selection-67GF5H26.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-Y4XD3N7B.js.map → timeline-annotations-dialog-ONJPQDJQ.js.map} +0 -0
package/dist/automations.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/automations/event-rows.tsx","../src/components/automations/event-source-model.ts","../src/components/automations/automations-panel.tsx","../src/components/automations/automation-form.tsx","../src/components/automations/automation-when-field.tsx","../src/components/automations/event-trigger-editor.tsx","../src/components/automations/event-arguments-field.tsx","../src/components/automations/event-arguments-model.ts","../src/components/automations/event-source-tile.tsx","../src/components/automations/automation-template-model.ts","../src/components/automations/automation-template-parts.tsx","../src/components/automations/event-source-stand-ins.ts","../src/components/automations/event-trigger-summary.tsx","../src/automations.ts"],"sourcesContent":["/**\n * Rows for a source's events and its delivery log. Each row expands in place\n * to show what arrived. Use them inside a RowList with the matching columns.\n */\nimport { ExternalLinkIcon, RotateCcwIcon } from \"lucide-react\";\n\nimport { EVENT_DELIVERY_BODY_RETENTION_DAYS } from \"@opengeni/contracts/event-triggers\";\nimport type { EventDelivery, InboundEvent, InboundEventSummary } from \"@opengeni/sdk\";\n\nimport { useOpenGeniText, type OpenGeniText } from \"../../messages/runtime\";\nimport { DropdownMenuItem } from \"../../ui/dropdown-menu\";\nimport { ListRow, type RowListColumn } from \"../../ui/list-row\";\nimport { RelativeTime } from \"../../ui/relative-time\";\nimport { StatusBadge } from \"../../ui/status-badge\";\nimport {\n byteSizeLabel,\n deliveryTitle,\n eventActorLabel,\n eventDeliveryStatusBadge,\n} from \"./event-source-model\";\nimport { eventTypeLabel } from \"./event-trigger-model\";\n\n/** The columns of a RowList of InboundEventRow or EventDeliveryRow: when it arrived. */\nexport function eventRowColumns(t: OpenGeniText): RowListColumn[] {\n return [\n {\n id: \"received\",\n label: t(\"automations.rows.received\"),\n width: 132,\n align: \"end\",\n hideLabel: true,\n },\n ];\n}\n\n/** The quiet facts under an event: its type, who caused it and what it is about. */\nexport function inboundEventMeta(t: OpenGeniText, event: InboundEventSummary): string[] {\n return [eventTypeLabel(t, event.type), eventActorLabel(t, event.actor), event.subject].filter(\n (part): part is string => Boolean(part),\n );\n}\n\n/** One normalized event; expands to its data. */\nexport function InboundEventRow({\n event,\n expanded,\n onToggle,\n}: {\n event: InboundEvent;\n expanded: boolean;\n onToggle: () => void;\n}) {\n const t = useOpenGeniText();\n return (\n <ListRow\n title={event.summary}\n meta={inboundEventMeta(t, event)}\n status={\n event.gapBefore ? (\n <StatusBadge variant=\"dot\" tone=\"attention\" reason={t(\"automations.rows.gapReason\")}>\n {t(\"automations.rows.gap\")}\n </StatusBadge>\n ) : undefined\n }\n cells={{ received: <RelativeTime date={event.receivedAt} /> }}\n expanded={expanded}\n onOpen={onToggle}\n panel={<InboundEventDetail event={event} />}\n />\n );\n}\n\nexport function InboundEventDetail({ event }: { event: InboundEvent }) {\n const t = useOpenGeniText();\n return (\n <div className=\"flex min-w-0 flex-col gap-2 pb-3\">\n <dl className=\"m-0 grid min-w-0 grid-cols-[auto_minmax(0,1fr)] gap-x-4 gap-y-1 text-xs leading-4.5\">\n <dt className=\"text-fg-muted\">{t(\"automations.rows.type\")}</dt>\n <dd className=\"m-0 min-w-0 font-mono break-all text-fg\">{event.type}</dd>\n <dt className=\"text-fg-muted\">{t(\"automations.rows.happened\")}</dt>\n <dd className=\"m-0 text-fg\">\n <RelativeTime date={event.occurredAt} format=\"absolute\" />\n </dd>\n {event.url ? (\n <>\n <dt className=\"text-fg-muted\">{t(\"automations.rows.link\")}</dt>\n <dd className=\"m-0 min-w-0\">\n <a\n href={event.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"og-link inline-flex max-w-full items-center gap-1\"\n >\n <span className=\"min-w-0 truncate\">{event.url}</span>\n <ExternalLinkIcon aria-hidden=\"true\" className=\"size-3 shrink-0\" />\n </a>\n </dd>\n </>\n ) : null}\n </dl>\n <pre className=\"m-0 max-h-72 min-w-0 overflow-auto rounded-md border border-border bg-surface-2 p-3 font-mono text-xs leading-4.5 text-fg\">\n {JSON.stringify(event.data, null, 2)}\n </pre>\n {event.dataTruncated ? (\n <p className=\"m-0 text-xs leading-4.5 text-fg-muted\">\n {t(\"automations.rows.dataTruncated\")}\n </p>\n ) : null}\n </div>\n );\n}\n\n/** One delivery in a source's log; replay sits in its menu. */\nexport function EventDeliveryRow({\n delivery,\n canReplay,\n replaying = false,\n onReplay,\n expanded,\n onToggle,\n}: {\n delivery: EventDelivery;\n /** The viewer manages the source and the raw body is still kept. */\n canReplay: boolean;\n replaying?: boolean | undefined;\n onReplay: () => void;\n expanded: boolean;\n onToggle: () => void;\n}) {\n const t = useOpenGeniText();\n const status = eventDeliveryStatusBadge(t, delivery.status);\n const meta = [\n byteSizeLabel(t, delivery.bodyBytes),\n delivery.duplicateCount > 0\n ? t(\"automations.rows.sentAgain\", { count: delivery.duplicateCount })\n : null,\n delivery.replayOfDeliveryId ? t(\"automations.rows.replay\") : null,\n ].filter((part): part is string => Boolean(part));\n return (\n <ListRow\n title={deliveryTitle(t, delivery)}\n description={delivery.reason ?? undefined}\n meta={meta}\n status={\n <StatusBadge variant=\"dot\" status={status.status}>\n {status.label}\n </StatusBadge>\n }\n cells={{ received: <RelativeTime date={delivery.receivedAt} /> }}\n menu={\n canReplay ? (\n <DropdownMenuItem disabled={replaying} onSelect={onReplay}>\n <RotateCcwIcon />\n {t(\"automations.rows.replay\")}\n </DropdownMenuItem>\n ) : undefined\n }\n menuLabel={t(\"automations.rows.deliveryActions\")}\n expanded={expanded}\n onOpen={onToggle}\n panel={\n <div className=\"pb-3 text-xs leading-4.5 text-fg-muted\">\n {delivery.bodyRetained\n ? t(\"automations.rows.bodyKept\", { days: EVENT_DELIVERY_BODY_RETENTION_DAYS })\n : t(\"automations.rows.bodyGone\")}{\" \"}\n {delivery.eventIds.length > 0\n ? t(\"automations.rows.became\", { count: delivery.eventIds.length })\n : t(\"automations.rows.noEvents\")}\n </div>\n }\n />\n );\n}\n","/**\n * Event sources in the product's words: what each kind is, where its events\n * come from, its status, and its deliveries. Pure; text comes from the host's\n * message catalog through the `t` each function takes first.\n */\nimport type {\n CreateEventSourceRequest,\n EventActor,\n EventDelivery,\n EventSource,\n WebhookEventAdapter,\n} from \"@opengeni/sdk\";\nimport {\n isEventStatusReasonCode,\n WEBHOOK_FORMAT_PRESETS,\n webhookPresetOf,\n type EventStatusReasonCode,\n type WebhookFormatPreset,\n} from \"@opengeni/contracts/event-triggers\";\n\nimport type { OpenGeniText } from \"../../messages/runtime\";\nimport type { ProductStatus } from \"../../ui/status-badge\";\nimport { eventTypeLabel } from \"./event-trigger-model\";\n\n/** What a person picks when adding a source. One per kind and webhook adapter. */\nexport type EventSourceChoice =\n | \"webhook\"\n | \"linear\"\n | \"sentry\"\n | \"tailscale\"\n | \"github\"\n | \"slack\"\n | \"gmail\"\n | \"mcp\"\n | \"workspace\";\n\nexport interface EventSourceChoiceMeta {\n choice: EventSourceChoice;\n /** \"GitHub\", \"Linear\", \"Your own app\". */\n name: string;\n /** One sentence: what arrives and how it connects. */\n description: string;\n /** For the brand logo, when the host has one. */\n providerDomain: string | null;\n /** How it connects: Opengeni sets it up, or a person pastes a URL and secret. */\n setup: \"automatic\" | \"paste\";\n /** Who can see it and its events. */\n audience: \"workspace\" | \"personal\" | \"choice\";\n}\n\ntype EventSourceChoiceFacts = Omit<EventSourceChoiceMeta, \"name\" | \"description\">;\n\n/** Every choice in the order \"Add a source\" offers them. */\nconst CHOICE_FACTS: readonly EventSourceChoiceFacts[] = [\n { choice: \"workspace\", providerDomain: null, setup: \"automatic\", audience: \"personal\" },\n { choice: \"github\", providerDomain: \"github.com\", setup: \"automatic\", audience: \"workspace\" },\n { choice: \"slack\", providerDomain: \"slack.com\", setup: \"automatic\", audience: \"workspace\" },\n { choice: \"gmail\", providerDomain: \"mail.google.com\", setup: \"automatic\", audience: \"personal\" },\n { choice: \"linear\", providerDomain: \"linear.app\", setup: \"paste\", audience: \"choice\" },\n { choice: \"sentry\", providerDomain: \"sentry.io\", setup: \"paste\", audience: \"choice\" },\n { choice: \"tailscale\", providerDomain: \"tailscale.com\", setup: \"paste\", audience: \"choice\" },\n { choice: \"mcp\", providerDomain: null, setup: \"automatic\", audience: \"personal\" },\n { choice: \"webhook\", providerDomain: null, setup: \"paste\", audience: \"choice\" },\n];\n\nfunction choiceFacts(choice: EventSourceChoice): EventSourceChoiceFacts {\n // A kind from a newer server than this client still shows, plainly.\n return (\n CHOICE_FACTS.find((entry) => entry.choice === choice) ?? {\n choice,\n providerDomain: null,\n setup: \"automatic\",\n audience: \"personal\",\n }\n );\n}\n\n/** The choice's name: the app's own name, or what the kind is called. */\nexport function eventSourceChoiceName(t: OpenGeniText, choice: EventSourceChoice): string {\n switch (choice) {\n case \"github\":\n return \"GitHub\";\n case \"slack\":\n return \"Slack\";\n case \"gmail\":\n return \"Gmail\";\n case \"linear\":\n return \"Linear\";\n case \"sentry\":\n return \"Sentry\";\n case \"tailscale\":\n return \"Tailscale\";\n case \"mcp\":\n return t(\"automations.source.mcp.name\");\n case \"webhook\":\n return t(\"automations.source.webhook.name\");\n case \"workspace\":\n return t(\"automations.source.workspace.name\");\n default:\n return String(choice);\n }\n}\n\nfunction choiceDescription(t: OpenGeniText, choice: EventSourceChoice): string {\n switch (choice) {\n case \"github\":\n return t(\"automations.source.github.description\");\n case \"slack\":\n return t(\"automations.source.slack.description\");\n case \"gmail\":\n return t(\"automations.source.gmail.description\");\n case \"linear\":\n return t(\"automations.source.linear.description\");\n case \"sentry\":\n return t(\"automations.source.sentry.description\");\n case \"tailscale\":\n return t(\"automations.source.tailscale.description\");\n case \"mcp\":\n return t(\"automations.source.mcp.description\");\n case \"webhook\":\n return t(\"automations.source.webhook.description\");\n case \"workspace\":\n return t(\"automations.source.workspace.description\");\n default:\n return \"\";\n }\n}\n\nexport function eventSourceChoiceMeta(\n t: OpenGeniText,\n choice: EventSourceChoice,\n): EventSourceChoiceMeta {\n return {\n ...choiceFacts(choice),\n name: eventSourceChoiceName(t, choice),\n description: choiceDescription(t, choice),\n };\n}\n\n/** Every kind of source a person can add, in the order to offer them. */\nexport function eventSourceChoices(t: OpenGeniText): EventSourceChoiceMeta[] {\n return CHOICE_FACTS.map((facts) => eventSourceChoiceMeta(t, facts.choice));\n}\n\n/** True for a known choice, for example a `?kind=` link parameter. */\nexport function isEventSourceChoice(value: unknown): value is EventSourceChoice {\n return CHOICE_FACTS.some((entry) => entry.choice === value);\n}\n\n/**\n * Apps whose own webhook a person pastes a URL into: each is a custom webhook\n * made with the app's preset.\n */\nconst APP_WEBHOOK_CHOICES = [\"linear\", \"sentry\", \"tailscale\"] as const;\ntype AppWebhookChoice = (typeof APP_WEBHOOK_CHOICES)[number];\n\nfunction isAppWebhookChoice(value: unknown): value is AppWebhookChoice {\n return APP_WEBHOOK_CHOICES.includes(value as AppWebhookChoice);\n}\n\n/** The custom webhook preset each app choice is made with. */\nconst PRESET_OF: Record<AppWebhookChoice, WebhookFormatPreset> = {\n linear: \"linear\",\n sentry: \"sentry\",\n tailscale: \"tailscale\",\n};\n\n/** The facts about a source that say which choice it is. */\nexport type EventSourceChoiceSubject = Pick<EventSource, \"kind\" | \"adapter\"> & {\n format?:\n | {\n preset?: string | undefined;\n signature?: { scheme: string; parameter?: string | undefined } | undefined;\n }\n | null\n | undefined;\n};\n\n/**\n * The choice a source is: its kind, its app for a custom webhook made with an\n * app's preset (or a server's older `linear` or `sentry` adapter), else a\n * webhook.\n */\nexport function eventSourceChoiceOf(source: EventSourceChoiceSubject): EventSourceChoice {\n if (source.kind !== \"webhook\") return source.kind;\n const { preset } = webhookPresetOf({ adapter: source.adapter, preset: source.format?.preset });\n return isAppWebhookChoice(preset) ? preset : \"webhook\";\n}\n\nexport const WEBHOOK_ADAPTER_OF: Partial<Record<EventSourceChoice, WebhookEventAdapter>> = {\n webhook: \"standard\",\n linear: \"custom\",\n sentry: \"custom\",\n tailscale: \"custom\",\n};\n\n/** A stand-in source of the chosen kind, for its tile before one exists. */\nexport function eventSourceSubjectOfChoice(\n t: OpenGeniText,\n choice: EventSourceChoice,\n): Pick<EventSource, \"kind\" | \"adapter\" | \"name\" | \"mcp\"> & {\n format: { preset: string } | null;\n} {\n const adapter = WEBHOOK_ADAPTER_OF[choice] ?? null;\n const preset = isAppWebhookChoice(choice) ? PRESET_OF[choice] : undefined;\n return {\n kind: adapter\n ? \"webhook\"\n : (choice as Exclude<EventSourceChoice, \"webhook\" | AppWebhookChoice>),\n adapter,\n format: preset ? { preset } : null,\n name: eventSourceChoiceName(t, choice),\n mcp: null,\n };\n}\n\n/** What adding one is called: \"Add GitHub\", \"Add a webhook\". */\nexport function eventSourceAddLabel(t: OpenGeniText, choice: EventSourceChoice): string {\n if (choice === \"webhook\") return t(\"automations.source.addWebhook\");\n if (choice === \"mcp\") return t(\"automations.source.addMcp\");\n if (choice === \"workspace\") return t(\"automations.source.addWorkspace\");\n return t(\"automations.source.add\", { name: eventSourceChoiceName(t, choice) });\n}\n\n/**\n * \"GitHub\", \"Linear webhook\", \"Webhook\", \"MCP server\", \"Workspace events\": the\n * kind, not the name.\n */\nexport function eventSourceKindLabel(t: OpenGeniText, source: EventSourceChoiceSubject): string {\n const choice = eventSourceChoiceOf(source);\n if (isAppWebhookChoice(choice))\n return t(\"automations.source.kind.appWebhook\", { app: eventSourceChoiceName(t, choice) });\n if (choice === \"webhook\") return t(\"automations.source.kind.webhook\");\n if (choice === \"workspace\") return t(\"automations.source.kind.workspace\");\n return eventSourceChoiceName(t, choice);\n}\n\n/** The domain whose logo stands for the source, when it has one. */\nexport function eventSourceProviderDomain(source: EventSourceChoiceSubject): string | null {\n return choiceFacts(eventSourceChoiceOf(source)).providerDomain;\n}\n\n/**\n * Why a source or trigger is held back, or why a source can't send an event\n * type, as the server reported it: a code, the same reason as an English\n * sentence, and what the app or server said, when it said something.\n */\nexport interface EventStatusReasonParts {\n /** The server's sentence, shown when the code is missing or unknown here. */\n text: string | null;\n code?: string | null | undefined;\n detail?: string | null | undefined;\n}\n\ntype SourceNamedReason = Exclude<\n EventStatusReasonCode,\n | \"turned_off\"\n | \"awaiting_secret\"\n | \"connector_removed\"\n | \"account_changed\"\n | \"github_event_not_subscribed\"\n>;\n\nconst SOURCE_NAMED_REASONS: Record<SourceNamedReason, (t: OpenGeniText, source: string) => string> =\n {\n reconnect: (t, source) => t(\"automations.statusReason.reconnect\", { source }),\n missing_permission: (t, source) => t(\"automations.statusReason.missingPermission\", { source }),\n app_not_enabled: (t, source) => t(\"automations.statusReason.appNotEnabled\", { source }),\n host_sign_in: (t, source) => t(\"automations.statusReason.hostSignIn\", { source }),\n events_unsupported: (t, source) => t(\"automations.statusReason.eventsUnsupported\", { source }),\n event_type_gone: (t, source) => t(\"automations.statusReason.eventTypeGone\", { source }),\n forbidden: (t, source) => t(\"automations.statusReason.forbidden\", { source }),\n invalid_arguments: (t, source) => t(\"automations.statusReason.invalidArguments\", { source }),\n needs_public_address: (t, source) =>\n t(\"automations.statusReason.needsPublicAddress\", { source }),\n push_only: (t, source) => t(\"automations.statusReason.pushOnly\", { source }),\n delivery_mode_unsupported: (t, source) =>\n t(\"automations.statusReason.deliveryModeUnsupported\", { source }),\n callback_unreachable: (t, source) =>\n t(\"automations.statusReason.callbackUnreachable\", { source }),\n not_answering: (t, source) => t(\"automations.statusReason.notAnswering\", { source }),\n unavailable: (t, source) => t(\"automations.statusReason.unavailable\", { source }),\n };\n\n/** Codes whose detail is what the app or server said, quoted after the reason. */\nconst QUOTES_DETAIL: ReadonlySet<EventStatusReasonCode> = new Set([\n \"forbidden\",\n \"invalid_arguments\",\n \"callback_unreachable\",\n]);\n\n/**\n * A held-back reason in the viewer's language. Known codes are worded from\n * the catalog, naming the source when `sourceName` is given; anything else,\n * such as a code from a newer server, shows the server's sentence.\n */\nexport function eventStatusReasonText(\n t: OpenGeniText,\n reason: EventStatusReasonParts,\n sourceName?: string | null,\n): string | null {\n const code = reason.code;\n if (!isEventStatusReasonCode(code)) return reason.text;\n const detail = reason.detail?.trim() || null;\n const source = sourceName?.trim() || null;\n switch (code) {\n case \"turned_off\":\n return t(\"automations.statusReason.turnedOff\");\n case \"awaiting_secret\":\n return t(\"automations.statusReason.awaitingSecret\");\n case \"connector_removed\":\n return t(\"automations.statusReason.connectorRemoved\");\n case \"github_event_not_subscribed\":\n return detail\n ? t(\"automations.statusReason.githubEventNotSubscribed\", { event: detail })\n : reason.text;\n case \"account_changed\":\n return detail && source\n ? t(\"automations.statusReason.accountChanged\", { source, account: detail })\n : reason.text;\n }\n if (!source) return reason.text;\n const sentence = SOURCE_NAMED_REASONS[code](t, source);\n return detail && QUOTES_DETAIL.has(code)\n ? t(\"automations.statusReason.withDetail\", { reason: sentence, detail })\n : sentence;\n}\n\n/**\n * The badge a source's or trigger's row shows; a healthy one shows none.\n * `sourceName` names the source in the reason; a source's own name is used\n * when the item is a source.\n */\nexport function eventSourceStatusBadge(\n t: OpenGeniText,\n item: Pick<EventSource, \"status\" | \"statusReason\"> &\n Partial<Pick<EventSource, \"statusReasonCode\" | \"statusReasonDetail\" | \"name\">>,\n sourceName?: string | null,\n): { status: ProductStatus; label: string; reason: string | null } | null {\n const reason = () =>\n eventStatusReasonText(\n t,\n { text: item.statusReason, code: item.statusReasonCode, detail: item.statusReasonDetail },\n sourceName ?? item.name,\n );\n if (item.status === \"blocked\") {\n return {\n status: \"needs_you\",\n label: t(\"automations.source.status.blocked\"),\n reason: reason(),\n };\n }\n if (item.status === \"disabled\") {\n return {\n status: \"off\",\n label: t(\"automations.source.status.off\"),\n reason: reason(),\n };\n }\n return null;\n}\n\n/** How a pasted webhook is connected: the app gets the URL, Opengeni gets its secret. */\nexport interface PastedWebhookSetup {\n /** \"Linear\". */\n app: string;\n /** What the app calls the secret: \"signing secret\", \"client secret\". */\n secretName: string;\n /** Where to paste the URL in the app, in one sentence. */\n urlStep: string;\n /** Where the app shows the secret, in one sentence. */\n secretStep: string;\n}\n\nexport function pastedWebhookSetup(\n t: OpenGeniText,\n source: EventSourceChoiceSubject,\n): PastedWebhookSetup | null {\n if (source.kind !== \"webhook\") return null;\n const app = eventSourceChoiceOf(source);\n if (!isAppWebhookChoice(app)) {\n if (source.adapter !== \"custom\") return null;\n // Any other app's webhook: the same two steps, in that app's settings,\n // worded for how it proves a delivery is its own.\n const signature = source.format?.signature;\n const scheme = signature?.scheme;\n if (scheme === \"url_token\") {\n return {\n app: t(\"automations.paste.custom.app\"),\n secretName: t(\"automations.paste.urlToken.secretName\"),\n urlStep: t(\"automations.paste.urlToken.urlStep\", {\n parameter: signature?.parameter ?? \"token\",\n }),\n secretStep: t(\"automations.paste.urlToken.secretStep\"),\n };\n }\n if (scheme === \"ed25519\") {\n return {\n app: t(\"automations.paste.custom.app\"),\n secretName: t(\"automations.paste.publicKey.secretName\"),\n urlStep: t(\"automations.paste.custom.urlStep\"),\n secretStep: t(\"automations.paste.publicKey.secretStep\"),\n };\n }\n return {\n app: t(\"automations.paste.custom.app\"),\n secretName: t(\"automations.paste.custom.secretName\"),\n urlStep: t(\"automations.paste.custom.urlStep\"),\n secretStep: t(\"automations.paste.custom.secretStep\"),\n };\n }\n return { app: eventSourceChoiceName(t, app), ...APP_PASTE_STEPS[app](t) };\n}\n\n/** Each app's paste wording, with literal catalog keys so key usage stays checkable. */\nconst APP_PASTE_STEPS: Record<\n AppWebhookChoice,\n (t: OpenGeniText) => Omit<PastedWebhookSetup, \"app\">\n> = {\n linear: (t) => ({\n secretName: t(\"automations.paste.linear.secretName\"),\n urlStep: t(\"automations.paste.linear.urlStep\"),\n secretStep: t(\"automations.paste.linear.secretStep\"),\n }),\n sentry: (t) => ({\n secretName: t(\"automations.paste.sentry.secretName\"),\n urlStep: t(\"automations.paste.sentry.urlStep\"),\n secretStep: t(\"automations.paste.sentry.secretStep\"),\n }),\n tailscale: (t) => ({\n secretName: t(\"automations.paste.tailscale.secretName\"),\n urlStep: t(\"automations.paste.tailscale.urlStep\"),\n secretStep: t(\"automations.paste.tailscale.secretStep\"),\n }),\n};\n\n/** The request that adds a source of the chosen kind; an unnamed webhook takes the kind's name. */\nexport function createEventSourceRequest(\n t: OpenGeniText,\n input: {\n choice: EventSourceChoice;\n name: string;\n visibility: \"private\" | \"workspace\";\n signingSecret?: string | undefined;\n mcpServerId?: string | undefined;\n connectionId?: string | undefined;\n },\n): CreateEventSourceRequest {\n const name = input.name.trim();\n const adapter = WEBHOOK_ADAPTER_OF[input.choice];\n if (adapter) {\n const preset = isAppWebhookChoice(input.choice) ? PRESET_OF[input.choice] : undefined;\n return {\n kind: \"webhook\",\n adapter,\n name: name || eventSourceChoiceName(t, input.choice),\n visibility: input.visibility,\n ...(preset ? { format: WEBHOOK_FORMAT_PRESETS[preset] } : {}),\n ...(adapter !== \"standard\" && input.signingSecret\n ? { signingSecret: input.signingSecret.trim() }\n : {}),\n };\n }\n if (input.choice === \"mcp\") {\n return {\n kind: \"mcp\",\n serverId: input.mcpServerId ?? \"\",\n ...(input.connectionId ? { connectionId: input.connectionId } : {}),\n ...(name ? { name } : {}),\n };\n }\n if (input.choice === \"gmail\") {\n return {\n kind: \"gmail\",\n ...(input.connectionId ? { connectionId: input.connectionId } : {}),\n ...(name ? { name } : {}),\n };\n }\n if (input.choice === \"workspace\") return { kind: \"workspace\", ...(name ? { name } : {}) };\n return { kind: input.choice as \"github\" | \"slack\", ...(name ? { name } : {}) };\n}\n\n/* ----------------------------------------------------------------------------\n Deliveries and events.\n -------------------------------------------------------------------------- */\n\n/** What became of a delivery, as its badge. */\nexport function eventDeliveryStatusBadge(\n t: OpenGeniText,\n status: EventDelivery[\"status\"],\n): { status: ProductStatus; label: string } {\n switch (status) {\n case \"accepted\":\n return { status: \"succeeded\", label: t(\"automations.delivery.accepted\") };\n case \"ignored\":\n return { status: \"off\", label: t(\"automations.delivery.ignored\") };\n case \"rejected\":\n return { status: \"failed\", label: t(\"automations.delivery.rejected\") };\n case \"failed\":\n return { status: \"failed\", label: t(\"automations.delivery.failed\") };\n }\n}\n\n/** \"3 events\", \"No events\", \"1 event\". */\nexport function deliveryEventsLabel(\n t: OpenGeniText,\n delivery: Pick<EventDelivery, \"eventIds\">,\n): string {\n const count = delivery.eventIds.length;\n if (count === 0) return t(\"automations.delivery.noEvents\");\n return t(\"automations.delivery.events\", { count });\n}\n\n/**\n * What a delivery became, as its row's title: \"pull_request.opened\",\n * \"issues.opened and issue_comment.created\", \"push and 2 more\", or the count\n * when the server does not say which types.\n */\nexport function deliveryTitle(\n t: OpenGeniText,\n delivery: Pick<EventDelivery, \"eventIds\"> & { eventTypes?: readonly string[] | undefined },\n): string {\n const types = delivery.eventTypes ?? [];\n if (types.length === 0) return deliveryEventsLabel(t, delivery);\n const [first, second] = types as [string, ...string[]];\n if (types.length === 1) return eventTypeLabel(t, first);\n if (types.length === 2)\n return t(\"automations.delivery.titleTwo\", {\n first: eventTypeLabel(t, first),\n second: eventTypeLabel(t, second!),\n });\n return t(\"automations.eventTypes.firstAndMore\", {\n first: eventTypeLabel(t, first),\n count: types.length - 1,\n });\n}\n\n/** \"1.2 KB\", with the host locale's decimal separator. */\nexport function byteSizeLabel(t: OpenGeniText, bytes: number): string {\n const number = (value: number, digits: number) =>\n new Intl.NumberFormat(t.locale, {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n }).format(value);\n if (bytes < 1024) return t(\"automations.bytes.bytes\", { size: number(bytes, 0) });\n if (bytes < 1024 * 1024)\n return t(\"automations.bytes.kilobytes\", {\n size: number(bytes / 1024, bytes < 10 * 1024 ? 1 : 0),\n });\n return t(\"automations.bytes.megabytes\", { size: number(bytes / (1024 * 1024), 1) });\n}\n\n/** Who caused an event, in words; null when unknown. */\nexport function eventActorLabel(t: OpenGeniText, actor: EventActor): string | null {\n if (actor.kind === \"opengeni\")\n return actor.name\n ? t(\"automations.actor.selfNamed\", { name: actor.name })\n : t(\"automations.actor.self\");\n if (actor.name)\n return actor.kind === \"bot\"\n ? t(\"automations.actor.botNamed\", { name: actor.name })\n : actor.name;\n return actor.kind === \"bot\" ? t(\"automations.actor.bot\") : null;\n}\n","/**\n * A drop-in Automations panel: the automations of a workspace or of one chat,\n * with create and edit, on and off, Run now, delete and recent runs. The host\n * hands it its OpenGeniClient; the panel reads and writes through it and keeps\n * its own navigation (the list, one automation, the form), so it fits a\n * dialog, a sheet or a page.\n *\n * Runs inherit their access: an automation in a chat runs with that chat's\n * settings, and one that starts a new chat each run follows the workspace's\n * defaults with its owner's access, like a new chat.\n *\n * New automations can start from a template: the host's own, and the ones\n * people saved in the workspace. A template only fills the form.\n */\nimport { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport {\n BookmarkPlusIcon,\n CalendarClockIcon,\n ChevronLeftIcon,\n PlayIcon,\n PlusIcon,\n ZapIcon,\n} from \"lucide-react\";\n\nimport type {\n EventSource,\n OpenGeniClient,\n ReadyEventSource,\n ScheduledTask,\n ScheduledTaskRun,\n WorkspaceAutomationTemplate,\n} from \"@opengeni/sdk\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { usePortalTokenSource } from \"../../lib/use-portal-token-style\";\nimport { apiErrorFacts } from \"../../ui/api-error\";\nimport { Button } from \"../../ui/button\";\nimport { ConfirmDialog } from \"../../ui/confirm-dialog\";\nimport { DropdownMenuItem } from \"../../ui/dropdown-menu\";\nimport { EmptyState } from \"../../ui/empty-state\";\nimport { ErrorMessage } from \"../../ui/error-message\";\nimport { ListRow, ListRowSkeleton, RowList } from \"../../ui/list-row\";\nimport { LogoTile } from \"../../ui/logo-tile\";\nimport { StandaloneOverlayRoot } from \"../../ui/portal-container\";\nimport { RelativeTime, useMinuteNow } from \"../../ui/relative-time\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { StatusBadge, type ProductStatus } from \"../../ui/status-badge\";\nimport { Switch } from \"../../ui/switch\";\nimport { TooltipProvider } from \"../../ui/tooltip\";\nimport { formatRunTime } from \"../../ui/cadence-picker\";\nimport { cn } from \"../../lib/cn\";\nimport { AutomationForm, errorSentence } from \"./automation-form\";\nimport {\n automationCreateRequest,\n automationDraftFrom,\n automationNextRun,\n automationRunErrorText,\n automationRunEventsLabel,\n automationRunStatusLabel,\n automationRunTriggerLabel,\n automationUpdateRequest,\n automationWhenSentence,\n automationWhenWords,\n hasEventTriggers,\n isAgentAutomation,\n isFinishedOnce,\n newAutomationDraft,\n sortAutomations,\n viewerTimeZone,\n type AutomationDraft,\n} from \"./automation-model\";\nimport {\n automationDraftFromTemplate,\n automationTemplateFromTask,\n automationTemplateOfSaved,\n automationTemplatesFor,\n type AutomationTemplate,\n} from \"./automation-template-model\";\nimport { AutomationTemplateDialog, AutomationTemplateList } from \"./automation-template-parts\";\nimport { useEventSourceStandIns, type AutomationEventServer } from \"./event-source-stand-ins\";\nimport type { EventSourceLogoResolver } from \"./event-source-tile\";\nimport { EventTriggerSummary } from \"./event-trigger-summary\";\n\nexport interface AutomationsPanelProps {\n client: OpenGeniClient;\n workspaceId: string;\n /**\n * Scope it to one chat: that chat's automations, and new ones continue it.\n * Without it: the workspace's automations, and new ones start a new chat\n * each run.\n */\n sessionId?: string | undefined;\n /** Null omits the heading when the host already supplies one. */\n title?: string | null | undefined;\n /** Offer event triggers. Default: whenever this server runs them. */\n eventTriggers?: boolean | undefined;\n /**\n * MCP servers to offer by name, such as the host's own. Servers the person\n * is signed in to that offer events, and their Gmail accounts, are offered\n * without this. The person's source for one is added the first time they\n * pick it.\n */\n eventServers?: readonly AutomationEventServer[] | undefined;\n /**\n * Offer this workspace's own events, such as a meeting's transcript being\n * ready. The person's source for them is added the first time they pick it.\n * Default false.\n */\n workspaceEvents?: boolean | undefined;\n /** Arguments new MCP subscriptions start with, such as `{ projectId }`. */\n argumentDefaults?: Readonly<Record<string, unknown>> | undefined;\n /**\n * Templates a new automation can start from, such as some of\n * `builtinAutomationTemplates(t)` or the host's own. Default none.\n */\n templates?: readonly AutomationTemplate[] | undefined;\n /**\n * Offer the templates people saved in this workspace, and saving an\n * automation as one. Default true.\n */\n workspaceTemplates?: boolean | undefined;\n /** Brand logos for event sources, from the host's connector catalog. */\n sourceLogo?: EventSourceLogoResolver | undefined;\n /** Opens the chat a run happened in. Without it, runs don't link anywhere. */\n onOpenSession?: ((sessionId: string) => void) | undefined;\n className?: string | undefined;\n}\n\ntype View =\n | { kind: \"list\" }\n | { kind: \"detail\"; taskId: string }\n /** Pick a template or start from scratch. */\n | { kind: \"new\" }\n | { kind: \"form\"; taskId: string | null; template?: AutomationTemplate | undefined };\n\ntype Notice = { tone: \"info\" | \"error\"; text: string } | null;\n\ntype TemplateDialog =\n | { mode: \"save\"; task: ScheduledTask }\n | { mode: \"rename\"; template: WorkspaceAutomationTemplate }\n | null;\n\nfunction newTriggerId(): string | undefined {\n return globalThis.crypto?.randomUUID?.();\n}\n\nexport function AutomationsPanel({\n client,\n workspaceId,\n sessionId,\n title: titleProp,\n eventTriggers: eventTriggersProp,\n eventServers,\n workspaceEvents = false,\n argumentDefaults,\n templates: hostTemplates,\n workspaceTemplates = true,\n sourceLogo,\n onOpenSession,\n className,\n}: AutomationsPanelProps) {\n const t = useOpenGeniText();\n const title = titleProp === undefined ? t(\"automations.panel.title\") : titleProp;\n /** The panel's root: its overlays copy its tokens, so they match it outside the host's tree. */\n const { source: root, ref: rootRef } = usePortalTokenSource<HTMLElement>();\n const now = new Date(useMinuteNow());\n const [view, setView] = useState<View>({ kind: \"list\" });\n const [notice, setNotice] = useState<Notice>(null);\n /** Another view; what the last action said belongs to the one it was done in. */\n const go = useCallback((next: View) => {\n setNotice(null);\n setView(next);\n }, []);\n const [busy, setBusy] = useState<ReadonlySet<string>>(() => new Set());\n const [deleting, setDeleting] = useState<ScheduledTask | null>(null);\n /** The last Run now, so the automation's recent runs can look for the run it started. */\n const [started, setStarted] = useState<{ taskId: string; at: number } | null>(null);\n\n /* Automations. */\n const [tasks, setTasks] = useState<ScheduledTask[] | undefined>(undefined);\n const [loadError, setLoadError] = useState<unknown>(null);\n const [loadAttempt, setLoadAttempt] = useState(0);\n useEffect(() => {\n let live = true;\n setLoadError(null);\n client.listScheduledTasks(workspaceId, sessionId ? { sessionId } : {}).then(\n (list) => {\n if (live) setTasks(list.filter(isAgentAutomation));\n },\n (error: unknown) => {\n if (live) setLoadError(error);\n },\n );\n return () => {\n live = false;\n };\n }, [client, workspaceId, sessionId, loadAttempt]);\n const upsert = useCallback((task: ScheduledTask) => {\n setTasks((current) =>\n current?.some((entry) => entry.id === task.id)\n ? current.map((entry) => (entry.id === task.id ? task : entry))\n : [...(current ?? []), task],\n );\n }, []);\n\n /* Event sources: whether events run here, and what triggers can point at. */\n const [sources, setSources] = useState<EventSource[] | undefined>(undefined);\n const [eventsRun, setEventsRun] = useState<boolean | undefined>(undefined);\n const [sourcesAttempt, setSourcesAttempt] = useState(0);\n useEffect(() => {\n if (eventTriggersProp === false) return;\n let live = true;\n client.listEventSources(workspaceId).then(\n (list) => {\n if (!live) return;\n setSources(list);\n setEventsRun(true);\n },\n (error: unknown) => {\n if (!live) return;\n // This server doesn't run event triggers; anything else still offers them.\n setEventsRun(apiErrorFacts(error).status !== 404);\n setSources((current) => current ?? []);\n },\n );\n return () => {\n live = false;\n };\n }, [client, workspaceId, eventTriggersProp, sourcesAttempt]);\n const eventTriggers = eventTriggersProp !== false && eventsRun === true;\n\n // What the person can use without setting it up; it can take a moment to learn.\n const [readySources, setReadySources] = useState<ReadyEventSource[] | undefined>(undefined);\n useEffect(() => {\n if (!eventTriggers) return;\n let live = true;\n client.listReadyEventSources(workspaceId).then(\n (list) => {\n if (live) setReadySources(list);\n },\n () => {\n // Without the list, the sources the person has are still offered.\n if (live) setReadySources((current) => current ?? []);\n },\n );\n return () => {\n live = false;\n };\n }, [client, workspaceId, eventTriggers, sourcesAttempt]);\n\n // Sources that need no setting up stand in for the person's own until picked.\n const standIns = useEventSourceStandIns({\n client,\n workspaceId,\n sources,\n readySources,\n eventServers,\n workspaceEvents,\n });\n const formSources = standIns.sources;\n\n /* Templates: the host's own, then the ones saved in this workspace. */\n const [savedTemplates, setSavedTemplates] = useState<WorkspaceAutomationTemplate[] | undefined>(\n undefined,\n );\n /** This server keeps workspace templates; false on one that doesn't. */\n const [templatesKept, setTemplatesKept] = useState(false);\n useEffect(() => {\n if (!workspaceTemplates) return;\n let live = true;\n client.listAutomationTemplates(workspaceId).then(\n (list) => {\n if (!live) return;\n setSavedTemplates(list);\n setTemplatesKept(true);\n },\n (error: unknown) => {\n if (!live) return;\n // An older server has none; anything else still lets people save one.\n setTemplatesKept(apiErrorFacts(error).status !== 404);\n setSavedTemplates((current) => current ?? []);\n },\n );\n return () => {\n live = false;\n };\n }, [client, workspaceId, workspaceTemplates]);\n const offerSaved = workspaceTemplates && templatesKept;\n const fits = { eventTriggers, workspaceEvents };\n const offered = automationTemplatesFor(hostTemplates ?? [], fits);\n const savedOffered = offerSaved\n ? automationTemplatesFor((savedTemplates ?? []).map(automationTemplateOfSaved), fits)\n : [];\n const hasTemplates = offered.length > 0 || savedOffered.length > 0;\n const startNew = () => go(hasTemplates ? { kind: \"new\" } : { kind: \"form\", taskId: null });\n const [templateDialog, setTemplateDialog] = useState<TemplateDialog>(null);\n const [deletingTemplate, setDeletingTemplate] = useState<WorkspaceAutomationTemplate | null>(\n null,\n );\n const saveTemplate = async (values: { name: string; description: string }) => {\n if (!templateDialog) return;\n if (templateDialog.mode === \"save\") {\n const created = await client.createAutomationTemplate(\n workspaceId,\n automationTemplateFromTask(t, templateDialog.task, sources ?? [], {\n ...values,\n now: new Date(),\n }),\n );\n setSavedTemplates((current) => [...(current ?? []), created]);\n setNotice({\n tone: \"info\",\n text: t(\"automations.panel.templateSaved\", { name: created.name }),\n });\n return;\n }\n const renamed = await client.updateAutomationTemplate(\n workspaceId,\n templateDialog.template.id,\n values,\n );\n setSavedTemplates((current) =>\n current?.map((entry) => (entry.id === renamed.id ? renamed : entry)),\n );\n };\n const removeTemplate = async (template: WorkspaceAutomationTemplate): Promise<boolean> => {\n try {\n await client.deleteAutomationTemplate(workspaceId, template.id);\n setSavedTemplates((current) => current?.filter((entry) => entry.id !== template.id));\n return true;\n } catch (error) {\n setNotice({\n tone: \"error\",\n text: t(\"automations.panel.actionFailed\", { reason: errorSentence(error) }).trim(),\n });\n return false;\n }\n };\n\n /* Actions. */\n const act = async (task: ScheduledTask, run: () => Promise<void>) => {\n setBusy((current) => new Set(current).add(task.id));\n setNotice(null);\n try {\n await run();\n } catch (error) {\n setNotice({\n tone: \"error\",\n text: t(\"automations.panel.actionFailed\", { reason: errorSentence(error) }).trim(),\n });\n } finally {\n setBusy((current) => {\n const next = new Set(current);\n next.delete(task.id);\n return next;\n });\n }\n };\n const setOn = (task: ScheduledTask, on: boolean) =>\n act(task, async () =>\n upsert(\n on\n ? await client.resumeScheduledTask(workspaceId, task.id)\n : await client.pauseScheduledTask(workspaceId, task.id),\n ),\n );\n const runNow = (task: ScheduledTask) =>\n act(task, async () => {\n const triggerId = newTriggerId();\n upsert(\n await client.triggerScheduledTask(workspaceId, task.id, triggerId ? { triggerId } : {}),\n );\n setStarted({ taskId: task.id, at: Date.now() });\n setNotice({ tone: \"info\", text: t(\"automations.panel.runStarted\", { name: task.name }) });\n });\n const remove = async (task: ScheduledTask): Promise<boolean> => {\n try {\n await client.deleteScheduledTask(workspaceId, task.id);\n setTasks((current) => current?.filter((entry) => entry.id !== task.id));\n go({ kind: \"list\" });\n return true;\n } catch (error) {\n setNotice({\n tone: \"error\",\n text: t(\"automations.panel.actionFailed\", { reason: errorSentence(error) }).trim(),\n });\n return false;\n }\n };\n const save = async (task: ScheduledTask | null, draft: AutomationDraft) => {\n const ready = { ...draft, events: await standIns.realEvents(draft.events) };\n const saved = task\n ? await client.updateScheduledTask(workspaceId, task.id, {\n expectedExecutionDigest: task.executionDigest,\n ...automationUpdateRequest(t, automationDraftFrom(task), ready, new Date()),\n })\n : await client.createScheduledTask(\n workspaceId,\n automationCreateRequest(\n t,\n ready,\n sessionId ? { kind: \"chat\", sessionId } : { kind: \"new_chat\" },\n new Date(),\n ),\n );\n upsert(saved);\n if (standIns.usesStandIn(draft.events)) setSourcesAttempt((value) => value + 1);\n go({ kind: \"detail\", taskId: saved.id });\n };\n\n const menu = (task: ScheduledTask) => (\n <>\n <DropdownMenuItem onSelect={() => void runNow(task)}>\n {t(\"automations.panel.runNow\")}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => go({ kind: \"form\", taskId: task.id })}>\n {t(\"automations.panel.edit\")}\n </DropdownMenuItem>\n {offerSaved ? (\n <DropdownMenuItem onSelect={() => setTemplateDialog({ mode: \"save\", task })}>\n {t(\"automations.panel.saveAsTemplate\")}\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem variant=\"destructive\" onSelect={() => setDeleting(task)}>\n {t(\"automations.panel.delete\")}\n </DropdownMenuItem>\n </>\n );\n const templateMenu = (template: AutomationTemplate) => {\n const entry = savedTemplates?.find((candidate) => candidate.id === template.id);\n if (entry?.viewerAccess !== \"manage\") return undefined;\n return (\n <>\n <DropdownMenuItem onSelect={() => setTemplateDialog({ mode: \"rename\", template: entry })}>\n {t(\"automations.panel.rename\")}\n </DropdownMenuItem>\n <DropdownMenuItem variant=\"destructive\" onSelect={() => setDeletingTemplate(entry)}>\n {t(\"automations.panel.delete\")}\n </DropdownMenuItem>\n </>\n );\n };\n const viewed =\n view.kind === \"detail\" || view.kind === \"form\"\n ? (tasks?.find((task) => task.id === view.taskId) ?? null)\n : null;\n // A live region that stays mounted in the list and on an automation's page,\n // so what an action says is announced where it was done.\n const noticeLine = (\n <p\n role=\"status\"\n className={cn(\n \"m-0 text-sm leading-5 empty:hidden\",\n notice?.tone === \"error\" ? \"text-danger\" : \"text-fg-muted\",\n )}\n >\n {notice?.text}\n </p>\n );\n\n let body: ReactNode;\n if (view.kind === \"new\") {\n body = (\n <div className=\"flex min-w-0 flex-col gap-4\">\n <BackButton onClick={() => go({ kind: \"list\" })} />\n <h3 className=\"m-0 text-base leading-6 font-semibold text-fg\">\n {t(\"automations.form.newTitle\")}\n </h3>\n {noticeLine}\n <RowList label={t(\"automations.panel.fromScratch\")} variant=\"catalog\">\n <ListRow\n leading={<LogoTile name={t(\"automations.panel.fromScratch\")} icon={<PlusIcon />} />}\n title={t(\"automations.panel.fromScratch\")}\n description={t(\"automations.panel.fromScratchDescription\")}\n onOpen={() => go({ kind: \"form\", taskId: null })}\n />\n </RowList>\n {offered.length > 0 ? (\n <TemplateSection heading={t(\"automations.panel.templates\")}>\n <AutomationTemplateList\n label={t(\"automations.panel.templates\")}\n templates={offered}\n sourceLogo={sourceLogo}\n onUse={(template) => go({ kind: \"form\", taskId: null, template })}\n now={now}\n />\n </TemplateSection>\n ) : null}\n {savedOffered.length > 0 ? (\n <TemplateSection heading={t(\"automations.panel.savedTemplates\")}>\n <AutomationTemplateList\n label={t(\"automations.panel.savedTemplates\")}\n templates={savedOffered}\n sourceLogo={sourceLogo}\n onUse={(template) => go({ kind: \"form\", taskId: null, template })}\n menu={templateMenu}\n menuLabel={(template) => t(\"automations.panel.templateMenu\", { name: template.name })}\n now={now}\n />\n </TemplateSection>\n ) : null}\n </div>\n );\n } else if (view.kind === \"form\") {\n const task = view.taskId ? viewed : null;\n const template = task ? undefined : view.template;\n body = (\n <div className=\"flex min-w-0 flex-col gap-4\">\n <BackButton\n onClick={() =>\n go(\n task\n ? { kind: \"detail\", taskId: task.id }\n : hasTemplates\n ? { kind: \"new\" }\n : { kind: \"list\" },\n )\n }\n />\n <h3 className=\"m-0 text-base leading-6 font-semibold text-fg\">\n {task ? t(\"automations.form.editTitle\") : t(\"automations.form.newTitle\")}\n </h3>\n <AutomationForm\n key={task?.id ?? `new:${template?.id ?? \"\"}`}\n initial={\n task\n ? automationDraftFrom(task)\n : template\n ? automationDraftFromTemplate(template, { sources: formSources })\n : newAutomationDraft(eventTriggers ? { cadence: null } : {})\n }\n editing={Boolean(task)}\n destination={\n task\n ? task.runMode === \"new_session_per_run\"\n ? \"new_chat\"\n : \"chat\"\n : sessionId\n ? \"chat\"\n : \"new_chat\"\n }\n eventTriggers={eventTriggers || hasEventTriggers(task ?? {})}\n sources={formSources}\n loadEventTypes={standIns.loadEventTypes}\n sourceLogo={sourceLogo}\n argumentDefaults={argumentDefaults}\n onSubmit={(draft) => save(task, draft)}\n onCancel={() => go(task ? { kind: \"detail\", taskId: task.id } : { kind: \"list\" })}\n now={now}\n />\n </div>\n );\n } else if (view.kind === \"detail\" && viewed) {\n body = (\n <AutomationDetail\n client={client}\n workspaceId={workspaceId}\n task={viewed}\n sessionId={sessionId}\n sources={sources}\n sourceLogo={sourceLogo}\n onOpenSession={onOpenSession}\n busy={busy.has(viewed.id)}\n startedAt={started?.taskId === viewed.id ? started.at : null}\n now={now}\n onBack={() => go({ kind: \"list\" })}\n onSetOn={(on) => void setOn(viewed, on)}\n onRunNow={() => void runNow(viewed)}\n onEdit={() => go({ kind: \"form\", taskId: viewed.id })}\n onSaveAsTemplate={\n offerSaved ? () => setTemplateDialog({ mode: \"save\", task: viewed }) : undefined\n }\n onDelete={() => setDeleting(viewed)}\n notice={noticeLine}\n />\n );\n } else if (loadError && !tasks) {\n body = (\n <ErrorMessage\n variant=\"block\"\n align=\"center\"\n title={t(\"automations.panel.loadFailed\")}\n action={\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setLoadAttempt((value) => value + 1)}\n >\n {t(\"automations.panel.tryAgain\")}\n </Button>\n }\n >\n {t(\"automations.panel.loadFailedBody\")}\n </ErrorMessage>\n );\n } else if (!tasks) {\n body = (\n <RowList label={t(\"automations.panel.list\")} busy flush>\n <ListRowSkeleton count={3} />\n </RowList>\n );\n } else if (tasks.length === 0) {\n body = (\n <EmptyState\n icon={eventTriggers ? <ZapIcon /> : <CalendarClockIcon />}\n title={sessionId ? t(\"automations.panel.emptyChat\") : t(\"automations.panel.empty\")}\n description={\n sessionId ? t(\"automations.panel.descriptionChat\") : t(\"automations.panel.description\")\n }\n action={\n <Button type=\"button\" size=\"sm\" onClick={startNew}>\n <PlusIcon aria-hidden=\"true\" />\n {t(\"automations.panel.new\")}\n </Button>\n }\n />\n );\n } else {\n body = (\n <RowList label={t(\"automations.panel.list\")} flush>\n {sortAutomations(tasks, now).map((task) => {\n const next = automationNextRun(task, now);\n const when = automationWhenWords(t, task, sources ?? [], now);\n const nextWords = next\n ? t(\"automations.panel.next\", {\n time: formatRunTime(next, { timeZone: viewerTimeZone(), now, text: t }),\n })\n : null;\n return (\n <ListRow\n key={task.id}\n leading={<AutomationTile task={task} />}\n title={task.name}\n // One line that truncates once: when it runs, then the next run.\n // A phone-width list keeps only the next run, which says the most.\n description={\n nextWords ? (\n <>\n <span className=\"@max-[479px]/list:hidden\">\n {when}\n <span aria-hidden=\"true\"> · </span>\n {nextWords}\n </span>\n <span className=\"hidden @max-[479px]/list:inline\">{nextWords}</span>\n </>\n ) : (\n when\n )\n }\n status={showsStatus(task) ? <AutomationStatus task={task} /> : undefined}\n control={\n isFinishedOnce(task) ? undefined : (\n <Switch\n size=\"sm\"\n checked={task.status === \"active\"}\n pending={busy.has(task.id)}\n onCheckedChange={(on) => void setOn(task, on)}\n aria-label={t(\"automations.panel.toggle\", { name: task.name })}\n />\n )\n }\n menu={menu(task)}\n menuLabel={t(\"automations.panel.menu\", { name: task.name })}\n onOpen={() => go({ kind: \"detail\", taskId: task.id })}\n />\n );\n })}\n </RowList>\n );\n }\n\n return (\n <TooltipProvider>\n <section\n ref={rootRef}\n aria-label={title ?? t(\"automations.panel.title\")}\n className={cn(\"og-root og-automations flex min-w-0 flex-col gap-4\", className)}\n >\n <StandaloneOverlayRoot source={root}>\n {view.kind === \"list\" && (title !== null || (tasks?.length ?? 0) > 0) ? (\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-x-4 gap-y-2\">\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n {title !== null ? (\n <h2 className=\"m-0 text-base leading-6 font-semibold text-fg\">{title}</h2>\n ) : null}\n {(tasks?.length ?? 0) > 0 ? (\n <p className=\"m-0 text-sm leading-5 text-fg-muted\">\n {sessionId\n ? t(\"automations.panel.descriptionChat\")\n : t(\"automations.panel.description\")}\n </p>\n ) : null}\n </div>\n {(tasks?.length ?? 0) > 0 ? (\n <Button type=\"button\" size=\"sm\" onClick={startNew} className=\"pointer-coarse:h-11\">\n <PlusIcon aria-hidden=\"true\" />\n {t(\"automations.panel.new\")}\n </Button>\n ) : null}\n </div>\n ) : null}\n {view.kind === \"list\" ? noticeLine : null}\n {body}\n <ConfirmDialog\n open={deleting !== null}\n onOpenChange={(open) => {\n if (!open) setDeleting(null);\n }}\n title={t(\"automations.panel.deleteTitle\", { name: deleting?.name ?? \"\" })}\n description={t(\"automations.panel.deleteBody\")}\n confirmLabel={t(\"automations.panel.deleteConfirm\")}\n pendingLabel={t(\"automations.panel.deleting\")}\n cancelLabel={t(\"automations.form.cancel\")}\n onConfirm={() => (deleting ? remove(deleting) : true)}\n />\n <ConfirmDialog\n open={deletingTemplate !== null}\n onOpenChange={(open) => {\n if (!open) setDeletingTemplate(null);\n }}\n title={t(\"automations.panel.templateDeleteTitle\", {\n name: deletingTemplate?.name ?? \"\",\n })}\n description={t(\"automations.panel.templateDeleteBody\")}\n confirmLabel={t(\"automations.panel.templateDeleteConfirm\")}\n pendingLabel={t(\"automations.panel.deleting\")}\n cancelLabel={t(\"automations.form.cancel\")}\n onConfirm={() => (deletingTemplate ? removeTemplate(deletingTemplate) : true)}\n />\n <AutomationTemplateDialog\n open={templateDialog !== null}\n onOpenChange={(open) => {\n if (!open) setTemplateDialog(null);\n }}\n mode={templateDialog?.mode ?? \"save\"}\n initial={\n templateDialog?.mode === \"rename\"\n ? {\n name: templateDialog.template.name,\n description: templateDialog.template.description,\n }\n : { name: templateDialog?.task.name ?? \"\", description: \"\" }\n }\n onSubmit={saveTemplate}\n />\n </StandaloneOverlayRoot>\n </section>\n </TooltipProvider>\n );\n}\n\nfunction BackButton({ onClick }: { onClick: () => void }) {\n const t = useOpenGeniText();\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClick}\n className=\"-ml-2 self-start text-fg-muted pointer-coarse:h-11\"\n >\n <ChevronLeftIcon aria-hidden=\"true\" />\n {t(\"automations.panel.back\")}\n </Button>\n );\n}\n\n/** A titled group on the New automation page. */\nfunction TemplateSection({ heading, children }: { heading: string; children: ReactNode }) {\n return (\n <section className=\"flex min-w-0 flex-col gap-1.5\">\n <h4 className=\"m-0 text-xs leading-4.5 font-medium text-fg-muted\">{heading}</h4>\n {children}\n </section>\n );\n}\n\nfunction AutomationTile({ task }: { task: ScheduledTask }) {\n return (\n <LogoTile\n name={task.name}\n icon={hasEventTriggers(task) ? <ZapIcon /> : <CalendarClockIcon />}\n />\n );\n}\n\n/** Paused or finished: the states a row calls out. */\nfunction showsStatus(task: ScheduledTask): boolean {\n return isFinishedOnce(task) || task.status === \"paused\";\n}\n\n/** Paused or Finished; nothing while it is on. */\nfunction AutomationStatus({ task }: { task: ScheduledTask }) {\n const t = useOpenGeniText();\n if (isFinishedOnce(task))\n return (\n <StatusBadge variant=\"dot\" status=\"succeeded\">\n {t(\"automations.panel.finished\")}\n </StatusBadge>\n );\n if (task.status === \"paused\")\n return (\n <StatusBadge variant=\"dot\" status=\"paused\">\n {t(\"automations.panel.paused\")}\n </StatusBadge>\n );\n return null;\n}\n\nfunction AutomationDetail({\n client,\n workspaceId,\n task,\n sessionId,\n sources,\n sourceLogo,\n onOpenSession,\n busy,\n startedAt,\n now,\n onBack,\n onSetOn,\n onRunNow,\n onEdit,\n onSaveAsTemplate,\n onDelete,\n notice,\n}: {\n client: OpenGeniClient;\n workspaceId: string;\n task: ScheduledTask;\n sessionId: string | undefined;\n sources: EventSource[] | undefined;\n sourceLogo: EventSourceLogoResolver | undefined;\n onOpenSession: ((sessionId: string) => void) | undefined;\n busy: boolean;\n /** When Run now last started this automation here. */\n startedAt: number | null;\n now: Date;\n onBack: () => void;\n onSetOn: (on: boolean) => void;\n onRunNow: () => void;\n onEdit: () => void;\n /** Offered where the workspace keeps templates. */\n onSaveAsTemplate: (() => void) | undefined;\n onDelete: () => void;\n /** What the last action here said. */\n notice: ReactNode;\n}) {\n const t = useOpenGeniText();\n const where =\n task.runMode === \"new_session_per_run\"\n ? t(\"automations.panel.whereNewChat\")\n : sessionId && task.targetSessionId === sessionId\n ? t(\"automations.panel.whereChat\")\n : t(\"automations.panel.whereOtherChat\");\n return (\n <div className=\"flex min-w-0 flex-col gap-5\">\n <BackButton onClick={onBack} />\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <AutomationTile task={task} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <h3 className=\"m-0 text-base leading-6 font-semibold break-words text-fg\">\n {task.name}\n </h3>\n {showsStatus(task) ? <AutomationStatus task={task} /> : null}\n </div>\n {isFinishedOnce(task) ? null : (\n <Switch\n checked={task.status === \"active\"}\n pending={busy}\n onCheckedChange={onSetOn}\n aria-label={t(\"automations.panel.toggle\", { name: task.name })}\n className=\"shrink-0\"\n />\n )}\n </div>\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onRunNow} disabled={busy}>\n <PlayIcon aria-hidden=\"true\" />\n {t(\"automations.panel.runNow\")}\n </Button>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onEdit}>\n {t(\"automations.panel.edit\")}\n </Button>\n {onSaveAsTemplate ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onSaveAsTemplate}>\n <BookmarkPlusIcon aria-hidden=\"true\" />\n {t(\"automations.panel.saveAsTemplate\")}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onDelete}\n className=\"ml-auto text-danger\"\n >\n {t(\"automations.panel.delete\")}\n </Button>\n </div>\n {notice}\n </div>\n <dl className=\"m-0 flex min-w-0 flex-col gap-4\">\n <DetailItem label={t(\"automations.panel.when\")}>\n <p className=\"m-0\">{automationWhenSentence(t, task, now)}</p>\n {task.events && task.events.triggers.length > 0 ? (\n <EventTriggerSummary\n triggers={task.events.triggers}\n sources={sources}\n sourceLogo={sourceLogo}\n />\n ) : null}\n </DetailItem>\n <DetailItem label={t(\"automations.panel.where\")}>\n <p className=\"m-0\">{where}</p>\n </DetailItem>\n <DetailItem label={t(\"automations.panel.instructions\")}>\n <p className=\"m-0 line-clamp-6 break-words whitespace-pre-wrap\">\n {task.agentConfig.prompt}\n </p>\n </DetailItem>\n </dl>\n <AutomationRuns\n client={client}\n workspaceId={workspaceId}\n task={task}\n startedAt={startedAt}\n onOpenSession={onOpenSession}\n />\n </div>\n );\n}\n\nfunction DetailItem({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <dt className=\"text-xs leading-4.5 font-medium text-fg-muted\">{label}</dt>\n <dd className=\"m-0 flex min-w-0 flex-col gap-2 text-sm leading-5 text-fg\">{children}</dd>\n </div>\n );\n}\n\nconst RUN_STATUS: Record<ScheduledTaskRun[\"status\"], ProductStatus> = {\n queued: \"queued\",\n dispatched: \"running\",\n succeeded: \"succeeded\",\n skipped: \"queued\",\n failed: \"failed\",\n};\n\n/** Runs the list shows at once. */\nconst RUNS_SHOWN = 10;\n/** After Run now, the list looks for the new run this often, for this many reads at most. */\nconst RUN_STARTED_READ_MS = 1_500;\nconst RUN_STARTED_READS = 20;\n/** While a run waits in the queue, the list reads its status this often. */\nconst RUN_QUEUED_READ_MS = 5_000;\n\nfunction AutomationRuns({\n client,\n workspaceId,\n task,\n startedAt,\n onOpenSession,\n}: {\n client: OpenGeniClient;\n workspaceId: string;\n task: ScheduledTask;\n startedAt: number | null;\n onOpenSession: ((sessionId: string) => void) | undefined;\n}) {\n const t = useOpenGeniText();\n const [runs, setRuns] = useState<ScheduledTaskRun[] | undefined>(undefined);\n const [failed, setFailed] = useState(false);\n // Every settled read, so the next one is scheduled from it.\n const [reads, setReads] = useState(0);\n const [again, setAgain] = useState(0);\n const shown = useRef<ScheduledTaskRun[] | undefined>(undefined);\n useEffect(() => {\n shown.current = runs;\n }, [runs]);\n // Run now starts the run in the background, so the list looks for it until\n // a run that wasn't shown when it was pressed appears. Opened after the\n // press, the list can't tell the new run apart and looks for the rest of the\n // window.\n const [looking, setLooking] = useState<{\n known: ReadonlySet<string> | null;\n reads: number;\n } | null>(null);\n useEffect(() => {\n if (startedAt === null) return;\n const left = RUN_STARTED_READS - Math.floor((Date.now() - startedAt) / RUN_STARTED_READ_MS);\n if (left <= 0) return;\n const known = shown.current;\n setLooking({ known: known ? new Set(known.map((run) => run.id)) : null, reads: left });\n }, [startedAt]);\n // Read again whenever the automation changes, after Run now, and on schedule.\n const revision = task.updatedAt;\n useEffect(() => {\n let live = true;\n setFailed(false);\n client.listScheduledTaskRuns(workspaceId, task.id, { limit: RUNS_SHOWN }).then(\n (list) => {\n if (!live) return;\n setRuns(list);\n setLooking((current) =>\n !current ||\n current.reads <= 1 ||\n (current.known && list.some((run) => !current.known?.has(run.id)))\n ? null\n : { ...current, reads: current.reads - 1 },\n );\n setReads((count) => count + 1);\n },\n () => {\n if (!live) return;\n setFailed(true);\n setReads((count) => count + 1);\n },\n );\n return () => {\n live = false;\n };\n }, [client, workspaceId, task.id, revision, startedAt, again]);\n const queued = runs?.some((run) => run.status === \"queued\") ?? false;\n useEffect(() => {\n if (reads === 0 || (!looking && !queued)) return;\n const timer = setTimeout(\n () => setAgain((count) => count + 1),\n looking ? RUN_STARTED_READ_MS : RUN_QUEUED_READ_MS,\n );\n return () => clearTimeout(timer);\n }, [reads, looking, queued]);\n const headingId = `${task.id}-runs`;\n return (\n <section aria-labelledby={headingId} className=\"flex min-w-0 flex-col gap-2\">\n <h4 id={headingId} className=\"m-0 text-xs leading-4.5 font-medium text-fg-muted\">\n {t(\"automations.panel.runs\")}\n </h4>\n {failed && !runs ? (\n <p className=\"m-0 text-sm leading-5 text-fg-muted\">{t(\"automations.panel.runsFailed\")}</p>\n ) : !runs ? (\n <div className=\"flex flex-col gap-2\" aria-busy=\"true\">\n <Skeleton className=\"h-5 w-3/4\" />\n <Skeleton className=\"h-5 w-2/3\" />\n </div>\n ) : runs.length === 0 ? (\n <p className=\"m-0 text-sm leading-5 text-fg-muted\">{t(\"automations.panel.runsEmpty\")}</p>\n ) : (\n <ul className=\"m-0 flex min-w-0 list-none flex-col p-0\">\n {runs.map((run) => {\n const cause =\n run.triggerType === \"event\"\n ? (automationRunEventsLabel(t, run) ??\n automationRunTriggerLabel(t, run.triggerType))\n : automationRunTriggerLabel(t, run.triggerType);\n const reason =\n (run.status === \"failed\" || run.status === \"skipped\") && run.error\n ? automationRunErrorText(t, run.error)\n : null;\n return (\n <li\n key={run.id}\n className=\"flex min-w-0 items-center gap-3 border-t border-border py-2.5 first:border-t-0 first:pt-1\"\n >\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"truncate text-sm leading-5 text-fg\" title={cause}>\n {cause}\n </span>\n <span className=\"flex min-w-0 flex-wrap items-center gap-x-1.5 text-xs leading-4.5 text-fg-muted\">\n <StatusBadge\n variant=\"dot\"\n status={RUN_STATUS[run.status]}\n className={cn(\"shrink-0\", run.status === \"failed\" && \"text-danger\")}\n >\n {automationRunStatusLabel(t, run.status)}\n </StatusBadge>\n <span aria-hidden=\"true\">·</span>\n <RelativeTime date={run.firedAt} />\n </span>\n {reason ? (\n <span\n className=\"line-clamp-2 text-xs leading-4.5 break-words text-fg-muted\"\n title={reason}\n >\n {reason}\n </span>\n ) : null}\n </span>\n {run.sessionId && onOpenSession ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onOpenSession(run.sessionId!)}\n className=\"shrink-0\"\n >\n {t(\"automations.panel.openChat\")}\n </Button>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </section>\n );\n}\n","/**\n * Create or edit an automation: what the agent does, when it runs, and an\n * optional name. Where its runs go is the host's choice (`destination`), and\n * the runs inherit their access from there; nothing here narrows it.\n * Presentational: the host saves through `onSubmit`.\n */\nimport { useMemo, useState, type FormEvent } from \"react\";\nimport { CircleAlertIcon } from \"lucide-react\";\n\nimport type { EventSource, EventTypeDescriptor } from \"@opengeni/sdk\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { apiErrorFacts } from \"../../ui/api-error\";\nimport { Button } from \"../../ui/button\";\nimport { Field, TextArea, TextInput } from \"../../ui/field\";\nimport { cn } from \"../../lib/cn\";\nimport {\n deriveAutomationName,\n hasAutomationDraftIssues,\n validateAutomationDraft,\n type AutomationDraft,\n type AutomationDraftIssues,\n} from \"./automation-model\";\nimport { AutomationWhenField } from \"./automation-when-field\";\nimport { withTemplateSources } from \"./automation-template-model\";\nimport type { EventSourceChoice } from \"./event-source-model\";\nimport type { EventSourceLogoResolver } from \"./event-source-tile\";\n\nexport interface AutomationFormProps {\n /** Where it starts: a saved automation's draft, or `newAutomationDraft()`. */\n initial: AutomationDraft;\n /** It edits a saved automation: the button says Save changes. */\n editing?: boolean | undefined;\n /** Where its runs go: on in one chat, or a new chat each run. */\n destination: \"chat\" | \"new_chat\";\n /** Event triggers run here. False offers the schedule only. */\n eventTriggers: boolean;\n /** Sources the person can point triggers at; undefined while loading. */\n sources: EventSource[] | undefined;\n loadEventTypes: (sourceId: string) => Promise<EventTypeDescriptor[]>;\n sourceLogo?: EventSourceLogoResolver | undefined;\n /** Opens the host's \"Add a source\" page; offered when no source fits. */\n onAddSource?: ((choice?: EventSourceChoice) => void) | undefined;\n /** Arguments a new MCP subscription starts with, such as `{ projectId }`. */\n argumentDefaults?: Readonly<Record<string, unknown>> | undefined;\n /** Saves the draft. Throw to keep the form open; the error's message is shown. */\n onSubmit: (draft: AutomationDraft) => Promise<void>;\n onCancel: () => void;\n /** The clock for schedule previews. */\n now?: Date | undefined;\n className?: string | undefined;\n}\n\nexport function AutomationForm({\n initial,\n editing = false,\n destination,\n eventTriggers,\n sources,\n loadEventTypes,\n sourceLogo,\n onAddSource,\n argumentDefaults,\n onSubmit,\n onCancel,\n now,\n className,\n}: AutomationFormProps) {\n const t = useOpenGeniText();\n const [draft, setDraft] = useState(initial);\n // A template's triggers take the person's own sources once those load.\n const [filledFrom, setFilledFrom] = useState(sources);\n if (sources !== filledFrom) {\n setFilledFrom(sources);\n const events = withTemplateSources(draft.events, sources);\n if (events !== draft.events) setDraft({ ...draft, events });\n }\n const [issues, setIssues] = useState<AutomationDraftIssues>({});\n const [saving, setSaving] = useState(false);\n const [failure, setFailure] = useState<string | null>(null);\n const derivedName = useMemo(() => deriveAutomationName(draft.instructions), [draft.instructions]);\n const update = (patch: Partial<AutomationDraft>) => {\n setDraft((current) => ({ ...current, ...patch }));\n setIssues((current) => ({\n ...current,\n ...(\"instructions\" in patch ? { instructions: undefined } : {}),\n ...(\"name\" in patch ? { name: undefined } : {}),\n ...(\"cadence\" in patch ? { cadence: undefined, when: undefined } : {}),\n ...(\"events\" in patch ? { events: undefined, when: undefined } : {}),\n }));\n };\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n if (saving) return;\n const found = validateAutomationDraft(t, draft, sources ?? [], now ?? new Date());\n setIssues(found);\n if (hasAutomationDraftIssues(found)) return;\n setSaving(true);\n setFailure(null);\n try {\n await onSubmit(draft);\n } catch (error) {\n setFailure(errorSentence(error));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <form\n noValidate\n onSubmit={(event) => void submit(event)}\n aria-busy={saving || undefined}\n className={cn(\"flex min-w-0 flex-col gap-5\", className)}\n >\n <Field\n label={t(\"automations.form.instructions\")}\n error={issues.instructions}\n hint={\n destination === \"chat\"\n ? t(\"automations.form.instructionsHintChat\")\n : t(\"automations.form.instructionsHintNewChat\")\n }\n >\n <TextArea\n rows={4}\n value={draft.instructions}\n onChange={(event) => update({ instructions: event.target.value })}\n placeholder={t(\"automations.form.instructionsPlaceholder\")}\n disabled={saving}\n autoFocus={!editing}\n />\n </Field>\n <AutomationWhenField\n cadence={draft.cadence}\n onCadenceChange={(cadence) => update({ cadence })}\n events={draft.events}\n onEventsChange={(events) => update({ events })}\n eventTriggers={eventTriggers}\n sources={sources}\n loadEventTypes={loadEventTypes}\n eventIssues={issues.events}\n error={issues.when ?? issues.cadence}\n sourceLogo={sourceLogo}\n onAddSource={onAddSource}\n argumentDefaults={argumentDefaults}\n now={now}\n disabled={saving}\n />\n <Field label={t(\"automations.form.name\")} optional error={issues.name}>\n <TextInput\n value={draft.name}\n onChange={(event) => update({ name: event.target.value })}\n placeholder={derivedName || t(\"automations.form.namePlaceholder\")}\n disabled={saving}\n suppressAutofill\n />\n </Field>\n {failure ? (\n <p\n role=\"alert\"\n className=\"m-0 flex min-w-0 items-start gap-1.5 text-sm leading-5 text-danger\"\n >\n <CircleAlertIcon aria-hidden=\"true\" className=\"mt-0.5 size-4 shrink-0\" />\n <span className=\"min-w-0 break-words\">\n <span className=\"font-medium\">{t(\"automations.form.saveFailed\")}</span> {failure}\n </span>\n </p>\n ) : null}\n <div className=\"flex min-w-0 flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onCancel}\n disabled={saving}\n className=\"pointer-coarse:h-11\"\n >\n {t(\"automations.form.cancel\")}\n </Button>\n <Button type=\"submit\" disabled={saving} className=\"pointer-coarse:h-11\">\n {saving\n ? editing\n ? t(\"automations.form.saving\")\n : t(\"automations.form.creating\")\n : editing\n ? t(\"automations.form.save\")\n : t(\"automations.form.create\")}\n </Button>\n </div>\n </form>\n );\n}\n\n/** What went wrong, as the server said it, ending in a full stop. */\nexport function errorSentence(error: unknown): string {\n const message = apiErrorFacts(error).serverMessage ?? \"\";\n if (!message) return \"\";\n const sentence = message.charAt(0).toLocaleUpperCase() + message.slice(1);\n return /[.!?]$/u.test(sentence) ? sentence : `${sentence}.`;\n}\n","/**\n * An automation's \"When\": its schedule and its event triggers, each optional.\n * With neither it runs only when someone presses Run now. Controlled and\n * data-agnostic like `EventTriggersField`: the host passes the sources it can\n * read and a loader for each source's event types.\n */\nimport { useId, useMemo, type ReactNode } from \"react\";\nimport { CircleAlertIcon, PlusIcon, Trash2Icon } from \"lucide-react\";\n\nimport type { EventSource, EventTypeDescriptor } from \"@opengeni/sdk\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { Button } from \"../../ui/button\";\nimport {\n CadencePicker,\n timeZoneLabels,\n type CadenceFrequency,\n type CadenceTimeZoneOption,\n type CadenceValue,\n} from \"../../ui/cadence-picker\";\nimport { cn } from \"../../lib/cn\";\nimport { defaultAutomationCadence, viewerTimeZone as localTimeZone } from \"./automation-model\";\nimport { EventTriggersField } from \"./event-trigger-editor\";\nimport type { EventSourceChoice } from \"./event-source-model\";\nimport type { EventSourceLogoResolver } from \"./event-source-tile\";\nimport type { EventTriggersDraft, EventTriggersIssues } from \"./event-trigger-model\";\n\n/**\n * The frequencies an automation's schedule can store. No \"Every month on day\n * N\": the API's calendar spec has no day of month yet.\n */\nexport const AUTOMATION_FREQUENCIES: readonly CadenceFrequency[] = [\n \"hourly\",\n \"daily\",\n \"weekdays\",\n \"weekly\",\n \"interval\",\n \"once\",\n];\n\nexport interface AutomationWhenFieldProps {\n /** Null: no schedule. */\n cadence: CadenceValue | null;\n onCadenceChange: (cadence: CadenceValue | null) => void;\n events: EventTriggersDraft;\n onEventsChange: (events: EventTriggersDraft) => void;\n /** Event triggers run here. False offers the schedule only. */\n eventTriggers: boolean;\n /** Sources the person can point triggers at; undefined while loading. */\n sources: EventSource[] | undefined;\n /** Reads one source's event types. */\n loadEventTypes: (sourceId: string) => Promise<EventTypeDescriptor[]>;\n eventIssues?: EventTriggersIssues | undefined;\n /** Why the schedule and the events don't fit together. */\n error?: string | undefined;\n sourceLogo?: EventSourceLogoResolver | undefined;\n /**\n * Opens the host's \"Add a source\" page; offered when no source fits. Gets\n * the kind a template's trigger asks for, when it asks for one.\n */\n onAddSource?: ((choice?: EventSourceChoice) => void) | undefined;\n /** Arguments a new MCP subscription starts with; see `EventTriggersField`. */\n argumentDefaults?: Readonly<Record<string, unknown>> | undefined;\n /** Default `AUTOMATION_FREQUENCIES`. */\n frequencies?: readonly CadenceFrequency[] | undefined;\n /** Suggested zones. Default: the viewer's, the schedule's and UTC. */\n timeZones?: readonly CadenceTimeZoneOption[] | undefined;\n /** Default: the browser's zone. */\n viewerTimeZone?: string | undefined;\n /** The clock for previews. */\n now?: Date | undefined;\n /** Notes under the triggers, such as what a run can open. */\n children?: ReactNode;\n disabled?: boolean | undefined;\n className?: string | undefined;\n}\n\nexport function AutomationWhenField({\n cadence,\n onCadenceChange,\n events,\n onEventsChange,\n eventTriggers,\n sources,\n loadEventTypes,\n eventIssues,\n error,\n sourceLogo,\n onAddSource,\n argumentDefaults,\n frequencies = AUTOMATION_FREQUENCIES,\n timeZones,\n viewerTimeZone,\n now,\n children,\n disabled = false,\n className,\n}: AutomationWhenFieldProps) {\n const t = useOpenGeniText();\n const labelId = useId();\n const viewerZone = viewerTimeZone ?? localTimeZone();\n const scheduleZone = cadence?.timeZone ?? viewerZone;\n const zones = useMemo(\n () =>\n timeZones ??\n [...new Set([viewerZone, scheduleZone, \"UTC\"])].map((id) => ({\n id,\n ...timeZoneLabels(id, t),\n })),\n [scheduleZone, t, timeZones, viewerZone],\n );\n const addSchedule = (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onCadenceChange(defaultAutomationCadence(viewerZone))}\n disabled={disabled}\n className=\"pointer-coarse:h-11\"\n >\n <PlusIcon aria-hidden=\"true\" />\n {t(\"automations.whenField.addSchedule\")}\n </Button>\n );\n const picker = cadence ? (\n <CadencePicker\n aria-labelledby={labelId}\n value={cadence}\n onChange={onCadenceChange}\n frequencies={frequencies}\n now={now}\n viewerTimeZone={viewerZone}\n timeZones={zones}\n disabled={disabled}\n className=\"min-w-0 flex-1\"\n />\n ) : null;\n const nothing = !cadence && events.triggers.length === 0;\n return (\n <div\n role=\"group\"\n aria-labelledby={labelId}\n className={cn(\"flex min-w-0 flex-col gap-3\", className)}\n >\n <p id={labelId} className=\"m-0 text-sm leading-5 font-medium text-fg\">\n {t(\"automations.panel.when\")}\n </p>\n {picker && eventTriggers ? (\n // Beside event triggers the schedule is one block among others, and removable.\n <div\n role=\"group\"\n aria-label={t(\"automations.whenField.schedule\")}\n className=\"flex min-w-0 items-start gap-3 rounded-lg border border-border bg-surface p-4\"\n >\n {picker}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => onCadenceChange(null)}\n disabled={disabled}\n aria-label={t(\"automations.whenField.removeSchedule\")}\n title={t(\"automations.whenField.removeSchedule\")}\n className=\"shrink-0 text-fg-muted pointer-coarse:size-11\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n </Button>\n </div>\n ) : (\n picker\n )}\n {nothing ? (\n <p className=\"m-0 text-sm leading-5 text-fg-muted\">\n {eventTriggers\n ? t(\"automations.whenField.manualUntilAdded\")\n : t(\"automations.whenField.manual\")}\n </p>\n ) : null}\n {eventTriggers ? (\n <EventTriggersField\n value={events}\n onChange={onEventsChange}\n sources={sources}\n loadEventTypes={loadEventTypes}\n issues={eventIssues}\n sourceLogo={sourceLogo}\n onAddSource={onAddSource}\n argumentDefaults={argumentDefaults}\n actions={cadence ? null : addSchedule}\n disabled={disabled}\n />\n ) : cadence ? null : (\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2\">{addSchedule}</div>\n )}\n {children}\n {cadence && events.triggers.length > 0 && !error ? (\n <p className=\"m-0 text-xs leading-4.5 text-fg-muted\">{t(\"automations.whenField.both\")}</p>\n ) : null}\n {error ? (\n <p\n role=\"alert\"\n className=\"m-0 flex min-w-0 items-start gap-1.5 text-xs leading-4.5 text-danger\"\n >\n <CircleAlertIcon aria-hidden=\"true\" className=\"mt-0.5 size-3.5 shrink-0\" />\n <span className=\"min-w-0 break-words\">{error}</span>\n </p>\n ) : null}\n </div>\n );\n}\n","/**\n * The event half of an automation's \"When\": one block per trigger (where the\n * events come from, which events, and optional conditions), plus \"Run once\".\n * Controlled and data-agnostic: the host passes the sources it can read and a\n * loader for each source's event types.\n */\nimport { useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { PlusIcon, Trash2Icon, XIcon } from \"lucide-react\";\n\nimport type { EventSource, EventTypeDescriptor } from \"@opengeni/sdk\";\n\nimport { useOpenGeniText, type OpenGeniText } from \"../../messages/runtime\";\nimport { Button } from \"../../ui/button\";\nimport { CheckboxField, Field, TextInput } from \"../../ui/field\";\nimport { ComboboxSelect, SelectMenu, type SelectOption } from \"../../ui/select-menu\";\nimport { cn } from \"../../lib/cn\";\nimport { EventArgumentsField } from \"./event-arguments-field\";\nimport { eventArgumentsForEvent } from \"./event-arguments-model\";\nimport {\n eventSourceAddLabel,\n eventSourceChoiceName,\n eventSourceKindLabel,\n eventStatusReasonText,\n type EventSourceChoice,\n} from \"./event-source-model\";\nimport { EventSourceTile, type EventSourceLogoResolver } from \"./event-source-tile\";\nimport {\n automationTemplateSourceChoice,\n eventSourceFitsTemplate,\n} from \"./automation-template-model\";\nimport {\n EVENT_CONDITION_OPERATORS,\n EVENT_TRIGGER_CONDITIONS_MAX,\n EVENT_TRIGGERS_PER_AUTOMATION_MAX,\n eventConditionFieldSuggestions,\n eventConditionOperator,\n eventConditionOperatorLabel,\n eventTypeIssue,\n eventTypeLabel,\n eventTypesLabel,\n newEventConditionDraft,\n newEventTriggerDraft,\n type EventConditionDraft,\n type EventTriggerDraft,\n type EventTriggerIssues,\n type EventTriggersDraft,\n type EventTriggersIssues,\n} from \"./event-trigger-model\";\n\n/** A source's event types, or why they couldn't be read. */\nexport type EventTypesState =\n | { status: \"loading\" }\n | { status: \"ready\"; eventTypes: EventTypeDescriptor[] }\n | { status: \"error\"; message: string };\n\n/**\n * Reads each picked source's event types once and keeps them, so switching a\n * trigger's source back and forth never refetches.\n */\nexport function useEventTypes(\n sourceIds: readonly string[],\n load: (sourceId: string) => Promise<EventTypeDescriptor[]>,\n): Record<string, EventTypesState> {\n const t = useOpenGeniText();\n const [states, setStates] = useState<Record<string, EventTypesState>>({});\n const requested = useRef(new Set<string>());\n const loadRef = useRef(load);\n loadRef.current = load;\n const textRef = useRef(t);\n textRef.current = t;\n const key = [...new Set(sourceIds)].filter(Boolean).sort().join(\",\");\n useEffect(() => {\n for (const sourceId of key ? key.split(\",\") : []) {\n if (requested.current.has(sourceId)) continue;\n requested.current.add(sourceId);\n setStates((current) => ({ ...current, [sourceId]: { status: \"loading\" } }));\n loadRef.current(sourceId).then(\n (eventTypes) =>\n setStates((current) => ({ ...current, [sourceId]: { status: \"ready\", eventTypes } })),\n (error: unknown) => {\n requested.current.delete(sourceId);\n setStates((current) => ({\n ...current,\n [sourceId]: {\n status: \"error\",\n message:\n error instanceof Error\n ? error.message\n : textRef.current(\"automations.editor.loadEventsFailed\"),\n },\n }));\n },\n );\n }\n }, [key]);\n return states;\n}\n\n/* ----------------------------------------------------------------------------\n The field: every trigger, Add, and Run once.\n -------------------------------------------------------------------------- */\n\nexport interface EventTriggersFieldProps {\n value: EventTriggersDraft;\n onChange: (next: EventTriggersDraft) => void;\n /** Sources the person can point triggers at; undefined while loading. */\n sources: EventSource[] | undefined;\n /** Reads one source's event types. */\n loadEventTypes: (sourceId: string) => Promise<EventTypeDescriptor[]>;\n issues?: EventTriggersIssues | undefined;\n /** The source's brand logo, from the host's connector catalog. */\n sourceLogo?: EventSourceLogoResolver | undefined;\n /**\n * Opens the host's \"Add a source\" page; offered when no source fits. Gets\n * the kind a template's trigger asks for, when it asks for one.\n */\n onAddSource?: ((choice?: EventSourceChoice) => void) | undefined;\n /** Offer \"Run once, then finish\" (default true). */\n allowOnce?: boolean | undefined;\n /**\n * Arguments a new MCP subscription starts with, by name, such as the\n * project the host's chat belongs to. Only arguments the event takes apply.\n */\n argumentDefaults?: Readonly<Record<string, unknown>> | undefined;\n /** More buttons beside Add an event, such as the host's Add a schedule. */\n actions?: ReactNode | undefined;\n disabled?: boolean | undefined;\n}\n\nexport function EventTriggersField({\n value,\n onChange,\n sources,\n loadEventTypes,\n issues,\n sourceLogo,\n onAddSource,\n allowOnce = true,\n argumentDefaults,\n actions,\n disabled = false,\n}: EventTriggersFieldProps) {\n const t = useOpenGeniText();\n const eventTypes = useEventTypes(\n value.triggers.map((trigger) => trigger.sourceId),\n loadEventTypes,\n );\n const lastAdded = useRef<string | null>(null);\n const update = (key: string, next: EventTriggerDraft) =>\n onChange({\n ...value,\n triggers: value.triggers.map((trigger) => (trigger.key === key ? next : trigger)),\n });\n const remove = (key: string) => {\n const triggers = value.triggers.filter((trigger) => trigger.key !== key);\n onChange({ ...value, triggers, ...(triggers.length === 0 ? { once: false } : {}) });\n };\n const add = () => {\n const only = sources?.length === 1 ? sources[0]!.id : \"\";\n const trigger = newEventTriggerDraft(only);\n lastAdded.current = trigger.key;\n onChange({ ...value, triggers: [...value.triggers, trigger] });\n };\n const full = value.triggers.length >= EVENT_TRIGGERS_PER_AUTOMATION_MAX;\n return (\n <div className=\"flex min-w-0 flex-col gap-3\">\n {value.triggers.map((trigger, index) => (\n <EventTriggerEditor\n key={trigger.key}\n index={index}\n value={trigger}\n onChange={(next) => update(trigger.key, next)}\n onRemove={() => remove(trigger.key)}\n sources={sources}\n eventTypes={trigger.sourceId ? eventTypes[trigger.sourceId] : undefined}\n issues={issues?.triggers[trigger.key]}\n sourceLogo={sourceLogo}\n onAddSource={onAddSource}\n argumentDefaults={argumentDefaults}\n autoFocus={lastAdded.current === trigger.key}\n disabled={disabled}\n />\n ))}\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={add}\n disabled={disabled || full}\n className=\"pointer-coarse:h-11\"\n >\n <PlusIcon aria-hidden=\"true\" />\n {value.triggers.length === 0\n ? t(\"automations.editor.addEvent\")\n : t(\"automations.editor.addAnotherEvent\")}\n </Button>\n {actions}\n {full ? (\n <span className=\"text-xs text-fg-muted\">\n {t(\"automations.editor.triggersMax\", { max: EVENT_TRIGGERS_PER_AUTOMATION_MAX })}\n </span>\n ) : null}\n </div>\n {allowOnce && value.triggers.length > 0 ? (\n <CheckboxField\n label={t(\"automations.editor.once\")}\n description={t(\"automations.editor.onceDescription\")}\n checked={value.once}\n onCheckedChange={(once) => onChange({ ...value, once })}\n disabled={disabled}\n />\n ) : null}\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n One trigger.\n -------------------------------------------------------------------------- */\n\nexport interface EventTriggerEditorProps {\n value: EventTriggerDraft;\n onChange: (next: EventTriggerDraft) => void;\n onRemove: () => void;\n /** Position in the list, for accessible names. */\n index: number;\n sources: EventSource[] | undefined;\n /** The chosen source's event types; undefined before a source is chosen. */\n eventTypes: EventTypesState | undefined;\n issues?: EventTriggerIssues | undefined;\n sourceLogo?: EventSourceLogoResolver | undefined;\n onAddSource?: ((choice?: EventSourceChoice) => void) | undefined;\n /** Arguments a new MCP subscription starts with; see `EventTriggersField`. */\n argumentDefaults?: Readonly<Record<string, unknown>> | undefined;\n /** Move focus to the source picker when the block appears. */\n autoFocus?: boolean | undefined;\n disabled?: boolean | undefined;\n}\n\nexport function EventTriggerEditor({\n value,\n onChange,\n onRemove,\n index,\n sources,\n eventTypes,\n issues,\n sourceLogo,\n onAddSource,\n argumentDefaults,\n autoFocus = false,\n disabled = false,\n}: EventTriggerEditorProps) {\n const t = useOpenGeniText();\n const blockRef = useRef<HTMLDivElement>(null);\n const source = sources?.find((candidate) => candidate.id === value.sourceId);\n /** What a template asked for, while no source of that kind is chosen. */\n const wanted = !value.sourceId ? value.templateSource : undefined;\n const wantedChoice = wanted ? automationTemplateSourceChoice(wanted) : undefined;\n const descriptors = eventTypes?.status === \"ready\" ? eventTypes.eventTypes : [];\n const schemaOf = (types: readonly string[]) =>\n types\n .map((type) => descriptors.find((descriptor) => descriptor.type === type)?.argumentsSchema)\n .find((schema) => schema && Object.keys(schema).length > 0);\n const argumentsSchema = schemaOf(value.eventTypes);\n useEffect(() => {\n if (!autoFocus) return;\n blockRef.current?.querySelector<HTMLElement>(\"button, input\")?.focus();\n }, [autoFocus]);\n\n const sourceOptions: SelectOption[] = (sources ?? []).map((candidate) => ({\n value: candidate.id,\n label: candidate.name,\n meta: eventSourceKindLabel(t, candidate),\n leading: <EventSourceTile source={candidate} logo={sourceLogo} size=\"sm\" />,\n ...(candidate.status === \"active\"\n ? {}\n : {\n description:\n eventStatusReasonText(\n t,\n {\n text: candidate.statusReason,\n code: candidate.statusReasonCode,\n detail: candidate.statusReasonDetail,\n },\n candidate.name,\n ) ?? t(\"automations.editor.sourceOff\"),\n }),\n }));\n const label = t(\"automations.editor.eventN\", { index: index + 1 });\n\n return (\n <div\n ref={blockRef}\n role=\"group\"\n aria-label={label}\n className=\"flex min-w-0 flex-col gap-4 rounded-lg border border-border bg-surface p-4\"\n >\n <div className=\"flex min-w-0 items-start gap-3\">\n <Field\n label={t(\"automations.editor.from\")}\n error={issues?.source}\n className=\"min-w-0 flex-1\"\n >\n <SelectMenu\n variant={sourceOptions.length > 8 ? \"combobox\" : \"menu\"}\n options={sourceOptions}\n value={value.sourceId || null}\n onValueChange={(sourceId) => {\n const picked = sources?.find((candidate) => candidate.id === sourceId);\n // A source of the kind the template asked for keeps its events.\n onChange(\n wanted && picked && eventSourceFitsTemplate(wanted, picked)\n ? { ...value, sourceId }\n : { ...value, sourceId, eventTypes: [], conditions: [], argumentsText: \"\" },\n );\n }}\n placeholder={\n sources === undefined\n ? t(\"automations.editor.loadingSources\")\n : t(\"automations.editor.chooseSource\")\n }\n loading={sources === undefined}\n searchPlaceholder={t(\"automations.editor.searchSources\")}\n emptyMessage={\n onAddSource ? (\n <span>\n {t(\"automations.editor.noSources\")}{\" \"}\n <button\n type=\"button\"\n className=\"og-link\"\n onClick={() => onAddSource(wantedChoice)}\n >\n {t(\"automations.editor.addSource\")}\n </button>\n </span>\n ) : (\n t(\"automations.editor.noSourcesAskAdmin\")\n )\n }\n invalid={Boolean(issues?.source)}\n disabled={disabled}\n className=\"max-w-full\"\n />\n </Field>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={onRemove}\n disabled={disabled}\n aria-label={t(\"automations.editor.removeEventN\", { index: index + 1 })}\n title={t(\"automations.editor.remove\")}\n className=\"mt-7 shrink-0 text-fg-muted pointer-coarse:size-11\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n </Button>\n </div>\n {wanted && wantedChoice && sources !== undefined ? (\n <p className=\"m-0 text-sm leading-5 text-fg-muted\">\n {t(\"automations.editor.templateWants\", {\n events: eventTypesLabel(t, value.eventTypes),\n source:\n wanted.kind === \"mcp\" && wanted.mcpServerId\n ? wanted.mcpServerId\n : eventSourceChoiceName(t, wantedChoice),\n })}\n {onAddSource ? (\n <>\n {\" \"}\n <button\n type=\"button\"\n className=\"og-link\"\n onClick={() => onAddSource(wantedChoice)}\n disabled={disabled}\n >\n {eventSourceAddLabel(t, wantedChoice)}\n </button>\n </>\n ) : null}\n </p>\n ) : null}\n {value.sourceId ? (\n <>\n <Field\n label={\n source?.kind === \"mcp\"\n ? t(\"automations.editor.event\")\n : t(\"automations.editor.events\")\n }\n error={issues?.eventTypes}\n hint={\n source?.kind === \"mcp\"\n ? t(\"automations.editor.mcpOneEventHint\")\n : t(\"automations.editor.anyStartsRun\")\n }\n >\n <EventTypePicker\n value={value.eventTypes}\n onChange={(picked) =>\n onChange({\n ...value,\n eventTypes: picked,\n // A newly picked MCP event keeps what applies and fills in the host's defaults.\n ...(source?.kind === \"mcp\" && picked.length > 0\n ? {\n argumentsText: eventArgumentsForEvent(\n schemaOf(picked),\n value.argumentsText,\n argumentDefaults,\n ),\n }\n : {}),\n })\n }\n state={eventTypes}\n sourceName={source?.name}\n single={source?.kind === \"mcp\"}\n grouped={source?.kind === \"workspace\"}\n invalid={Boolean(issues?.eventTypes)}\n disabled={disabled}\n />\n </Field>\n {source?.kind === \"mcp\" ? (\n <EventArgumentsField\n schema={argumentsSchema}\n value={value.argumentsText}\n onChange={(argumentsText) => onChange({ ...value, argumentsText })}\n error={issues?.arguments}\n disabled={disabled}\n />\n ) : null}\n <EventConditionsEditor\n value={value.conditions}\n onChange={(conditions) => onChange({ ...value, conditions })}\n suggestions={eventConditionFieldSuggestions(t, value.eventTypes, descriptors)}\n issues={issues?.conditions}\n disabled={disabled}\n />\n {source?.kind === \"github\" || source?.kind === \"slack\" || source?.kind === \"workspace\" ? (\n <CheckboxField\n label={t(\"automations.editor.includeOwn\")}\n description={\n source.kind === \"workspace\"\n ? t(\"automations.editor.includeOwnWorkspaceDescription\")\n : t(\"automations.editor.includeOwnDescription\")\n }\n checked={value.includeOwnEvents}\n onCheckedChange={(includeOwnEvents) => onChange({ ...value, includeOwnEvents })}\n disabled={disabled}\n />\n ) : null}\n </>\n ) : null}\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n Event types.\n -------------------------------------------------------------------------- */\n\nconst CUSTOM_PREFIX = \"custom:\";\n/** One empty list while types load, so the picker's options keep their identity. */\nconst NO_EVENT_TYPES: EventTypeDescriptor[] = [];\n\n/** \"This workspace\" types under Chats, Usage and Meetings, in the catalog's order. */\nfunction workspaceEventGroup(t: OpenGeniText, type: string): string | undefined {\n if (type.startsWith(\"recording.\")) return t(\"automations.picker.groupMeetings\");\n if (type.startsWith(\"usage.\")) return t(\"automations.picker.groupUsage\");\n if (type.startsWith(\"turn.\") || type.startsWith(\"session.\")) {\n return t(\"automations.picker.groupChats\");\n }\n return undefined;\n}\n\nexport function EventTypePicker({\n value,\n onChange,\n state,\n sourceName,\n single = false,\n grouped = false,\n invalid = false,\n disabled = false,\n}: {\n value: string[];\n onChange: (eventTypes: string[]) => void;\n state: EventTypesState | undefined;\n /** The source's name, which the reasons a type can't be picked mention. */\n sourceName?: string | undefined;\n /** Only one type (MCP triggers); picking replaces it. */\n single?: boolean | undefined;\n /** Headings for \"This workspace\" types: Chats, Usage and Meetings. */\n grouped?: boolean | undefined;\n invalid?: boolean | undefined;\n disabled?: boolean | undefined;\n}) {\n const t = useOpenGeniText();\n const [query, setQuery] = useState(\"\");\n const descriptors = state?.status === \"ready\" ? state.eventTypes : NO_EVENT_TYPES;\n const options = useMemo(() => {\n const picked = new Set(value);\n const known: SelectOption[] = descriptors\n .filter((descriptor) => !picked.has(descriptor.type))\n .map((descriptor) => {\n const unavailable = descriptor.available\n ? null\n : eventStatusReasonText(\n t,\n {\n text: descriptor.unavailableReason,\n code: descriptor.unavailableReasonCode,\n detail: descriptor.unavailableReasonDetail,\n },\n sourceName,\n );\n return {\n value: descriptor.type,\n label: descriptor.type,\n description: unavailable ?? descriptor.description,\n disabled: !descriptor.available,\n ...(grouped ? { group: workspaceEventGroup(t, descriptor.type) } : {}),\n ...(descriptor.available\n ? {}\n : { disabledReason: unavailable ?? t(\"automations.picker.cantReceive\") }),\n keywords: [descriptor.description],\n };\n });\n const all: SelectOption[] =\n single || picked.has(\"*\")\n ? []\n : [\n {\n value: \"*\",\n label: eventTypeLabel(t, \"*\"),\n description: t(\"automations.picker.everyEventDescription\"),\n },\n ];\n const needle = query.trim().toLowerCase();\n const matches = [...all, ...known].filter(\n (option) =>\n !needle ||\n option.value.toLowerCase().includes(needle) ||\n String(option.description ?? \"\")\n .toLowerCase()\n .includes(needle),\n );\n const typed = query.trim();\n const custom =\n typed &&\n !single &&\n !picked.has(typed) &&\n !descriptors.some((descriptor) => descriptor.type === typed) &&\n eventTypeIssue(t, typed) === null\n ? [\n {\n value: `${CUSTOM_PREFIX}${typed}`,\n label: t(\"automations.picker.use\", { type: typed }),\n description: typed.endsWith(\".*\")\n ? t(\"automations.picker.prefixDescription\", { prefix: typed.slice(0, -1) })\n : t(\"automations.picker.unlisted\"),\n },\n ]\n : [];\n return [...matches, ...custom];\n }, [descriptors, grouped, query, single, sourceName, t, value]);\n\n const add = (picked: string) => {\n const type = picked.startsWith(CUSTOM_PREFIX) ? picked.slice(CUSTOM_PREFIX.length) : picked;\n setQuery(\"\");\n onChange(single ? [type] : [...value, type]);\n };\n const loading = state === undefined || state.status === \"loading\";\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n {value.length > 0 ? (\n <ul\n aria-label={t(\"automations.picker.picked\")}\n className=\"m-0 flex min-w-0 list-none flex-wrap gap-1.5 p-0\"\n >\n {value.map((type) => {\n const description = descriptors.find((entry) => entry.type === type)?.description;\n return (\n <li\n key={type}\n title={description}\n className=\"inline-flex h-7 max-w-full min-w-0 items-center gap-1 rounded-full border border-border bg-surface-2 pr-0.5 pl-2.5 text-xs font-medium text-fg\"\n >\n <span className={cn(\"min-w-0 truncate\", type !== \"*\" && \"font-mono\")}>\n {eventTypeLabel(t, type)}\n </span>\n <button\n type=\"button\"\n onClick={() => onChange(value.filter((entry) => entry !== type))}\n disabled={disabled}\n aria-label={t(\"automations.picker.removeType\", { type: eventTypeLabel(t, type) })}\n className=\"grid size-6 shrink-0 place-items-center rounded-full text-fg-muted hover:bg-hover hover:text-fg pointer-coarse:size-8\"\n >\n <XIcon aria-hidden=\"true\" className=\"size-3\" />\n </button>\n </li>\n );\n })}\n </ul>\n ) : null}\n {state?.status === \"error\" ? (\n <p className=\"m-0 text-xs leading-4.5 text-fg-muted\">\n {t(\"automations.picker.loadFailed\", { reason: state.message.replace(/\\.$/, \"\") })}\n </p>\n ) : null}\n {single && value.length > 0 ? null : (\n <ComboboxSelect\n options={options}\n value={null}\n onValueChange={add}\n onSearchChange={setQuery}\n filterLocally={false}\n placeholder={\n value.length === 0 ? t(\"automations.picker.choose\") : t(\"automations.picker.addEvent\")\n }\n searchPlaceholder={t(\"automations.picker.search\")}\n loading={loading && state?.status !== \"error\"}\n loadingLabel={t(\"automations.picker.loading\")}\n emptyMessage={t(\"automations.picker.empty\")}\n invalid={invalid}\n disabled={disabled}\n showMetaInTrigger={false}\n className=\"max-w-full sm:max-w-80\"\n aria-label={\n value.length === 0 ? t(\"automations.picker.choose\") : t(\"automations.picker.addEvent\")\n }\n />\n )}\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n Conditions.\n -------------------------------------------------------------------------- */\n\nexport function EventConditionsEditor({\n value,\n onChange,\n suggestions,\n issues,\n disabled = false,\n}: {\n value: EventConditionDraft[];\n onChange: (conditions: EventConditionDraft[]) => void;\n /** Fields worth matching, for autocomplete. */\n suggestions: ReadonlyArray<{ field: string; description: string }>;\n /** By condition key. */\n issues?: Record<string, string> | undefined;\n disabled?: boolean | undefined;\n}) {\n const t = useOpenGeniText();\n const listId = useId();\n const headingId = useId();\n const update = (key: string, next: Partial<EventConditionDraft>) =>\n onChange(\n value.map((condition) => (condition.key === key ? { ...condition, ...next } : condition)),\n );\n const full = value.length >= EVENT_TRIGGER_CONDITIONS_MAX;\n return (\n <div role=\"group\" aria-labelledby={headingId} className=\"flex min-w-0 flex-col gap-2\">\n <p id={headingId} className=\"m-0 text-sm leading-5 font-medium text-fg\">\n {t(\"automations.conditions.heading\")}\n <span className=\"ml-1.5 text-xs font-normal text-fg-subtle\">\n {t(\"automations.conditions.optional\")}\n </span>\n </p>\n <datalist id={listId}>\n {suggestions.map((entry) => (\n <option key={entry.field} value={entry.field}>\n {entry.description}\n </option>\n ))}\n </datalist>\n {value.map((condition, index) => {\n const operator = eventConditionOperator(condition.op);\n const issue = issues?.[condition.key];\n const position = { index: index + 1 };\n return (\n <div key={condition.key} className=\"flex min-w-0 flex-col gap-1.5\">\n <div className=\"grid min-w-0 grid-cols-[minmax(0,1fr)_auto] gap-2 sm:grid-cols-[minmax(0,1.2fr)_9.5rem_minmax(0,1fr)_auto]\">\n <TextInput\n value={condition.field}\n onChange={(event) => update(condition.key, { field: event.target.value })}\n list={listId}\n placeholder=\"data.action\"\n aria-label={t(\"automations.conditions.fieldFor\", position)}\n aria-invalid={issue ? true : undefined}\n mono\n suppressAutofill\n disabled={disabled}\n className=\"col-span-1\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => onChange(value.filter((entry) => entry.key !== condition.key))}\n disabled={disabled}\n aria-label={t(\"automations.conditions.remove\", position)}\n title={t(\"automations.editor.remove\")}\n className=\"text-fg-muted sm:order-last pointer-coarse:size-11\"\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n <SelectMenu\n variant=\"native\"\n options={EVENT_CONDITION_OPERATORS.map((option) => ({\n value: option.value,\n label: eventConditionOperatorLabel(t, option.value),\n }))}\n value={condition.op}\n onValueChange={(op) =>\n update(condition.key, {\n op,\n ...(eventConditionOperator(op).takes === null ? { value: \"\" } : {}),\n })\n }\n aria-label={t(\"automations.conditions.comparisonFor\", position)}\n showSelectedDescription={false}\n disabled={disabled}\n className=\"col-span-2 sm:col-span-1\"\n />\n {operator.takes === null ? (\n <span className=\"hidden sm:block\" />\n ) : (\n <TextInput\n value={condition.value}\n onChange={(event) => update(condition.key, { value: event.target.value })}\n placeholder={operator.takes === \"list\" ? \"opened, reopened\" : \"opened\"}\n aria-label={t(\"automations.conditions.valueFor\", position)}\n aria-invalid={issue ? true : undefined}\n suppressAutofill\n disabled={disabled}\n className=\"col-span-2 sm:col-span-1\"\n />\n )}\n </div>\n {issue ? <p className=\"m-0 text-xs leading-4.5 text-danger\">{issue}</p> : null}\n </div>\n );\n })}\n <div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange([...value, newEventConditionDraft()])}\n disabled={disabled || full}\n className=\"-ml-2 text-fg-muted pointer-coarse:h-11\"\n >\n <PlusIcon aria-hidden=\"true\" />\n {t(\"automations.conditions.add\")}\n </Button>\n </div>\n </div>\n );\n}\n","/**\n * An MCP event's subscription settings: a labelled field per argument when\n * the server's schema is flat, JSON otherwise. The value stays JSON text.\n */\nimport { useMemo } from \"react\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { CheckboxField, Field, TextArea, TextInput } from \"../../ui/field\";\nimport { SelectMenu } from \"../../ui/select-menu\";\nimport {\n eventArgumentFields,\n eventArgumentsValue,\n withEventArgument,\n type EventArgumentField,\n} from \"./event-arguments-model\";\n\nexport interface EventArgumentsFieldProps {\n /** The event's `argumentsSchema`; null or empty when it takes no arguments. */\n schema: Record<string, unknown> | null | undefined;\n /** The arguments as JSON text; empty for none. */\n value: string;\n onChange: (value: string) => void;\n error?: string | undefined;\n disabled?: boolean | undefined;\n}\n\nexport function EventArgumentsField({\n schema,\n value,\n onChange,\n error,\n disabled = false,\n}: EventArgumentsFieldProps) {\n const t = useOpenGeniText();\n const fields = useMemo(() => eventArgumentFields(schema), [schema]);\n const values = eventArgumentsValue(value);\n const title = t(\"automations.editor.subscriptionSettings\");\n if (fields === null || values === null || (fields.length === 0 && value.trim())) {\n return (\n <Field\n label={title}\n optional\n error={error}\n hint={t(\"automations.editor.subscriptionSettingsHint\")}\n >\n <TextArea\n mono\n rows={4}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n placeholder={jsonExample(schema)}\n disabled={disabled}\n spellCheck={false}\n />\n </Field>\n );\n }\n if (fields.length === 0) return null;\n return (\n <fieldset className=\"m-0 flex min-w-0 flex-col gap-4 border-0 p-0\" disabled={disabled}>\n <legend className=\"sr-only\">{title}</legend>\n {fields.map((field) => (\n <ArgumentInput\n key={field.name}\n field={field}\n value={values[field.name]}\n onChange={(next) => onChange(withEventArgument(value, field.name, next))}\n disabled={disabled}\n />\n ))}\n {error ? (\n <p role=\"alert\" className=\"m-0 text-xs leading-4.5 text-danger\">\n {error}\n </p>\n ) : null}\n </fieldset>\n );\n}\n\nfunction ArgumentInput({\n field,\n value,\n onChange,\n disabled,\n}: {\n field: EventArgumentField;\n value: unknown;\n onChange: (value: unknown) => void;\n disabled: boolean;\n}) {\n const t = useOpenGeniText();\n if (field.kind === \"boolean\") {\n return (\n <CheckboxField\n label={field.label}\n description={field.description ?? undefined}\n checked={value === true}\n onCheckedChange={(checked) => onChange(checked ? true : field.required ? false : undefined)}\n disabled={disabled}\n />\n );\n }\n const hint = field.description ?? undefined;\n if (field.kind === \"choice\") {\n const selected = field.options.findIndex((option) => option.value === value);\n return (\n <Field label={field.label} optional={!field.required} hint={hint}>\n <SelectMenu\n options={field.options.map((option, index) => ({\n value: String(index),\n label: option.label,\n }))}\n value={selected >= 0 ? String(selected) : null}\n onValueChange={(index) => onChange(field.options[Number(index)]?.value)}\n placeholder={t(\"automations.arguments.choose\")}\n disabled={disabled}\n className=\"max-w-full\"\n />\n </Field>\n );\n }\n const text = typeof value === \"string\" || typeof value === \"number\" ? String(value) : \"\";\n return (\n <Field label={field.label} optional={!field.required} hint={hint}>\n <TextInput\n value={text}\n onChange={(event) => {\n const typed = event.target.value;\n if (!typed.trim()) return onChange(undefined);\n if (field.kind === \"number\") {\n // Kept as typed until it reads as a number, so \"1.\" can become \"1.5\".\n const number = Number(typed.trim());\n return onChange(String(number) === typed.trim() ? number : typed);\n }\n onChange(typed);\n }}\n inputMode={field.kind === \"number\" ? (field.integer ? \"numeric\" : \"decimal\") : undefined}\n mono={field.kind === \"text\" && field.format === \"uuid\"}\n placeholder={field.placeholder ?? undefined}\n disabled={disabled}\n spellCheck={false}\n suppressAutofill\n />\n </Field>\n );\n}\n\n/** A filled-in example from a JSON Schema's properties, for the JSON placeholder. */\nfunction jsonExample(schema: Record<string, unknown> | null | undefined): string {\n const properties = schema?.properties;\n if (!properties || typeof properties !== \"object\") return \"{}\";\n const example: Record<string, unknown> = {};\n for (const [name, property] of Object.entries(properties as Record<string, unknown>)) {\n const type = (property as { type?: unknown } | null)?.type;\n example[name] = type === \"number\" || type === \"integer\" ? 0 : type === \"boolean\" ? true : \"\";\n }\n return JSON.stringify(example, null, 2);\n}\n","/**\n * An MCP event's subscription settings as a form. MCP servers describe a\n * subscription's arguments with a JSON Schema; flat schemas of text, numbers,\n * yes/no and fixed choices become labelled fields, and anything richer is\n * edited as JSON. The draft keeps the arguments as JSON text either way, so\n * keys the form doesn't show survive an edit.\n */\n\n/** One argument the form can edit. */\nexport type EventArgumentField = {\n name: string;\n /** The schema's title, else the property name in words. */\n label: string;\n description: string | null;\n required: boolean;\n} & (\n | {\n kind: \"text\";\n /** The schema's `format`, such as \"uuid\" or \"email\". */\n format: string | null;\n placeholder: string | null;\n }\n | { kind: \"number\"; integer: boolean; placeholder: string | null }\n | { kind: \"boolean\" }\n | { kind: \"choice\"; options: EventArgumentOption[] }\n);\n\nexport interface EventArgumentOption {\n value: string | number | boolean;\n label: string;\n}\n\ntype Schema = Record<string, unknown>;\n\nfunction isSchema(value: unknown): value is Schema {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/** \"projectId\" -> \"Project id\", \"max_items\" -> \"Max items\". */\nexport function eventArgumentLabel(name: string): string {\n const words = name\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .trim()\n .toLowerCase();\n return words ? words.charAt(0).toUpperCase() + words.slice(1) : name;\n}\n\nfunction scalarExample(value: unknown): string | null {\n return typeof value === \"string\" || typeof value === \"number\" ? String(value) : null;\n}\n\nfunction choiceOptions(property: Schema): EventArgumentOption[] | null {\n if (Array.isArray(property.enum)) {\n const values = property.enum.filter(\n (value): value is string | number | boolean =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\",\n );\n if (values.length === 0 || values.length !== property.enum.length) return null;\n return values.map((value) => ({ value, label: String(value) }));\n }\n const variants = Array.isArray(property.oneOf)\n ? property.oneOf\n : Array.isArray(property.anyOf)\n ? property.anyOf\n : null;\n if (!variants || variants.length === 0) return null;\n const options: EventArgumentOption[] = [];\n for (const variant of variants) {\n if (!isSchema(variant) || !(\"const\" in variant)) return null;\n const value = variant.const;\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\")\n return null;\n options.push({\n value,\n label: typeof variant.title === \"string\" && variant.title ? variant.title : String(value),\n });\n }\n return options;\n}\n\nfunction argumentField(\n name: string,\n property: unknown,\n required: boolean,\n): EventArgumentField | null {\n if (!isSchema(property)) return null;\n const base = {\n name,\n label:\n typeof property.title === \"string\" && property.title.trim()\n ? property.title.trim()\n : eventArgumentLabel(name),\n description:\n typeof property.description === \"string\" && property.description.trim()\n ? property.description.trim()\n : null,\n required,\n };\n const options = choiceOptions(property);\n if (options) return { ...base, kind: \"choice\", options };\n const examples = Array.isArray(property.examples) ? property.examples : [];\n const placeholder = scalarExample(property.default) ?? scalarExample(examples[0]);\n switch (property.type) {\n case \"string\":\n return {\n ...base,\n kind: \"text\",\n format: typeof property.format === \"string\" ? property.format : null,\n placeholder,\n };\n case \"number\":\n case \"integer\":\n return { ...base, kind: \"number\", integer: property.type === \"integer\", placeholder };\n case \"boolean\":\n return { ...base, kind: \"boolean\" };\n default:\n return null;\n }\n}\n\n/**\n * The fields for a subscription's arguments, required ones first; an empty\n * list when it takes none, and null when the schema needs JSON (nested\n * objects, lists, or types the form can't show).\n */\nexport function eventArgumentFields(\n schema: Record<string, unknown> | null | undefined,\n): EventArgumentField[] | null {\n if (!schema) return [];\n if (schema.type !== undefined && schema.type !== \"object\") return null;\n const properties = schema.properties;\n if (properties === undefined) return [];\n if (!isSchema(properties)) return null;\n const required = new Set(\n Array.isArray(schema.required)\n ? schema.required.filter((name): name is string => typeof name === \"string\")\n : [],\n );\n const fields: EventArgumentField[] = [];\n for (const [name, property] of Object.entries(properties)) {\n const field = argumentField(name, property, required.has(name));\n if (!field) return null;\n fields.push(field);\n }\n return [\n ...fields.filter((field) => field.required),\n ...fields.filter((field) => !field.required),\n ];\n}\n\n/** The arguments in JSON text as an object; null when the text isn't a JSON object. */\nexport function eventArgumentsValue(text: string): Record<string, unknown> | null {\n if (!text.trim()) return {};\n try {\n const value: unknown = JSON.parse(text);\n return isSchema(value) ? value : null;\n } catch {\n return null;\n }\n}\n\n/** The JSON text with one argument set, or removed when `value` is undefined. */\nexport function withEventArgument(text: string, name: string, value: unknown): string {\n const current = eventArgumentsValue(text) ?? {};\n const next: Record<string, unknown> = { ...current };\n if (value === undefined) delete next[name];\n else next[name] = value;\n return Object.keys(next).length > 0 ? JSON.stringify(next, null, 2) : \"\";\n}\n\n/**\n * The arguments for a newly picked event: what was already entered for\n * arguments it takes, else the host's defaults (such as the project a chat\n * belongs to). Arguments it doesn't take are dropped; text that isn't a JSON\n * object, or an event without a schema, keeps the text as it is.\n */\nexport function eventArgumentsForEvent(\n schema: Record<string, unknown> | null | undefined,\n text: string,\n defaults: Readonly<Record<string, unknown>> | undefined,\n): string {\n const properties = schema?.properties;\n const current = eventArgumentsValue(text);\n if (!isSchema(properties) || current === null) return text;\n const next: Record<string, unknown> = {};\n for (const name of Object.keys(properties)) {\n const value = name in current ? current[name] : defaults?.[name];\n if (value !== undefined) next[name] = value;\n }\n return Object.keys(next).length > 0 ? JSON.stringify(next, null, 2) : \"\";\n}\n","import { Building2Icon, WebhookIcon, WorkflowIcon } from \"lucide-react\";\n\nimport type { CapabilityCatalogItem, EventSource } from \"@opengeni/sdk\";\n\nimport { connectorLogo, connectorLogoIndex } from \"../../timeline/connector-logo-index\";\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { LogoTile, type LogoTileSize } from \"../../ui/logo-tile\";\nimport {\n eventSourceChoiceOf,\n eventSourceChoiceName,\n eventSourceProviderDomain,\n type EventSourceChoice,\n type EventSourceChoiceSubject,\n} from \"./event-source-model\";\n\n/** Resolves the brand logo for a source (a provider domain), when the host has one. */\nexport type EventSourceLogoResolver = (source: EventSourceLogoSubject) => string | null | undefined;\n\nexport type EventSourceLogoSubject = Pick<EventSource, \"kind\" | \"adapter\" | \"name\" | \"mcp\"> &\n Pick<EventSourceChoiceSubject, \"format\">;\n\n/**\n * Logos from a capability catalog: the app's own logo for GitHub, Slack,\n * Gmail, Linear, Sentry and apps with a webhook preset such as Tailscale, and\n * the MCP server's logo for an MCP source.\n * Build it once per catalog.\n */\nexport function eventSourceLogoResolver(\n catalog: readonly Pick<\n CapabilityCatalogItem,\n \"id\" | \"runtime\" | \"providerDomain\" | \"mcpUrl\" | \"connectionRef\" | \"logoAssetPath\"\n >[],\n assetUrl: (logoAssetPath: string) => string | null | undefined,\n): EventSourceLogoResolver {\n const index = connectorLogoIndex(catalog, (path) => (path ? assetUrl(path) : null));\n return (source) => {\n if (source.kind === \"mcp\" && source.mcp) {\n const serverId = source.mcp.serverId;\n const item = catalog.find(\n (entry) => entry.runtime.mcpServerId === serverId || entry.id === serverId,\n );\n if (!item) return null;\n return item.logoAssetPath\n ? (assetUrl(item.logoAssetPath) ?? null)\n : connectorLogo(index, item.providerDomain);\n }\n return connectorLogo(index, eventSourceProviderDomain(source));\n };\n}\n\nconst GLYPH: Partial<Record<EventSourceChoice, typeof WebhookIcon>> = {\n webhook: WebhookIcon,\n mcp: WorkflowIcon,\n workspace: Building2Icon,\n};\n\n/**\n * The tile for a source: its app's logo when the host resolves one, a webhook\n * MCP or workspace glyph for those kinds, otherwise the app's monogram (\"G\"\n * for a GitHub source, whatever the source is named).\n */\nexport function EventSourceTile({\n source,\n logo,\n size,\n className,\n}: {\n source: EventSourceLogoSubject;\n logo?: EventSourceLogoResolver | undefined;\n size?: LogoTileSize | undefined;\n className?: string | undefined;\n}) {\n const t = useOpenGeniText();\n const src = logo?.(source) ?? null;\n const choice = eventSourceChoiceOf(source);\n const Glyph = GLYPH[choice];\n return (\n <LogoTile\n size={size}\n src={src}\n name={Glyph ? source.name : eventSourceChoiceName(t, choice)}\n icon={Glyph ? <Glyph /> : undefined}\n className={className}\n />\n );\n}\n","/**\n * Automation templates: where a new automation starts. Using one fills the\n * ordinary form; nothing is created until the person saves. A template holds\n * what an automation does and when, never where its runs go, who owns it or\n * which accounts it uses. Its schedule has no time zone (the person's own\n * applies) and its triggers name a kind of source, resolved to the person's\n * own source when the form opens. Pure; text comes from the host's catalog.\n */\nimport { AUTOMATION_TEMPLATE_NAME_MAX_LENGTH } from \"@opengeni/contracts/automation-templates\";\nimport { webhookPresetOf } from \"@opengeni/contracts/event-triggers\";\nimport type {\n AutomationTemplateEventSource,\n AutomationTemplateSchedule,\n AutomationTemplateTrigger,\n CreateAutomationTemplateRequest,\n EventSource,\n ScheduledTask,\n WorkspaceAutomationTemplate,\n} from \"@opengeni/sdk\";\n\nimport type { OpenGeniText } from \"../../messages/runtime\";\nimport {\n cadenceFromScheduleSpec,\n describeCadence,\n toScheduleSpec,\n type CadenceValue,\n} from \"../../ui/cadence-picker\";\nimport {\n AUTOMATION_NAME_MAX_LENGTH,\n automationCadence,\n automationName,\n viewerTimeZone,\n type AutomationDraft,\n} from \"./automation-model\";\nimport {\n eventSourceChoiceName,\n eventSourceChoiceOf,\n type EventSourceChoice,\n} from \"./event-source-model\";\nimport {\n DEFAULT_EVENT_RUNS_PER_HOUR,\n emptyEventTriggersDraft,\n eventTriggerDraftFrom,\n eventTypesLabel,\n type EventTriggerDraft,\n type EventTriggersDraft,\n} from \"./event-trigger-model\";\n\n/** A template a person can start an automation from: built in, the host's own, or saved in the workspace. */\nexport interface AutomationTemplate {\n /** Unique among the templates offered together. */\n id: string;\n name: string;\n /** One sentence: what it does. */\n description: string;\n /** What the agent does on each run. */\n instructions: string;\n /** Null: it runs only on its events or with Run now. */\n schedule: AutomationTemplateSchedule | null;\n triggers: readonly AutomationTemplateTrigger[];\n /** The storm guard for event runs; omitted or null takes the default. */\n maxRunsPerHour?: number | null | undefined;\n /** When it runs, for its card: \"When a pull request opens\". Default: said from its schedule and triggers. */\n when?: string | undefined;\n}\n\n/* ----------------------------------------------------------------------------\n Built-in templates.\n -------------------------------------------------------------------------- */\n\nconst WEEKDAYS = [\"MONDAY\", \"TUESDAY\", \"WEDNESDAY\", \"THURSDAY\", \"FRIDAY\"] as const;\n\n/**\n * The templates that ship with Opengeni, in the host's language. Event\n * templates listen on GitHub, Linear and this workspace's meetings; offer\n * them where those sources can be added.\n */\nexport function builtinAutomationTemplates(t: OpenGeniText): AutomationTemplate[] {\n return [\n {\n id: \"meeting-notes\",\n name: t(\"automations.template.meetingNotes.name\"),\n description: t(\"automations.template.meetingNotes.description\"),\n instructions: t(\"automations.template.meetingNotes.instructions\"),\n when: t(\"automations.template.meetingNotes.when\"),\n schedule: null,\n triggers: [\n {\n source: { kind: \"workspace\" },\n eventTypes: [\"recording.transcript.ready\"],\n conditions: [\n { field: \"data.purpose\", op: \"equals\", value: \"meeting\" },\n // The person's own meetings: everyone who uses the template writes their own.\n { field: \"data.recordedByYou\", op: \"equals\", value: true },\n ],\n },\n ],\n },\n {\n id: \"pr-review\",\n name: t(\"automations.template.prReview.name\"),\n description: t(\"automations.template.prReview.description\"),\n instructions: t(\"automations.template.prReview.instructions\"),\n when: t(\"automations.template.prReview.when\"),\n schedule: null,\n triggers: [\n {\n source: { kind: \"github\" },\n eventTypes: [\"pull_request.opened\", \"pull_request.ready_for_review\"],\n // A draft is reviewed once it is marked ready for review.\n conditions: [{ field: \"data.pull_request.draft\", op: \"equals\", value: false }],\n },\n ],\n },\n {\n id: \"automation-failed\",\n name: t(\"automations.template.automationFailed.name\"),\n description: t(\"automations.template.automationFailed.description\"),\n instructions: t(\"automations.template.automationFailed.instructions\"),\n when: t(\"automations.template.automationFailed.when\"),\n schedule: null,\n triggers: [\n {\n source: { kind: \"workspace\" },\n eventTypes: [\"turn.failed\"],\n // Failed automation chats are Opengeni's own events: only chats an\n // automation ran, and only the person's own automations.\n includeOwnEvents: true,\n conditions: [\n { field: \"data.automationRunId\", op: \"exists\" },\n { field: \"data.startedByYou\", op: \"equals\", value: true },\n ],\n },\n ],\n },\n {\n id: \"issue-triage\",\n name: t(\"automations.template.issueTriage.name\"),\n description: t(\"automations.template.issueTriage.description\"),\n instructions: t(\"automations.template.issueTriage.instructions\"),\n when: t(\"automations.template.issueTriage.when\"),\n schedule: null,\n triggers: [\n {\n source: { kind: \"webhook\", adapter: \"custom\", preset: \"linear\" },\n eventTypes: [\"Issue.create\"],\n },\n ],\n },\n {\n id: \"morning-brief\",\n name: t(\"automations.template.morningBrief.name\"),\n description: t(\"automations.template.morningBrief.description\"),\n instructions: t(\"automations.template.morningBrief.instructions\"),\n schedule: { type: \"calendar\", hour: 8, minute: 0, daysOfWeek: [...WEEKDAYS] },\n triggers: [],\n },\n {\n id: \"dependency-pr\",\n name: t(\"automations.template.dependencyPr.name\"),\n description: t(\"automations.template.dependencyPr.description\"),\n instructions: t(\"automations.template.dependencyPr.instructions\"),\n schedule: { type: \"calendar\", hour: 9, minute: 30, daysOfWeek: [\"MONDAY\"] },\n triggers: [],\n },\n {\n id: \"cost-check\",\n name: t(\"automations.template.costCheck.name\"),\n description: t(\"automations.template.costCheck.description\"),\n instructions: t(\"automations.template.costCheck.instructions\"),\n schedule: { type: \"calendar\", hour: 8, minute: 0, daysOfWeek: [...WEEKDAYS] },\n triggers: [],\n },\n ];\n}\n\n/**\n * The templates a place can offer: one with event triggers only where events\n * run, and one on this workspace's own events only where those are offered.\n */\nexport function automationTemplatesFor(\n templates: readonly AutomationTemplate[],\n options: { eventTriggers: boolean; workspaceEvents?: boolean | undefined },\n): AutomationTemplate[] {\n return templates.filter(\n (template) =>\n (options.eventTriggers || template.triggers.length === 0) &&\n (options.workspaceEvents === true ||\n !template.triggers.some((trigger) => trigger.source.kind === \"workspace\")),\n );\n}\n\n/** A template saved in the workspace, as the list and the form use it. */\nexport function automationTemplateOfSaved(saved: WorkspaceAutomationTemplate): AutomationTemplate {\n return {\n id: saved.id,\n name: saved.name,\n description: saved.description,\n instructions: saved.instructions,\n schedule: saved.schedule,\n triggers: saved.triggers,\n maxRunsPerHour: saved.maxRunsPerHour,\n };\n}\n\n/* ----------------------------------------------------------------------------\n Words.\n -------------------------------------------------------------------------- */\n\n/** The kind of source a template trigger asks for, as \"Add a source\" offers it. */\nexport function automationTemplateSourceChoice(\n source: AutomationTemplateEventSource,\n): EventSourceChoice {\n return eventSourceChoiceOf({\n kind: source.kind,\n adapter: source.adapter ?? null,\n format: source.preset ? { preset: source.preset } : null,\n });\n}\n\n/** When a template runs, for its card: its own words, else its schedule or first trigger. */\nexport function automationTemplateWhenWords(\n t: OpenGeniText,\n template: AutomationTemplate,\n now: Date,\n): string {\n if (template.when) return template.when;\n const cadence = template.schedule\n ? automationTemplateCadence(template.schedule, viewerTimeZone())\n : null;\n if (cadence) {\n return describeCadence(cadence.rule, {\n timeZone: cadence.timeZone,\n now,\n text: t,\n }).short.replace(/ · .*$/u, \"\");\n }\n const [first] = template.triggers;\n if (!first) return t(\"automations.when.manual\");\n const words = t(\"automations.trigger.short\", {\n events: eventTypesLabel(t, first.eventTypes),\n source: eventSourceChoiceName(t, automationTemplateSourceChoice(first.source)),\n });\n return template.triggers.length === 1\n ? words\n : t(\"automations.triggers.shortAndMore\", { words, count: template.triggers.length - 1 });\n}\n\n/* ----------------------------------------------------------------------------\n Schedules.\n -------------------------------------------------------------------------- */\n\n/** A template's schedule in the person's time zone, as the form edits it. */\nexport function automationTemplateCadence(\n schedule: AutomationTemplateSchedule,\n timeZone: string,\n): CadenceValue {\n return schedule.type === \"calendar\"\n ? cadenceFromScheduleSpec({ ...schedule, timeZone }, timeZone)\n : cadenceFromScheduleSpec({ type: \"interval\", everySeconds: schedule.everySeconds }, timeZone);\n}\n\n/**\n * The schedule a template keeps: the time of day and days without the time\n * zone, or the interval without its start. A one-time run has none.\n */\nexport function automationTemplateSchedule(\n cadence: CadenceValue | null,\n now: Date,\n): AutomationTemplateSchedule | null {\n if (!cadence) return null;\n const spec = toScheduleSpec(cadence.rule, { timeZone: cadence.timeZone, now });\n if (spec.type === \"calendar\") {\n if (spec.daysOfMonth?.length) return null;\n return {\n type: \"calendar\",\n hour: spec.hour,\n minute: spec.minute,\n ...(spec.daysOfWeek?.length ? { daysOfWeek: [...spec.daysOfWeek] } : {}),\n };\n }\n if (spec.type === \"interval\") return { type: \"interval\", everySeconds: spec.everySeconds };\n return null;\n}\n\n/* ----------------------------------------------------------------------------\n Sources.\n -------------------------------------------------------------------------- */\n\n/** Whether `source` is of the kind a template trigger asks for. */\nexport function eventSourceFitsTemplate(\n wanted: AutomationTemplateEventSource,\n source: Pick<EventSource, \"kind\" | \"adapter\" | \"mcp\"> & Partial<Pick<EventSource, \"format\">>,\n): boolean {\n if (source.kind !== wanted.kind) return false;\n if (wanted.kind === \"webhook\") {\n const have = webhookPresetOf({ adapter: source.adapter, preset: source.format?.preset });\n const want = webhookPresetOf(wanted);\n return have.adapter === want.adapter && have.preset === want.preset;\n }\n if (wanted.kind === \"mcp\") return source.mcp?.serverId === wanted.mcpServerId;\n return true;\n}\n\n/**\n * The source a template trigger listens on for this person: the source the\n * template names when they can use it, else their first active source of its\n * kind; empty when they have none yet.\n */\nexport function automationTemplateSourceId(\n wanted: AutomationTemplateEventSource,\n sources: readonly EventSource[],\n): string {\n const usable = sources.filter(\n (source) => source.status === \"active\" && eventSourceFitsTemplate(wanted, source),\n );\n return usable.find((source) => source.id === wanted.sourceId)?.id ?? usable[0]?.id ?? \"\";\n}\n\n/**\n * Triggers still waiting for a source get one once sources load. Returns the\n * same draft when nothing changed, so it is safe to run on every load.\n */\nexport function withTemplateSources(\n events: EventTriggersDraft,\n sources: readonly EventSource[] | undefined,\n): EventTriggersDraft {\n if (!sources) return events;\n let changed = false;\n const triggers = events.triggers.map((trigger) => {\n if (trigger.sourceId || !trigger.templateSource) return trigger;\n const sourceId = automationTemplateSourceId(trigger.templateSource, sources);\n if (!sourceId) return trigger;\n changed = true;\n return { ...trigger, sourceId };\n });\n return changed ? { ...events, triggers } : events;\n}\n\n/* ----------------------------------------------------------------------------\n Drafts.\n -------------------------------------------------------------------------- */\n\n/**\n * The draft a template starts: its name, message, schedule in the person's\n * time zone, and triggers on their own sources. A trigger whose source isn't\n * there yet remembers what it asks for, so `withTemplateSources` can fill it\n * when sources load and the editor can offer to add one.\n */\nexport function automationDraftFromTemplate(\n template: AutomationTemplate,\n options: { sources?: readonly EventSource[] | undefined; timeZone?: string | undefined } = {},\n): AutomationDraft {\n const timeZone = options.timeZone ?? viewerTimeZone();\n const events: EventTriggersDraft = {\n ...emptyEventTriggersDraft(),\n maxRunsPerHour: template.maxRunsPerHour ?? DEFAULT_EVENT_RUNS_PER_HOUR,\n triggers: template.triggers.map(\n (trigger): EventTriggerDraft => ({\n ...eventTriggerDraftFrom({\n sourceId: \"\",\n eventTypes: trigger.eventTypes,\n conditions: trigger.conditions ?? [],\n includeOwnEvents: trigger.includeOwnEvents ?? false,\n arguments: trigger.arguments ?? null,\n }),\n templateSource: trigger.source,\n }),\n ),\n };\n return {\n instructions: template.instructions,\n name: template.name.slice(0, AUTOMATION_NAME_MAX_LENGTH),\n cadence: template.schedule ? automationTemplateCadence(template.schedule, timeZone) : null,\n events: withTemplateSources(events, options.sources),\n };\n}\n\n/**\n * The template an automation saves as: its message, schedule and triggers.\n * A trigger keeps the kind of its source, and names the source only when it\n * is shared with the workspace; a trigger on a source the saver can't see is\n * left out, since its kind can't be told.\n */\nexport function automationTemplateFromTask(\n t: OpenGeniText,\n task: Pick<ScheduledTask, \"name\" | \"schedule\" | \"events\" | \"agentConfig\">,\n sources: readonly EventSource[],\n input: { name?: string | undefined; description?: string | undefined; now: Date },\n): CreateAutomationTemplateRequest {\n const cadence = automationCadence(task.schedule);\n const triggers = (task.events?.triggers ?? []).flatMap((trigger) => {\n const source = sources.find((candidate) => candidate.id === trigger.sourceId);\n const wanted = templateSourceOf(trigger.sourceKind, source);\n if (!wanted) return [];\n return [\n {\n source: wanted,\n eventTypes: [...trigger.eventTypes],\n conditions: trigger.conditions.map((condition) => ({ ...condition })),\n includeOwnEvents: trigger.includeOwnEvents,\n ...(trigger.arguments && Object.keys(trigger.arguments).length > 0\n ? { arguments: { ...trigger.arguments } }\n : {}),\n },\n ];\n });\n const name = (input.name ?? \"\").trim() || task.name;\n return {\n name: automationName(t, { name, instructions: task.agentConfig.prompt }).slice(\n 0,\n AUTOMATION_TEMPLATE_NAME_MAX_LENGTH,\n ),\n description: (input.description ?? \"\").trim(),\n instructions: task.agentConfig.prompt,\n schedule: automationTemplateSchedule(cadence, input.now),\n triggers,\n maxRunsPerHour:\n triggers.length > 0 &&\n task.events &&\n task.events.maxRunsPerHour !== DEFAULT_EVENT_RUNS_PER_HOUR\n ? task.events.maxRunsPerHour\n : null,\n };\n}\n\nfunction templateSourceOf(\n kind: EventSource[\"kind\"],\n source: EventSource | undefined,\n): AutomationTemplateEventSource | null {\n const shared = source?.visibility === \"workspace\" ? { sourceId: source.id } : {};\n if (kind === \"webhook\") {\n if (!source?.adapter) return null;\n const { adapter, preset } = webhookPresetOf({\n adapter: source.adapter,\n preset: source.format?.preset,\n });\n return { kind, adapter, ...(preset ? { preset } : {}), ...shared };\n }\n if (kind === \"mcp\") {\n return source?.mcp ? { kind, mcpServerId: source.mcp.serverId, ...shared } : null;\n }\n return { kind, ...shared };\n}\n","/**\n * Templates on screen: the tile that tells a template's kind at a glance, the\n * list a person picks one from, and the dialog that saves an automation as a\n * template or renames one. Controlled; the host reads and writes templates.\n */\nimport { useState, type ReactNode } from \"react\";\nimport { CalendarClockIcon } from \"lucide-react\";\n\nimport {\n AUTOMATION_TEMPLATE_DESCRIPTION_MAX_LENGTH,\n AUTOMATION_TEMPLATE_NAME_MAX_LENGTH,\n} from \"@opengeni/contracts/automation-templates\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { Field, FieldStack, TextArea, TextInput } from \"../../ui/field\";\nimport { FormDialog } from \"../../ui/form-dialog\";\nimport { inAppClick } from \"../../ui/in-app-click\";\nimport { ListRow, RowList } from \"../../ui/list-row\";\nimport { LogoTile, type LogoTileSize } from \"../../ui/logo-tile\";\nimport {\n automationTemplateSourceChoice,\n automationTemplateWhenWords,\n type AutomationTemplate,\n} from \"./automation-template-model\";\nimport { eventSourceSubjectOfChoice } from \"./event-source-model\";\nimport { EventSourceTile, type EventSourceLogoResolver } from \"./event-source-tile\";\n\nexport interface AutomationTemplateTileProps {\n template: AutomationTemplate;\n sourceLogo?: EventSourceLogoResolver | undefined;\n /** The host's own art for this template. */\n icon?: ReactNode | undefined;\n size?: LogoTileSize | undefined;\n}\n\n/**\n * The tile for a template: the app its first event comes from, or a calendar\n * for one that runs on a schedule. `icon` replaces it, for a host's own art.\n */\nexport function AutomationTemplateTile({\n template,\n sourceLogo,\n icon,\n size,\n}: AutomationTemplateTileProps) {\n const t = useOpenGeniText();\n const [first] = template.triggers;\n if (icon || !first) {\n return <LogoTile size={size} name={template.name} icon={icon ?? <CalendarClockIcon />} />;\n }\n const choice = automationTemplateSourceChoice(first.source);\n const subject = {\n ...eventSourceSubjectOfChoice(t, choice),\n ...(first.source.kind === \"mcp\" && first.source.mcpServerId\n ? { mcp: { serverId: first.source.mcpServerId, connectionId: null } }\n : {}),\n };\n return <EventSourceTile source={subject} logo={sourceLogo} size={size} />;\n}\n\nexport interface AutomationTemplateListProps {\n /** Names the list for assistive technology: \"Templates\". */\n label: string;\n templates: readonly AutomationTemplate[];\n /** Opens the form filled in from the template. */\n onUse: (template: AutomationTemplate) => void;\n /**\n * The form's address for a template, so a row is a link that can open in\n * a new tab; a plain click still calls `onUse`.\n */\n href?: ((template: AutomationTemplate) => string) | undefined;\n sourceLogo?: EventSourceLogoResolver | undefined;\n /** A host's own tile for a template, by id. */\n icon?: ((template: AutomationTemplate) => ReactNode | undefined) | undefined;\n /** Menu items for one template, such as Rename and Delete; none for a template without any. */\n menu?: ((template: AutomationTemplate) => ReactNode | undefined) | undefined;\n /** The menu button's accessible name. */\n menuLabel?: ((template: AutomationTemplate) => string) | undefined;\n now: Date;\n}\n\n/**\n * Templates as a catalog to pick from: what each does, in up to two lines,\n * and when it runs. Opening one uses it.\n */\nexport function AutomationTemplateList({\n label,\n templates,\n onUse,\n href,\n sourceLogo,\n icon,\n menu,\n menuLabel,\n now,\n}: AutomationTemplateListProps) {\n const t = useOpenGeniText();\n return (\n <RowList label={label} variant=\"catalog\">\n {templates.map((template) => {\n const items = menu?.(template);\n return (\n <ListRow\n key={template.id}\n leading={\n <AutomationTemplateTile\n template={template}\n sourceLogo={sourceLogo}\n icon={icon?.(template)}\n />\n }\n title={template.name}\n description={template.description || undefined}\n meta={[automationTemplateWhenWords(t, template, now)]}\n menu={items}\n menuLabel={items ? menuLabel?.(template) : undefined}\n {...(href\n ? {\n href: href(template),\n linkProps: { onClick: inAppClick(() => onUse(template)) },\n }\n : { onOpen: () => onUse(template) })}\n />\n );\n })}\n </RowList>\n );\n}\n\nexport interface AutomationTemplateDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Save an automation as a new template, or rename a saved one. */\n mode: \"save\" | \"rename\";\n /** The name and description it opens with. */\n initial: { name: string; description: string };\n /** Saves; a thrown error shows in the dialog and keeps it open. */\n onSubmit: (values: { name: string; description: string }) => Promise<void>;\n}\n\n/** The name and description of a template, to save one or rename it. */\nexport function AutomationTemplateDialog({\n open,\n onOpenChange,\n mode,\n initial,\n onSubmit,\n}: AutomationTemplateDialogProps) {\n const t = useOpenGeniText();\n const [name, setName] = useState(initial.name);\n const [description, setDescription] = useState(initial.description);\n const [nameError, setNameError] = useState<string | null>(null);\n const [opened, setOpened] = useState(open);\n // Each opening starts from what it was opened with.\n if (open !== opened) {\n setOpened(open);\n if (open) {\n setName(initial.name);\n setDescription(initial.description);\n setNameError(null);\n }\n }\n return (\n <FormDialog\n open={open}\n onOpenChange={onOpenChange}\n size=\"sm\"\n title={\n mode === \"save\"\n ? t(\"automations.templateDialog.saveTitle\")\n : t(\"automations.templateDialog.renameTitle\")\n }\n description={mode === \"save\" ? t(\"automations.templateDialog.saveDescription\") : undefined}\n submitLabel={\n mode === \"save\"\n ? t(\"automations.templateDialog.saveSubmit\")\n : t(\"automations.templateDialog.renameSubmit\")\n }\n pendingLabel={t(\"automations.templateDialog.saving\")}\n cancelLabel={t(\"automations.form.cancel\")}\n onSubmit={async () => {\n const trimmed = name.trim();\n if (!trimmed) {\n setNameError(t(\"automations.templateDialog.nameRequired\"));\n return false;\n }\n await onSubmit({ name: trimmed, description: description.trim() });\n return true;\n }}\n >\n <FieldStack>\n <Field label={t(\"automations.templateDialog.name\")} error={nameError ?? undefined}>\n <TextInput\n value={name}\n maxLength={AUTOMATION_TEMPLATE_NAME_MAX_LENGTH}\n autoComplete=\"off\"\n onChange={(event) => {\n setName(event.target.value);\n setNameError(null);\n }}\n />\n </Field>\n <Field\n label={t(\"automations.templateDialog.description\")}\n hint={t(\"automations.templateDialog.descriptionHint\")}\n >\n <TextArea\n value={description}\n rows={2}\n maxLength={AUTOMATION_TEMPLATE_DESCRIPTION_MAX_LENGTH}\n onChange={(event) => setDescription(event.target.value)}\n />\n </Field>\n </FieldStack>\n </FormDialog>\n );\n}\n","/**\n * Sources a person can pick before they have them: the ones the server lists\n * as ready (MCP servers they are signed in to that offer events, their Gmail\n * accounts and this workspace's own events), and the host's own MCP servers.\n * None needs setting up, so each stands in for the person's own source until\n * it is used, and that source is added the first time its events are read or\n * an automation is saved on it.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport {\n readyEventSourceKey,\n readyEventSourceRequest,\n type ReadyEventSourceKind,\n} from \"@opengeni/contracts/event-triggers\";\nimport type {\n EventSource,\n EventTypeDescriptor,\n OpenGeniClient,\n ReadyEventSource,\n} from \"@opengeni/sdk\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport type { EventTriggersDraft } from \"./event-trigger-model\";\n\n/** An MCP server whose events people can pick without adding a source first. */\nexport interface AutomationEventServer {\n /** The MCP server id as configured for the workspace. */\n serverId: string;\n /** Its name in the source picker. Default: the server id. */\n name?: string | undefined;\n}\n\nexport interface EventSourceStandInsOptions {\n /** Adds a stand-in's source and reads event types. */\n client: Pick<OpenGeniClient, \"createEventSource\" | \"listEventSourceTypes\">;\n workspaceId: string;\n /** The sources the person can use; undefined while they load. */\n sources: EventSource[] | undefined;\n /** What the server lists as ready to use (`listReadyEventSources`). */\n readySources?: readonly ReadyEventSource[] | undefined;\n /** MCP servers whose events people can pick right away, such as the host's own. */\n eventServers?: readonly AutomationEventServer[] | undefined;\n /** Offer this workspace's own events, such as a meeting's transcript being ready. */\n workspaceEvents?: boolean | undefined;\n}\n\nexport interface EventSourceStandIns {\n /** The person's sources, then a stand-in for each one they don't have yet. */\n sources: EventSource[] | undefined;\n /** Reads a source's event types; a stand-in's source is added first. */\n loadEventTypes: (sourceId: string) => Promise<EventTypeDescriptor[]>;\n /** The triggers on the person's own sources, adding the source behind any stand-in. */\n realEvents: (events: EventTriggersDraft) => Promise<EventTriggersDraft>;\n /** True when a trigger is on a stand-in, so the host reads its sources again after saving. */\n usesStandIn: (events: EventTriggersDraft) => boolean;\n}\n\n/** A stand-in's id is the ready source's key, which never looks like a source id. */\nfunction isStandIn(sourceId: string): boolean {\n return readyEventSourceRequest(sourceId) !== null;\n}\n\nfunction standIn(\n workspaceId: string,\n ready: { key: string; kind: ReadyEventSourceKind; name: string },\n): EventSource {\n const request = readyEventSourceRequest(ready.key);\n return {\n id: ready.key,\n workspaceId,\n kind: ready.kind,\n adapter: null,\n format: null,\n name: ready.name,\n ownerSubjectId: null,\n visibility: \"private\",\n status: \"active\",\n statusReason: null,\n statusReasonCode: null,\n statusReasonDetail: null,\n webhookUrl: null,\n awaitingSigningSecret: false,\n mcp: request?.kind === \"mcp\" ? { serverId: request.serverId, connectionId: null } : null,\n lastDeliveryAt: null,\n createdAt: \"\",\n updatedAt: \"\",\n };\n}\n\n/** The sources a trigger can point at, with stand-ins for the ones added on first use. */\nexport function useEventSourceStandIns({\n client,\n workspaceId,\n sources,\n readySources,\n eventServers,\n workspaceEvents = false,\n}: EventSourceStandInsOptions): EventSourceStandIns {\n const t = useOpenGeniText();\n const workspaceName = t(\"automations.source.workspace.name\");\n // The source each used stand-in became: once the person has it, it shows instead.\n const [added, setAdded] = useState<ReadonlyMap<string, string>>(() => new Map());\n const withStandIns = useMemo(() => {\n if (!sources) return undefined;\n const ready = new Map<string, { key: string; kind: ReadyEventSourceKind; name: string }>();\n for (const entry of readySources ?? []) {\n if (entry.kind === \"workspace\" && !workspaceEvents) continue;\n ready.set(entry.key, entry);\n }\n for (const server of eventServers ?? []) {\n const key = readyEventSourceKey({ kind: \"mcp\", serverId: server.serverId });\n ready.set(key, {\n key,\n kind: \"mcp\",\n name: server.name ?? ready.get(key)?.name ?? server.serverId,\n });\n }\n if (workspaceEvents) {\n const key = readyEventSourceKey({ kind: \"workspace\" });\n ready.set(key, { key, kind: \"workspace\", name: workspaceName });\n }\n const has = (key: string, kind: ReadyEventSourceKind): boolean => {\n const id = added.get(key);\n if (id !== undefined && sources.some((source) => source.id === id)) return true;\n const request = readyEventSourceRequest(key);\n if (request?.kind === \"mcp\") {\n return sources.some(\n (source) => source.kind === \"mcp\" && source.mcp?.serverId === request.serverId,\n );\n }\n // A person has one This workspace source.\n return kind === \"workspace\" && sources.some((source) => source.kind === \"workspace\");\n };\n const extra = [...ready.values()]\n .filter((entry) => !has(entry.key, entry.kind))\n .map((entry) => standIn(workspaceId, entry));\n return extra.length > 0 ? [...sources, ...extra] : sources;\n }, [added, eventServers, readySources, sources, workspaceEvents, workspaceId, workspaceName]);\n\n // One creation per stand-in, shared by every read and save that needs it.\n const adding = useRef(new Map<string, Promise<string>>());\n const realSourceId = useCallback(\n (sourceId: string): Promise<string> => {\n const request = readyEventSourceRequest(sourceId);\n if (!request) return Promise.resolve(sourceId);\n let pending = adding.current.get(sourceId);\n if (!pending) {\n const name =\n request.kind === \"mcp\"\n ? eventServers?.find((server) => server.serverId === request.serverId)?.name\n : undefined;\n pending = client\n .createEventSource(workspaceId, { ...request, ...(name ? { name } : {}) })\n .then((created) => {\n setAdded((current) => new Map(current).set(sourceId, created.source.id));\n return created.source.id;\n });\n adding.current.set(sourceId, pending);\n pending.catch(() => adding.current.delete(sourceId));\n }\n return pending;\n },\n [client, eventServers, workspaceId],\n );\n const loadEventTypes = useCallback(\n async (sourceId: string) =>\n client.listEventSourceTypes(workspaceId, await realSourceId(sourceId)),\n [client, realSourceId, workspaceId],\n );\n const realEvents = useCallback(\n async (events: EventTriggersDraft): Promise<EventTriggersDraft> => ({\n ...events,\n triggers: await Promise.all(\n events.triggers.map(async (trigger) => ({\n ...trigger,\n sourceId: await realSourceId(trigger.sourceId),\n })),\n ),\n }),\n [realSourceId],\n );\n const usesStandIn = useCallback(\n (events: EventTriggersDraft) => events.triggers.some((trigger) => isStandIn(trigger.sourceId)),\n [],\n );\n return { sources: withStandIns, loadEventTypes, realEvents, usesStandIn };\n}\n","/**\n * What an automation listens for, read-only: one line per trigger with its\n * source's logo, the events, where they come from and only-when conditions,\n * and why a trigger is held back when it is.\n */\nimport type { MouseEvent } from \"react\";\n\nimport type { EventSource, EventTrigger } from \"@opengeni/sdk\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { StatusBadge } from \"../../ui/status-badge\";\nimport { eventSourceStatusBadge } from \"./event-source-model\";\nimport { EventSourceTile, type EventSourceLogoResolver } from \"./event-source-tile\";\nimport { eventTriggerWords } from \"./event-trigger-model\";\n\nexport interface EventTriggerSummaryProps {\n triggers: readonly EventTrigger[];\n /** The sources the viewer can see; a trigger on any other reads as hidden. */\n sources: readonly EventSource[] | undefined;\n sourceLogo?: EventSourceLogoResolver | undefined;\n /** A link to a source's page, when the host has one. */\n sourceHref?: ((sourceId: string) => string) | undefined;\n /** In-app navigation for that link; a plain link without it. */\n onOpenSource?: ((sourceId: string, event: MouseEvent<HTMLAnchorElement>) => void) | undefined;\n}\n\nexport function EventTriggerSummary({\n triggers,\n sources,\n sourceLogo,\n sourceHref,\n onOpenSource,\n}: EventTriggerSummaryProps) {\n const t = useOpenGeniText();\n return (\n <ul className=\"m-0 flex min-w-0 list-none flex-col gap-3 p-0\">\n {triggers.map((trigger) => {\n const source = sources?.find((candidate) => candidate.id === trigger.sourceId);\n const words = eventTriggerWords(t, trigger, sources ?? []);\n const held = eventSourceStatusBadge(t, trigger, source?.name ?? words.source);\n return (\n <li key={trigger.id} className=\"flex min-w-0 items-start gap-3\">\n <EventSourceTile\n source={\n source ?? { kind: trigger.sourceKind, adapter: null, name: words.source, mcp: null }\n }\n logo={sourceLogo}\n size=\"sm\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"m-0 text-sm leading-5 break-words text-fg\">{words.events}</p>\n <p className=\"m-0 text-xs leading-4.5 break-words text-fg-muted\">\n {t(\"automations.summary.from\")}{\" \"}\n {!source ? (\n t(\"automations.trigger.hiddenSourceInline\")\n ) : sourceHref ? (\n <a\n className=\"og-link\"\n href={sourceHref(source.id)}\n onClick={onOpenSource ? (event) => onOpenSource(source.id, event) : undefined}\n >\n {source.name}\n </a>\n ) : (\n source.name\n )}\n {words.conditions ? `, ${words.conditions}` : null}\n </p>\n </div>\n {held ? (\n <StatusBadge\n variant=\"dot\"\n status={held.status}\n reason={held.reason ?? undefined}\n className=\"shrink-0\"\n >\n {held.label}\n </StatusBadge>\n ) : null}\n </li>\n );\n })}\n </ul>\n );\n}\n","// @opengeni/react/automations: automations for any host. `AutomationsPanel`\n// is the drop-in: a workspace's or a chat's automations, with create (from\n// scratch or a template), edit, on and off, Run now and recent runs, read and\n// written through the host's client. The parts it is built from stay\n// available for a host's own pages: the form and its \"When\" (schedule and\n// event triggers), the trigger editor, templates, the event source tile and\n// words, the delivery log and event rows, and the pure models behind them.\n// Apart from the panel and `useEventSourceStandIns` nothing here fetches on\n// its own or assumes a router.\nimport type { EventDelivery } from \"@opengeni/sdk\";\nimport { createOpenGeniText } from \"./messages/runtime\";\nimport type { RowListColumn } from \"./ui/list-row\";\nimport type { ProductStatus } from \"./ui/status-badge\";\nimport { eventRowColumns as rowColumns } from \"./components/automations/event-rows\";\nimport {\n eventDeliveryStatusBadge as deliveryStatusBadge,\n eventSourceChoices as sourceChoices,\n type EventSourceChoiceMeta as ChoiceMeta,\n} from \"./components/automations/event-source-model\";\nimport { eventCommonFields as commonFields } from \"./components/automations/event-trigger-model\";\n\nexport {\n AutomationsPanel,\n type AutomationsPanelProps,\n} from \"./components/automations/automations-panel\";\nexport {\n useEventSourceStandIns,\n type AutomationEventServer,\n type EventSourceStandIns,\n type EventSourceStandInsOptions,\n} from \"./components/automations/event-source-stand-ins\";\nexport {\n automationDraftFromTemplate,\n automationTemplateCadence,\n automationTemplateFromTask,\n automationTemplateOfSaved,\n automationTemplateSchedule,\n automationTemplateSourceChoice,\n automationTemplateSourceId,\n automationTemplatesFor,\n automationTemplateWhenWords,\n builtinAutomationTemplates,\n eventSourceFitsTemplate,\n withTemplateSources,\n type AutomationTemplate,\n} from \"./components/automations/automation-template-model\";\nexport {\n AutomationTemplateDialog,\n AutomationTemplateList,\n AutomationTemplateTile,\n type AutomationTemplateDialogProps,\n type AutomationTemplateListProps,\n type AutomationTemplateTileProps,\n} from \"./components/automations/automation-template-parts\";\nexport { AutomationForm, type AutomationFormProps } from \"./components/automations/automation-form\";\nexport {\n AUTOMATION_FREQUENCIES,\n AutomationWhenField,\n type AutomationWhenFieldProps,\n} from \"./components/automations/automation-when-field\";\nexport {\n AUTOMATION_NAME_MAX_LENGTH,\n automationCadence,\n automationCadenceIssue,\n automationCadenceRepeats,\n automationCadenceWords,\n automationCreateRequest,\n automationDraftFrom,\n automationListensForEvents,\n automationName,\n automationNextRun,\n automationRunErrorText,\n automationRunEventsLabel,\n automationRunStatusLabel,\n automationRunTriggerLabel,\n automationScheduleSpec,\n automationScheduleWords,\n automationUpdateRequest,\n automationWhenSentence,\n automationWhenWords,\n defaultAutomationCadence,\n deriveAutomationName,\n hasAutomationDraftIssues,\n hasEventTriggers,\n isAgentAutomation,\n isFinishedOnce,\n newAutomationDraft,\n sessionAutomationWaitWords,\n sortAutomations,\n validateAutomationDraft,\n viewerTimeZone,\n} from \"./components/automations/automation-model\";\nexport type {\n AutomationDestination,\n AutomationDraft,\n AutomationDraftIssues,\n AutomationScheduleWords,\n SessionAutomationWaitWords,\n} from \"./components/automations/automation-model\";\nexport {\n EventArgumentsField,\n type EventArgumentsFieldProps,\n} from \"./components/automations/event-arguments-field\";\nexport {\n eventArgumentFields,\n eventArgumentLabel,\n eventArgumentsForEvent,\n eventArgumentsValue,\n withEventArgument,\n} from \"./components/automations/event-arguments-model\";\nexport type {\n EventArgumentField,\n EventArgumentOption,\n} from \"./components/automations/event-arguments-model\";\nexport {\n DEFAULT_EVENT_RUNS_PER_HOUR,\n EVENT_CONDITION_OPERATORS,\n eventCommonFields,\n EVENT_TRIGGER_CONDITIONS_MAX,\n EVENT_TRIGGER_TYPES_MAX,\n EVENT_TRIGGERS_PER_AUTOMATION_MAX,\n MAX_EVENT_RUNS_PER_HOUR,\n emptyEventTriggersDraft,\n eventConditionDraftFrom,\n eventConditionFieldSuggestions,\n eventConditionFromDraft,\n eventConditionOperator,\n eventConditionOperatorLabel,\n eventConditionsLabel,\n eventTriggerDraftFrom,\n eventTriggersDraftFrom,\n eventTriggersInputFrom,\n eventTriggersShortLabel,\n eventTriggerWords,\n eventTypeDescriptor,\n eventTypeIssue,\n eventTypeLabel,\n eventTypesLabel,\n hasEventTriggerIssues,\n newEventConditionDraft,\n newEventTriggerDraft,\n sameEventTriggers,\n validateEventTriggers,\n} from \"./components/automations/event-trigger-model\";\nexport type {\n EventConditionDraft,\n EventConditionOperatorOption,\n EventTriggerDraft,\n EventTriggerIssues,\n EventTriggersDraft,\n EventTriggersIssues,\n EventTriggerWords,\n} from \"./components/automations/event-trigger-model\";\nexport {\n WEBHOOK_ADAPTER_OF,\n byteSizeLabel,\n createEventSourceRequest,\n deliveryEventsLabel,\n deliveryTitle,\n eventActorLabel,\n eventDeliveryStatusBadge,\n eventSourceAddLabel,\n eventSourceChoiceMeta,\n eventSourceChoiceName,\n eventSourceChoiceOf,\n eventSourceChoices,\n eventSourceKindLabel,\n eventSourceProviderDomain,\n eventSourceStatusBadge,\n eventSourceSubjectOfChoice,\n eventStatusReasonText,\n isEventSourceChoice,\n pastedWebhookSetup,\n} from \"./components/automations/event-source-model\";\nexport type {\n EventSourceChoice,\n EventSourceChoiceMeta,\n EventStatusReasonParts,\n PastedWebhookSetup,\n} from \"./components/automations/event-source-model\";\nexport {\n EventSourceTile,\n eventSourceLogoResolver,\n} from \"./components/automations/event-source-tile\";\nexport type {\n EventSourceLogoResolver,\n EventSourceLogoSubject,\n} from \"./components/automations/event-source-tile\";\nexport {\n EventConditionsEditor,\n EventTriggerEditor,\n EventTriggersField,\n EventTypePicker,\n useEventTypes,\n} from \"./components/automations/event-trigger-editor\";\nexport type {\n EventTriggerEditorProps,\n EventTriggersFieldProps,\n EventTypesState,\n} from \"./components/automations/event-trigger-editor\";\nexport {\n EventTriggerSummary,\n type EventTriggerSummaryProps,\n} from \"./components/automations/event-trigger-summary\";\nexport {\n EventDeliveryRow,\n InboundEventDetail,\n InboundEventRow,\n eventRowColumns,\n inboundEventMeta,\n} from \"./components/automations/event-rows\";\nexport {\n SESSION_AUTOMATION_WAIT_LABEL,\n sessionAutomationWait,\n sessionAutomationWaitLabel,\n type SessionAutomationWait,\n} from \"./session-list-model\";\n\n// English-only constants from before the automation parts took the host's text.\n// They stay until the next major; new code calls the functions above with `t`.\nconst english = createOpenGeniText();\n\n/** @deprecated English only. Use `eventSourceChoices(t)`. */\nexport const EVENT_SOURCE_CHOICES: readonly ChoiceMeta[] = sourceChoices(english);\n\n/** @deprecated English only. Use `eventDeliveryStatusBadge(t, status)`. */\nexport const EVENT_DELIVERY_STATUS: Record<\n EventDelivery[\"status\"],\n { status: ProductStatus; label: string }\n> = {\n accepted: deliveryStatusBadge(english, \"accepted\"),\n ignored: deliveryStatusBadge(english, \"ignored\"),\n rejected: deliveryStatusBadge(english, \"rejected\"),\n failed: deliveryStatusBadge(english, \"failed\"),\n};\n\n/** @deprecated English only. Use `eventCommonFields(t)`. */\nexport const EVENT_COMMON_FIELDS: ReadonlyArray<{ field: string; description: string }> =\n commonFields(english);\n\n/** @deprecated English only. Use `eventRowColumns(t)`. */\nexport const INBOUND_EVENT_COLUMNS: RowListColumn[] = rowColumns(english);\n\n/** @deprecated English only. Use `eventRowColumns(t)`. */\nexport const EVENT_DELIVERY_COLUMNS: RowListColumn[] = rowColumns(english);\n"],"mappings":"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","names":["useCallback","useEffect","useRef","useState","CalendarClockIcon","PlusIcon","useMemo","useState","CircleAlertIcon","useId","useMemo","PlusIcon","Trash2Icon","useMemo","jsx","jsxs","jsx","webhookPresetOf","webhookPresetOf","Fragment","jsx","jsxs","useMemo","jsx","jsxs","viewerTimeZone","useId","useMemo","PlusIcon","Trash2Icon","jsx","jsxs","useState","useMemo","CircleAlertIcon","useState","AUTOMATION_TEMPLATE_NAME_MAX_LENGTH","jsx","jsxs","useState","AUTOMATION_TEMPLATE_NAME_MAX_LENGTH","useMemo","useRef","useState","useState","useMemo","useRef","jsx","jsxs","Fragment","jsx","jsxs","useState","useCallback","useEffect","PlusIcon","CalendarClockIcon","useRef"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/automations/event-rows.tsx","../src/components/automations/event-source-model.ts","../src/components/automations/automations-panel.tsx","../src/components/automations/automation-form.tsx","../src/components/automations/automation-when-field.tsx","../src/components/automations/event-trigger-editor.tsx","../src/components/automations/event-arguments-field.tsx","../src/components/automations/event-arguments-model.ts","../src/components/automations/event-source-tile.tsx","../src/components/automations/automation-template-model.ts","../src/components/automations/automation-template-parts.tsx","../src/components/automations/event-source-stand-ins.ts","../src/components/automations/event-trigger-summary.tsx","../src/automations.ts"],"sourcesContent":["/**\n * Rows for a source's events and its delivery log. Each row expands in place\n * to show what arrived. Use them inside a RowList with the matching columns.\n */\nimport { ExternalLinkIcon, RotateCcwIcon } from \"lucide-react\";\n\nimport { EVENT_DELIVERY_BODY_RETENTION_DAYS } from \"@opengeni/contracts/event-triggers\";\nimport type { EventDelivery, InboundEvent, InboundEventSummary } from \"@opengeni/sdk\";\n\nimport { useOpenGeniText, type OpenGeniText } from \"../../messages/runtime\";\nimport { DropdownMenuItem } from \"../../ui/dropdown-menu\";\nimport { ListRow, type RowListColumn } from \"../../ui/list-row\";\nimport { RelativeTime } from \"../../ui/relative-time\";\nimport { StatusBadge } from \"../../ui/status-badge\";\nimport {\n byteSizeLabel,\n deliveryTitle,\n eventActorLabel,\n eventDeliveryStatusBadge,\n} from \"./event-source-model\";\nimport { eventTypeLabel } from \"./event-trigger-model\";\n\n/** The columns of a RowList of InboundEventRow or EventDeliveryRow: when it arrived. */\nexport function eventRowColumns(t: OpenGeniText): RowListColumn[] {\n return [\n {\n id: \"received\",\n label: t(\"automations.rows.received\"),\n width: 132,\n align: \"end\",\n hideLabel: true,\n },\n ];\n}\n\n/** The quiet facts under an event: its type, who caused it and what it is about. */\nexport function inboundEventMeta(t: OpenGeniText, event: InboundEventSummary): string[] {\n return [eventTypeLabel(t, event.type), eventActorLabel(t, event.actor), event.subject].filter(\n (part): part is string => Boolean(part),\n );\n}\n\n/** One normalized event; expands to its data. */\nexport function InboundEventRow({\n event,\n expanded,\n onToggle,\n}: {\n event: InboundEvent;\n expanded: boolean;\n onToggle: () => void;\n}) {\n const t = useOpenGeniText();\n return (\n <ListRow\n title={event.summary}\n meta={inboundEventMeta(t, event)}\n status={\n event.gapBefore ? (\n <StatusBadge variant=\"dot\" tone=\"attention\" reason={t(\"automations.rows.gapReason\")}>\n {t(\"automations.rows.gap\")}\n </StatusBadge>\n ) : undefined\n }\n cells={{ received: <RelativeTime date={event.receivedAt} /> }}\n expanded={expanded}\n onOpen={onToggle}\n panel={<InboundEventDetail event={event} />}\n />\n );\n}\n\nexport function InboundEventDetail({ event }: { event: InboundEvent }) {\n const t = useOpenGeniText();\n return (\n <div className=\"flex min-w-0 flex-col gap-2 pb-3\">\n <dl className=\"m-0 grid min-w-0 grid-cols-[auto_minmax(0,1fr)] gap-x-4 gap-y-1 text-xs leading-4.5\">\n <dt className=\"text-fg-muted\">{t(\"automations.rows.type\")}</dt>\n <dd className=\"m-0 min-w-0 font-mono break-all text-fg\">{event.type}</dd>\n <dt className=\"text-fg-muted\">{t(\"automations.rows.happened\")}</dt>\n <dd className=\"m-0 text-fg\">\n <RelativeTime date={event.occurredAt} format=\"absolute\" />\n </dd>\n {event.url ? (\n <>\n <dt className=\"text-fg-muted\">{t(\"automations.rows.link\")}</dt>\n <dd className=\"m-0 min-w-0\">\n <a\n href={event.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"og-link inline-flex max-w-full items-center gap-1\"\n >\n <span className=\"min-w-0 truncate\">{event.url}</span>\n <ExternalLinkIcon aria-hidden=\"true\" className=\"size-3 shrink-0\" />\n </a>\n </dd>\n </>\n ) : null}\n </dl>\n <pre className=\"m-0 max-h-72 min-w-0 overflow-auto rounded-md border border-border bg-surface-2 p-3 font-mono text-xs leading-4.5 text-fg\">\n {JSON.stringify(event.data, null, 2)}\n </pre>\n {event.dataTruncated ? (\n <p className=\"m-0 text-xs leading-4.5 text-fg-muted\">\n {t(\"automations.rows.dataTruncated\")}\n </p>\n ) : null}\n </div>\n );\n}\n\n/** One delivery in a source's log; replay sits in its menu. */\nexport function EventDeliveryRow({\n delivery,\n canReplay,\n replaying = false,\n onReplay,\n expanded,\n onToggle,\n}: {\n delivery: EventDelivery;\n /** The viewer manages the source and the raw body is still kept. */\n canReplay: boolean;\n replaying?: boolean | undefined;\n onReplay: () => void;\n expanded: boolean;\n onToggle: () => void;\n}) {\n const t = useOpenGeniText();\n const status = eventDeliveryStatusBadge(t, delivery.status);\n const meta = [\n byteSizeLabel(t, delivery.bodyBytes),\n delivery.duplicateCount > 0\n ? t(\"automations.rows.sentAgain\", { count: delivery.duplicateCount })\n : null,\n delivery.replayOfDeliveryId ? t(\"automations.rows.replay\") : null,\n ].filter((part): part is string => Boolean(part));\n return (\n <ListRow\n title={deliveryTitle(t, delivery)}\n description={delivery.reason ?? undefined}\n meta={meta}\n status={\n <StatusBadge variant=\"dot\" status={status.status}>\n {status.label}\n </StatusBadge>\n }\n cells={{ received: <RelativeTime date={delivery.receivedAt} /> }}\n menu={\n canReplay ? (\n <DropdownMenuItem disabled={replaying} onSelect={onReplay}>\n <RotateCcwIcon />\n {t(\"automations.rows.replay\")}\n </DropdownMenuItem>\n ) : undefined\n }\n menuLabel={t(\"automations.rows.deliveryActions\")}\n expanded={expanded}\n onOpen={onToggle}\n panel={\n <div className=\"pb-3 text-xs leading-4.5 text-fg-muted\">\n {delivery.bodyRetained\n ? t(\"automations.rows.bodyKept\", { days: EVENT_DELIVERY_BODY_RETENTION_DAYS })\n : t(\"automations.rows.bodyGone\")}{\" \"}\n {delivery.eventIds.length > 0\n ? t(\"automations.rows.became\", { count: delivery.eventIds.length })\n : t(\"automations.rows.noEvents\")}\n </div>\n }\n />\n );\n}\n","/**\n * Event sources in the product's words: what each kind is, where its events\n * come from, its status, and its deliveries. Pure; text comes from the host's\n * message catalog through the `t` each function takes first.\n */\nimport type {\n CreateEventSourceRequest,\n EventActor,\n EventDelivery,\n EventSource,\n WebhookEventAdapter,\n} from \"@opengeni/sdk\";\nimport {\n isEventStatusReasonCode,\n WEBHOOK_FORMAT_PRESETS,\n webhookPresetOf,\n type EventStatusReasonCode,\n type WebhookFormatPreset,\n} from \"@opengeni/contracts/event-triggers\";\n\nimport type { OpenGeniText } from \"../../messages/runtime\";\nimport type { ProductStatus } from \"../../ui/status-badge\";\nimport { eventTypeLabel } from \"./event-trigger-model\";\n\n/** What a person picks when adding a source. One per kind and webhook adapter. */\nexport type EventSourceChoice =\n | \"webhook\"\n | \"linear\"\n | \"sentry\"\n | \"tailscale\"\n | \"github\"\n | \"slack\"\n | \"gmail\"\n | \"mcp\"\n | \"workspace\";\n\nexport interface EventSourceChoiceMeta {\n choice: EventSourceChoice;\n /** \"GitHub\", \"Linear\", \"Your own app\". */\n name: string;\n /** One sentence: what arrives and how it connects. */\n description: string;\n /** For the brand logo, when the host has one. */\n providerDomain: string | null;\n /** How it connects: Opengeni sets it up, or a person pastes a URL and secret. */\n setup: \"automatic\" | \"paste\";\n /** Who can see it and its events. */\n audience: \"workspace\" | \"personal\" | \"choice\";\n}\n\ntype EventSourceChoiceFacts = Omit<EventSourceChoiceMeta, \"name\" | \"description\">;\n\n/** Every choice in the order \"Add a source\" offers them. */\nconst CHOICE_FACTS: readonly EventSourceChoiceFacts[] = [\n { choice: \"workspace\", providerDomain: null, setup: \"automatic\", audience: \"personal\" },\n { choice: \"github\", providerDomain: \"github.com\", setup: \"automatic\", audience: \"workspace\" },\n { choice: \"slack\", providerDomain: \"slack.com\", setup: \"automatic\", audience: \"workspace\" },\n { choice: \"gmail\", providerDomain: \"mail.google.com\", setup: \"automatic\", audience: \"personal\" },\n { choice: \"linear\", providerDomain: \"linear.app\", setup: \"paste\", audience: \"choice\" },\n { choice: \"sentry\", providerDomain: \"sentry.io\", setup: \"paste\", audience: \"choice\" },\n { choice: \"tailscale\", providerDomain: \"tailscale.com\", setup: \"paste\", audience: \"choice\" },\n { choice: \"mcp\", providerDomain: null, setup: \"automatic\", audience: \"personal\" },\n { choice: \"webhook\", providerDomain: null, setup: \"paste\", audience: \"choice\" },\n];\n\nfunction choiceFacts(choice: EventSourceChoice): EventSourceChoiceFacts {\n // A kind from a newer server than this client still shows, plainly.\n return (\n CHOICE_FACTS.find((entry) => entry.choice === choice) ?? {\n choice,\n providerDomain: null,\n setup: \"automatic\",\n audience: \"personal\",\n }\n );\n}\n\n/** The choice's name: the app's own name, or what the kind is called. */\nexport function eventSourceChoiceName(t: OpenGeniText, choice: EventSourceChoice): string {\n switch (choice) {\n case \"github\":\n return \"GitHub\";\n case \"slack\":\n return \"Slack\";\n case \"gmail\":\n return \"Gmail\";\n case \"linear\":\n return \"Linear\";\n case \"sentry\":\n return \"Sentry\";\n case \"tailscale\":\n return \"Tailscale\";\n case \"mcp\":\n return t(\"automations.source.mcp.name\");\n case \"webhook\":\n return t(\"automations.source.webhook.name\");\n case \"workspace\":\n return t(\"automations.source.workspace.name\");\n default:\n return String(choice);\n }\n}\n\nfunction choiceDescription(t: OpenGeniText, choice: EventSourceChoice): string {\n switch (choice) {\n case \"github\":\n return t(\"automations.source.github.description\");\n case \"slack\":\n return t(\"automations.source.slack.description\");\n case \"gmail\":\n return t(\"automations.source.gmail.description\");\n case \"linear\":\n return t(\"automations.source.linear.description\");\n case \"sentry\":\n return t(\"automations.source.sentry.description\");\n case \"tailscale\":\n return t(\"automations.source.tailscale.description\");\n case \"mcp\":\n return t(\"automations.source.mcp.description\");\n case \"webhook\":\n return t(\"automations.source.webhook.description\");\n case \"workspace\":\n return t(\"automations.source.workspace.description\");\n default:\n return \"\";\n }\n}\n\nexport function eventSourceChoiceMeta(\n t: OpenGeniText,\n choice: EventSourceChoice,\n): EventSourceChoiceMeta {\n return {\n ...choiceFacts(choice),\n name: eventSourceChoiceName(t, choice),\n description: choiceDescription(t, choice),\n };\n}\n\n/** Every kind of source a person can add, in the order to offer them. */\nexport function eventSourceChoices(t: OpenGeniText): EventSourceChoiceMeta[] {\n return CHOICE_FACTS.map((facts) => eventSourceChoiceMeta(t, facts.choice));\n}\n\n/** True for a known choice, for example a `?kind=` link parameter. */\nexport function isEventSourceChoice(value: unknown): value is EventSourceChoice {\n return CHOICE_FACTS.some((entry) => entry.choice === value);\n}\n\n/**\n * Apps whose own webhook a person pastes a URL into: each is a custom webhook\n * made with the app's preset.\n */\nconst APP_WEBHOOK_CHOICES = [\"linear\", \"sentry\", \"tailscale\"] as const;\ntype AppWebhookChoice = (typeof APP_WEBHOOK_CHOICES)[number];\n\nfunction isAppWebhookChoice(value: unknown): value is AppWebhookChoice {\n return APP_WEBHOOK_CHOICES.includes(value as AppWebhookChoice);\n}\n\n/** The custom webhook preset each app choice is made with. */\nconst PRESET_OF: Record<AppWebhookChoice, WebhookFormatPreset> = {\n linear: \"linear\",\n sentry: \"sentry\",\n tailscale: \"tailscale\",\n};\n\n/** The facts about a source that say which choice it is. */\nexport type EventSourceChoiceSubject = Pick<EventSource, \"kind\" | \"adapter\"> & {\n format?:\n | {\n preset?: string | undefined;\n signature?: { scheme: string; parameter?: string | undefined } | undefined;\n }\n | null\n | undefined;\n};\n\n/**\n * The choice a source is: its kind, its app for a custom webhook made with an\n * app's preset (or a server's older `linear` or `sentry` adapter), else a\n * webhook.\n */\nexport function eventSourceChoiceOf(source: EventSourceChoiceSubject): EventSourceChoice {\n if (source.kind !== \"webhook\") return source.kind;\n const { preset } = webhookPresetOf({ adapter: source.adapter, preset: source.format?.preset });\n return isAppWebhookChoice(preset) ? preset : \"webhook\";\n}\n\nexport const WEBHOOK_ADAPTER_OF: Partial<Record<EventSourceChoice, WebhookEventAdapter>> = {\n webhook: \"standard\",\n linear: \"custom\",\n sentry: \"custom\",\n tailscale: \"custom\",\n};\n\n/** A stand-in source of the chosen kind, for its tile before one exists. */\nexport function eventSourceSubjectOfChoice(\n t: OpenGeniText,\n choice: EventSourceChoice,\n): Pick<EventSource, \"kind\" | \"adapter\" | \"name\" | \"mcp\"> & {\n format: { preset: string } | null;\n} {\n const adapter = WEBHOOK_ADAPTER_OF[choice] ?? null;\n const preset = isAppWebhookChoice(choice) ? PRESET_OF[choice] : undefined;\n return {\n kind: adapter\n ? \"webhook\"\n : (choice as Exclude<EventSourceChoice, \"webhook\" | AppWebhookChoice>),\n adapter,\n format: preset ? { preset } : null,\n name: eventSourceChoiceName(t, choice),\n mcp: null,\n };\n}\n\n/** What adding one is called: \"Add GitHub\", \"Add a webhook\". */\nexport function eventSourceAddLabel(t: OpenGeniText, choice: EventSourceChoice): string {\n if (choice === \"webhook\") return t(\"automations.source.addWebhook\");\n if (choice === \"mcp\") return t(\"automations.source.addMcp\");\n if (choice === \"workspace\") return t(\"automations.source.addWorkspace\");\n return t(\"automations.source.add\", { name: eventSourceChoiceName(t, choice) });\n}\n\n/**\n * \"GitHub\", \"Linear webhook\", \"Webhook\", \"MCP server\", \"Workspace events\": the\n * kind, not the name.\n */\nexport function eventSourceKindLabel(t: OpenGeniText, source: EventSourceChoiceSubject): string {\n const choice = eventSourceChoiceOf(source);\n if (isAppWebhookChoice(choice))\n return t(\"automations.source.kind.appWebhook\", { app: eventSourceChoiceName(t, choice) });\n if (choice === \"webhook\") return t(\"automations.source.kind.webhook\");\n if (choice === \"workspace\") return t(\"automations.source.kind.workspace\");\n return eventSourceChoiceName(t, choice);\n}\n\n/** The domain whose logo stands for the source, when it has one. */\nexport function eventSourceProviderDomain(source: EventSourceChoiceSubject): string | null {\n return choiceFacts(eventSourceChoiceOf(source)).providerDomain;\n}\n\n/**\n * Why a source or trigger is held back, or why a source can't send an event\n * type, as the server reported it: a code, the same reason as an English\n * sentence, and what the app or server said, when it said something.\n */\nexport interface EventStatusReasonParts {\n /** The server's sentence, shown when the code is missing or unknown here. */\n text: string | null;\n code?: string | null | undefined;\n detail?: string | null | undefined;\n}\n\ntype SourceNamedReason = Exclude<\n EventStatusReasonCode,\n | \"turned_off\"\n | \"awaiting_secret\"\n | \"connector_removed\"\n | \"account_changed\"\n | \"github_event_not_subscribed\"\n>;\n\nconst SOURCE_NAMED_REASONS: Record<SourceNamedReason, (t: OpenGeniText, source: string) => string> =\n {\n reconnect: (t, source) => t(\"automations.statusReason.reconnect\", { source }),\n missing_permission: (t, source) => t(\"automations.statusReason.missingPermission\", { source }),\n app_not_enabled: (t, source) => t(\"automations.statusReason.appNotEnabled\", { source }),\n host_sign_in: (t, source) => t(\"automations.statusReason.hostSignIn\", { source }),\n events_unsupported: (t, source) => t(\"automations.statusReason.eventsUnsupported\", { source }),\n event_type_gone: (t, source) => t(\"automations.statusReason.eventTypeGone\", { source }),\n forbidden: (t, source) => t(\"automations.statusReason.forbidden\", { source }),\n invalid_arguments: (t, source) => t(\"automations.statusReason.invalidArguments\", { source }),\n needs_public_address: (t, source) =>\n t(\"automations.statusReason.needsPublicAddress\", { source }),\n push_only: (t, source) => t(\"automations.statusReason.pushOnly\", { source }),\n delivery_mode_unsupported: (t, source) =>\n t(\"automations.statusReason.deliveryModeUnsupported\", { source }),\n callback_unreachable: (t, source) =>\n t(\"automations.statusReason.callbackUnreachable\", { source }),\n not_answering: (t, source) => t(\"automations.statusReason.notAnswering\", { source }),\n unavailable: (t, source) => t(\"automations.statusReason.unavailable\", { source }),\n };\n\n/** Codes whose detail is what the app or server said, quoted after the reason. */\nconst QUOTES_DETAIL: ReadonlySet<EventStatusReasonCode> = new Set([\n \"forbidden\",\n \"invalid_arguments\",\n \"callback_unreachable\",\n]);\n\n/**\n * A held-back reason in the viewer's language. Known codes are worded from\n * the catalog, naming the source when `sourceName` is given; anything else,\n * such as a code from a newer server, shows the server's sentence.\n */\nexport function eventStatusReasonText(\n t: OpenGeniText,\n reason: EventStatusReasonParts,\n sourceName?: string | null,\n): string | null {\n const code = reason.code;\n if (!isEventStatusReasonCode(code)) return reason.text;\n const detail = reason.detail?.trim() || null;\n const source = sourceName?.trim() || null;\n switch (code) {\n case \"turned_off\":\n return t(\"automations.statusReason.turnedOff\");\n case \"awaiting_secret\":\n return t(\"automations.statusReason.awaitingSecret\");\n case \"connector_removed\":\n return t(\"automations.statusReason.connectorRemoved\");\n case \"github_event_not_subscribed\":\n return detail\n ? t(\"automations.statusReason.githubEventNotSubscribed\", { event: detail })\n : reason.text;\n case \"account_changed\":\n return detail && source\n ? t(\"automations.statusReason.accountChanged\", { source, account: detail })\n : reason.text;\n }\n if (!source) return reason.text;\n const sentence = SOURCE_NAMED_REASONS[code](t, source);\n return detail && QUOTES_DETAIL.has(code)\n ? t(\"automations.statusReason.withDetail\", { reason: sentence, detail })\n : sentence;\n}\n\n/**\n * The badge a source's or trigger's row shows; a healthy one shows none.\n * `sourceName` names the source in the reason; a source's own name is used\n * when the item is a source.\n */\nexport function eventSourceStatusBadge(\n t: OpenGeniText,\n item: Pick<EventSource, \"status\" | \"statusReason\"> &\n Partial<Pick<EventSource, \"statusReasonCode\" | \"statusReasonDetail\" | \"name\">>,\n sourceName?: string | null,\n): { status: ProductStatus; label: string; reason: string | null } | null {\n const reason = () =>\n eventStatusReasonText(\n t,\n { text: item.statusReason, code: item.statusReasonCode, detail: item.statusReasonDetail },\n sourceName ?? item.name,\n );\n if (item.status === \"blocked\") {\n return {\n status: \"needs_you\",\n label: t(\"automations.source.status.blocked\"),\n reason: reason(),\n };\n }\n if (item.status === \"disabled\") {\n return {\n status: \"off\",\n label: t(\"automations.source.status.off\"),\n reason: reason(),\n };\n }\n return null;\n}\n\n/** How a pasted webhook is connected: the app gets the URL, Opengeni gets its secret. */\nexport interface PastedWebhookSetup {\n /** \"Linear\". */\n app: string;\n /** What the app calls the secret: \"signing secret\", \"client secret\". */\n secretName: string;\n /** Where to paste the URL in the app, in one sentence. */\n urlStep: string;\n /** Where the app shows the secret, in one sentence. */\n secretStep: string;\n}\n\nexport function pastedWebhookSetup(\n t: OpenGeniText,\n source: EventSourceChoiceSubject,\n): PastedWebhookSetup | null {\n if (source.kind !== \"webhook\") return null;\n const app = eventSourceChoiceOf(source);\n if (!isAppWebhookChoice(app)) {\n if (source.adapter !== \"custom\") return null;\n // Any other app's webhook: the same two steps, in that app's settings,\n // worded for how it proves a delivery is its own.\n const signature = source.format?.signature;\n const scheme = signature?.scheme;\n if (scheme === \"url_token\") {\n return {\n app: t(\"automations.paste.custom.app\"),\n secretName: t(\"automations.paste.urlToken.secretName\"),\n urlStep: t(\"automations.paste.urlToken.urlStep\", {\n parameter: signature?.parameter ?? \"token\",\n }),\n secretStep: t(\"automations.paste.urlToken.secretStep\"),\n };\n }\n if (scheme === \"ed25519\") {\n return {\n app: t(\"automations.paste.custom.app\"),\n secretName: t(\"automations.paste.publicKey.secretName\"),\n urlStep: t(\"automations.paste.custom.urlStep\"),\n secretStep: t(\"automations.paste.publicKey.secretStep\"),\n };\n }\n return {\n app: t(\"automations.paste.custom.app\"),\n secretName: t(\"automations.paste.custom.secretName\"),\n urlStep: t(\"automations.paste.custom.urlStep\"),\n secretStep: t(\"automations.paste.custom.secretStep\"),\n };\n }\n return { app: eventSourceChoiceName(t, app), ...APP_PASTE_STEPS[app](t) };\n}\n\n/** Each app's paste wording, with literal catalog keys so key usage stays checkable. */\nconst APP_PASTE_STEPS: Record<\n AppWebhookChoice,\n (t: OpenGeniText) => Omit<PastedWebhookSetup, \"app\">\n> = {\n linear: (t) => ({\n secretName: t(\"automations.paste.linear.secretName\"),\n urlStep: t(\"automations.paste.linear.urlStep\"),\n secretStep: t(\"automations.paste.linear.secretStep\"),\n }),\n sentry: (t) => ({\n secretName: t(\"automations.paste.sentry.secretName\"),\n urlStep: t(\"automations.paste.sentry.urlStep\"),\n secretStep: t(\"automations.paste.sentry.secretStep\"),\n }),\n tailscale: (t) => ({\n secretName: t(\"automations.paste.tailscale.secretName\"),\n urlStep: t(\"automations.paste.tailscale.urlStep\"),\n secretStep: t(\"automations.paste.tailscale.secretStep\"),\n }),\n};\n\n/** The request that adds a source of the chosen kind; an unnamed webhook takes the kind's name. */\nexport function createEventSourceRequest(\n t: OpenGeniText,\n input: {\n choice: EventSourceChoice;\n name: string;\n visibility: \"private\" | \"workspace\";\n signingSecret?: string | undefined;\n mcpServerId?: string | undefined;\n connectionId?: string | undefined;\n },\n): CreateEventSourceRequest {\n const name = input.name.trim();\n const adapter = WEBHOOK_ADAPTER_OF[input.choice];\n if (adapter) {\n const preset = isAppWebhookChoice(input.choice) ? PRESET_OF[input.choice] : undefined;\n return {\n kind: \"webhook\",\n adapter,\n name: name || eventSourceChoiceName(t, input.choice),\n visibility: input.visibility,\n ...(preset ? { format: WEBHOOK_FORMAT_PRESETS[preset] } : {}),\n ...(adapter !== \"standard\" && input.signingSecret\n ? { signingSecret: input.signingSecret.trim() }\n : {}),\n };\n }\n if (input.choice === \"mcp\") {\n return {\n kind: \"mcp\",\n serverId: input.mcpServerId ?? \"\",\n ...(input.connectionId ? { connectionId: input.connectionId } : {}),\n ...(name ? { name } : {}),\n };\n }\n if (input.choice === \"gmail\") {\n return {\n kind: \"gmail\",\n ...(input.connectionId ? { connectionId: input.connectionId } : {}),\n ...(name ? { name } : {}),\n };\n }\n if (input.choice === \"workspace\") return { kind: \"workspace\", ...(name ? { name } : {}) };\n return { kind: input.choice as \"github\" | \"slack\", ...(name ? { name } : {}) };\n}\n\n/* ----------------------------------------------------------------------------\n Deliveries and events.\n -------------------------------------------------------------------------- */\n\n/** What became of a delivery, as its badge. */\nexport function eventDeliveryStatusBadge(\n t: OpenGeniText,\n status: EventDelivery[\"status\"],\n): { status: ProductStatus; label: string } {\n switch (status) {\n case \"accepted\":\n return { status: \"succeeded\", label: t(\"automations.delivery.accepted\") };\n case \"ignored\":\n return { status: \"off\", label: t(\"automations.delivery.ignored\") };\n case \"rejected\":\n return { status: \"failed\", label: t(\"automations.delivery.rejected\") };\n case \"failed\":\n return { status: \"failed\", label: t(\"automations.delivery.failed\") };\n }\n}\n\n/** \"3 events\", \"No events\", \"1 event\". */\nexport function deliveryEventsLabel(\n t: OpenGeniText,\n delivery: Pick<EventDelivery, \"eventIds\">,\n): string {\n const count = delivery.eventIds.length;\n if (count === 0) return t(\"automations.delivery.noEvents\");\n return t(\"automations.delivery.events\", { count });\n}\n\n/**\n * What a delivery became, as its row's title: \"pull_request.opened\",\n * \"issues.opened and issue_comment.created\", \"push and 2 more\", or the count\n * when the server does not say which types.\n */\nexport function deliveryTitle(\n t: OpenGeniText,\n delivery: Pick<EventDelivery, \"eventIds\"> & { eventTypes?: readonly string[] | undefined },\n): string {\n const types = delivery.eventTypes ?? [];\n if (types.length === 0) return deliveryEventsLabel(t, delivery);\n const [first, second] = types as [string, ...string[]];\n if (types.length === 1) return eventTypeLabel(t, first);\n if (types.length === 2)\n return t(\"automations.delivery.titleTwo\", {\n first: eventTypeLabel(t, first),\n second: eventTypeLabel(t, second!),\n });\n return t(\"automations.eventTypes.firstAndMore\", {\n first: eventTypeLabel(t, first),\n count: types.length - 1,\n });\n}\n\n/** \"1.2 KB\", with the host locale's decimal separator. */\nexport function byteSizeLabel(t: OpenGeniText, bytes: number): string {\n const number = (value: number, digits: number) =>\n new Intl.NumberFormat(t.locale, {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n }).format(value);\n if (bytes < 1024) return t(\"automations.bytes.bytes\", { size: number(bytes, 0) });\n if (bytes < 1024 * 1024)\n return t(\"automations.bytes.kilobytes\", {\n size: number(bytes / 1024, bytes < 10 * 1024 ? 1 : 0),\n });\n return t(\"automations.bytes.megabytes\", { size: number(bytes / (1024 * 1024), 1) });\n}\n\n/** Who caused an event, in words; null when unknown. */\nexport function eventActorLabel(t: OpenGeniText, actor: EventActor): string | null {\n if (actor.kind === \"opengeni\")\n return actor.name\n ? t(\"automations.actor.selfNamed\", { name: actor.name })\n : t(\"automations.actor.self\");\n if (actor.name)\n return actor.kind === \"bot\"\n ? t(\"automations.actor.botNamed\", { name: actor.name })\n : actor.name;\n return actor.kind === \"bot\" ? t(\"automations.actor.bot\") : null;\n}\n","/**\n * A drop-in Automations panel: the automations of a workspace or of one chat,\n * with create and edit, on and off, Run now, delete and recent runs. The host\n * hands it its OpenGeniClient; the panel reads and writes through it and keeps\n * its own navigation (the list, one automation, the form), so it fits a\n * dialog, a sheet or a page.\n *\n * Runs inherit their access: an automation in a chat runs with that chat's\n * settings, and one that starts a new chat each run follows the workspace's\n * defaults with its owner's access, like a new chat.\n *\n * New automations can start from a template: the host's own, and the ones\n * people saved in the workspace. A template only fills the form.\n */\nimport { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport {\n BookmarkPlusIcon,\n CalendarClockIcon,\n ChevronLeftIcon,\n PlayIcon,\n PlusIcon,\n ZapIcon,\n} from \"lucide-react\";\n\nimport type {\n EventSource,\n OpenGeniClient,\n ReadyEventSource,\n ScheduledTask,\n ScheduledTaskRun,\n WorkspaceAutomationTemplate,\n} from \"@opengeni/sdk\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { usePortalTokenSource } from \"../../lib/use-portal-token-style\";\nimport { apiErrorFacts } from \"../../ui/api-error\";\nimport { Button } from \"../../ui/button\";\nimport { ConfirmDialog } from \"../../ui/confirm-dialog\";\nimport { DropdownMenuItem } from \"../../ui/dropdown-menu\";\nimport { EmptyState } from \"../../ui/empty-state\";\nimport { ErrorMessage } from \"../../ui/error-message\";\nimport { ListRow, ListRowSkeleton, RowList } from \"../../ui/list-row\";\nimport { LogoTile } from \"../../ui/logo-tile\";\nimport { StandaloneOverlayRoot } from \"../../ui/portal-container\";\nimport { RelativeTime, useMinuteNow } from \"../../ui/relative-time\";\nimport { Skeleton } from \"../../ui/skeleton\";\nimport { StatusBadge, type ProductStatus } from \"../../ui/status-badge\";\nimport { Switch } from \"../../ui/switch\";\nimport { TooltipProvider } from \"../../ui/tooltip\";\nimport { formatRunTime } from \"../../ui/cadence-picker\";\nimport { cn } from \"../../lib/cn\";\nimport { AutomationForm, errorSentence } from \"./automation-form\";\nimport {\n automationCreateRequest,\n automationDraftFrom,\n automationNextRun,\n automationRunErrorText,\n automationRunEventsLabel,\n automationRunStatusLabel,\n automationRunTriggerLabel,\n automationUpdateRequest,\n automationWhenSentence,\n automationWhenWords,\n hasEventTriggers,\n isAgentAutomation,\n isFinishedOnce,\n newAutomationDraft,\n sortAutomations,\n viewerTimeZone,\n type AutomationDraft,\n} from \"./automation-model\";\nimport {\n automationDraftFromTemplate,\n automationTemplateFromTask,\n automationTemplateOfSaved,\n automationTemplatesFor,\n type AutomationTemplate,\n} from \"./automation-template-model\";\nimport { AutomationTemplateDialog, AutomationTemplateList } from \"./automation-template-parts\";\nimport { useEventSourceStandIns, type AutomationEventServer } from \"./event-source-stand-ins\";\nimport type { EventSourceLogoResolver } from \"./event-source-tile\";\nimport { EventTriggerSummary } from \"./event-trigger-summary\";\n\nexport interface AutomationsPanelProps {\n client: OpenGeniClient;\n workspaceId: string;\n /**\n * Scope it to one chat: that chat's automations, and new ones continue it.\n * Without it: the workspace's automations, and new ones start a new chat\n * each run.\n */\n sessionId?: string | undefined;\n /** Null omits the heading when the host already supplies one. */\n title?: string | null | undefined;\n /** Offer event triggers. Default: whenever this server runs them. */\n eventTriggers?: boolean | undefined;\n /**\n * MCP servers to offer by name, such as the host's own. Servers the person\n * is signed in to that offer events, and their Gmail accounts, are offered\n * without this. The person's source for one is added the first time they\n * pick it.\n */\n eventServers?: readonly AutomationEventServer[] | undefined;\n /**\n * Offer this workspace's own events, such as a meeting's transcript being\n * ready. The person's source for them is added the first time they pick it.\n * Default false.\n */\n workspaceEvents?: boolean | undefined;\n /** Arguments new MCP subscriptions start with, such as `{ projectId }`. */\n argumentDefaults?: Readonly<Record<string, unknown>> | undefined;\n /**\n * Templates a new automation can start from, such as some of\n * `builtinAutomationTemplates(t)` or the host's own. Default none.\n */\n templates?: readonly AutomationTemplate[] | undefined;\n /**\n * Offer the templates people saved in this workspace, and saving an\n * automation as one. Default true.\n */\n workspaceTemplates?: boolean | undefined;\n /** Brand logos for event sources, from the host's connector catalog. */\n sourceLogo?: EventSourceLogoResolver | undefined;\n /** Opens the chat a run happened in. Without it, runs don't link anywhere. */\n onOpenSession?: ((sessionId: string) => void) | undefined;\n className?: string | undefined;\n}\n\ntype View =\n | { kind: \"list\" }\n | { kind: \"detail\"; taskId: string }\n /** Pick a template or start from scratch. */\n | { kind: \"new\" }\n | { kind: \"form\"; taskId: string | null; template?: AutomationTemplate | undefined };\n\ntype Notice = { tone: \"info\" | \"error\"; text: string } | null;\n\ntype TemplateDialog =\n | { mode: \"save\"; task: ScheduledTask }\n | { mode: \"rename\"; template: WorkspaceAutomationTemplate }\n | null;\n\nfunction newTriggerId(): string | undefined {\n return globalThis.crypto?.randomUUID?.();\n}\n\nexport function AutomationsPanel({\n client,\n workspaceId,\n sessionId,\n title: titleProp,\n eventTriggers: eventTriggersProp,\n eventServers,\n workspaceEvents = false,\n argumentDefaults,\n templates: hostTemplates,\n workspaceTemplates = true,\n sourceLogo,\n onOpenSession,\n className,\n}: AutomationsPanelProps) {\n const t = useOpenGeniText();\n const title = titleProp === undefined ? t(\"automations.panel.title\") : titleProp;\n /** The panel's root: its overlays copy its tokens, so they match it outside the host's tree. */\n const { source: root, ref: rootRef } = usePortalTokenSource<HTMLElement>();\n const now = new Date(useMinuteNow());\n const [view, setView] = useState<View>({ kind: \"list\" });\n const [notice, setNotice] = useState<Notice>(null);\n /** Another view; what the last action said belongs to the one it was done in. */\n const go = useCallback((next: View) => {\n setNotice(null);\n setView(next);\n }, []);\n const [busy, setBusy] = useState<ReadonlySet<string>>(() => new Set());\n const [deleting, setDeleting] = useState<ScheduledTask | null>(null);\n /** The last Run now, so the automation's recent runs can look for the run it started. */\n const [started, setStarted] = useState<{ taskId: string; at: number } | null>(null);\n\n /* Automations. */\n const [tasks, setTasks] = useState<ScheduledTask[] | undefined>(undefined);\n const [loadError, setLoadError] = useState<unknown>(null);\n const [loadAttempt, setLoadAttempt] = useState(0);\n useEffect(() => {\n let live = true;\n setLoadError(null);\n client.listScheduledTasks(workspaceId, sessionId ? { sessionId } : {}).then(\n (list) => {\n if (live) setTasks(list.filter(isAgentAutomation));\n },\n (error: unknown) => {\n if (live) setLoadError(error);\n },\n );\n return () => {\n live = false;\n };\n }, [client, workspaceId, sessionId, loadAttempt]);\n const upsert = useCallback((task: ScheduledTask) => {\n setTasks((current) =>\n current?.some((entry) => entry.id === task.id)\n ? current.map((entry) => (entry.id === task.id ? task : entry))\n : [...(current ?? []), task],\n );\n }, []);\n\n /* Event sources: whether events run here, and what triggers can point at. */\n const [sources, setSources] = useState<EventSource[] | undefined>(undefined);\n const [eventsRun, setEventsRun] = useState<boolean | undefined>(undefined);\n const [sourcesAttempt, setSourcesAttempt] = useState(0);\n useEffect(() => {\n if (eventTriggersProp === false) return;\n let live = true;\n client.listEventSources(workspaceId).then(\n (list) => {\n if (!live) return;\n setSources(list);\n setEventsRun(true);\n },\n (error: unknown) => {\n if (!live) return;\n // This server doesn't run event triggers; anything else still offers them.\n setEventsRun(apiErrorFacts(error).status !== 404);\n setSources((current) => current ?? []);\n },\n );\n return () => {\n live = false;\n };\n }, [client, workspaceId, eventTriggersProp, sourcesAttempt]);\n const eventTriggers = eventTriggersProp !== false && eventsRun === true;\n\n // What the person can use without setting it up; it can take a moment to learn.\n const [readySources, setReadySources] = useState<ReadyEventSource[] | undefined>(undefined);\n useEffect(() => {\n if (!eventTriggers) return;\n let live = true;\n client.listReadyEventSources(workspaceId).then(\n (list) => {\n if (live) setReadySources(list);\n },\n () => {\n // Without the list, the sources the person has are still offered.\n if (live) setReadySources((current) => current ?? []);\n },\n );\n return () => {\n live = false;\n };\n }, [client, workspaceId, eventTriggers, sourcesAttempt]);\n\n // Sources that need no setting up stand in for the person's own until picked.\n const standIns = useEventSourceStandIns({\n client,\n workspaceId,\n sources,\n readySources,\n eventServers,\n workspaceEvents,\n });\n const formSources = standIns.sources;\n\n /* Templates: the host's own, then the ones saved in this workspace. */\n const [savedTemplates, setSavedTemplates] = useState<WorkspaceAutomationTemplate[] | undefined>(\n undefined,\n );\n /** This server keeps workspace templates; false on one that doesn't. */\n const [templatesKept, setTemplatesKept] = useState(false);\n useEffect(() => {\n if (!workspaceTemplates) return;\n let live = true;\n client.listAutomationTemplates(workspaceId).then(\n (list) => {\n if (!live) return;\n setSavedTemplates(list);\n setTemplatesKept(true);\n },\n (error: unknown) => {\n if (!live) return;\n // An older server has none; anything else still lets people save one.\n setTemplatesKept(apiErrorFacts(error).status !== 404);\n setSavedTemplates((current) => current ?? []);\n },\n );\n return () => {\n live = false;\n };\n }, [client, workspaceId, workspaceTemplates]);\n const offerSaved = workspaceTemplates && templatesKept;\n const fits = { eventTriggers, workspaceEvents };\n const offered = automationTemplatesFor(hostTemplates ?? [], fits);\n const savedOffered = offerSaved\n ? automationTemplatesFor((savedTemplates ?? []).map(automationTemplateOfSaved), fits)\n : [];\n const hasTemplates = offered.length > 0 || savedOffered.length > 0;\n const startNew = () => go(hasTemplates ? { kind: \"new\" } : { kind: \"form\", taskId: null });\n const [templateDialog, setTemplateDialog] = useState<TemplateDialog>(null);\n const [deletingTemplate, setDeletingTemplate] = useState<WorkspaceAutomationTemplate | null>(\n null,\n );\n const saveTemplate = async (values: { name: string; description: string }) => {\n if (!templateDialog) return;\n if (templateDialog.mode === \"save\") {\n const created = await client.createAutomationTemplate(\n workspaceId,\n automationTemplateFromTask(t, templateDialog.task, sources ?? [], {\n ...values,\n now: new Date(),\n }),\n );\n setSavedTemplates((current) => [...(current ?? []), created]);\n setNotice({\n tone: \"info\",\n text: t(\"automations.panel.templateSaved\", { name: created.name }),\n });\n return;\n }\n const renamed = await client.updateAutomationTemplate(\n workspaceId,\n templateDialog.template.id,\n values,\n );\n setSavedTemplates((current) =>\n current?.map((entry) => (entry.id === renamed.id ? renamed : entry)),\n );\n };\n const removeTemplate = async (template: WorkspaceAutomationTemplate): Promise<boolean> => {\n try {\n await client.deleteAutomationTemplate(workspaceId, template.id);\n setSavedTemplates((current) => current?.filter((entry) => entry.id !== template.id));\n return true;\n } catch (error) {\n setNotice({\n tone: \"error\",\n text: t(\"automations.panel.actionFailed\", { reason: errorSentence(error) }).trim(),\n });\n return false;\n }\n };\n\n /* Actions. */\n const act = async (task: ScheduledTask, run: () => Promise<void>) => {\n setBusy((current) => new Set(current).add(task.id));\n setNotice(null);\n try {\n await run();\n } catch (error) {\n setNotice({\n tone: \"error\",\n text: t(\"automations.panel.actionFailed\", { reason: errorSentence(error) }).trim(),\n });\n } finally {\n setBusy((current) => {\n const next = new Set(current);\n next.delete(task.id);\n return next;\n });\n }\n };\n const setOn = (task: ScheduledTask, on: boolean) =>\n act(task, async () =>\n upsert(\n on\n ? await client.resumeScheduledTask(workspaceId, task.id)\n : await client.pauseScheduledTask(workspaceId, task.id),\n ),\n );\n const runNow = (task: ScheduledTask) =>\n act(task, async () => {\n const triggerId = newTriggerId();\n upsert(\n await client.triggerScheduledTask(workspaceId, task.id, triggerId ? { triggerId } : {}),\n );\n setStarted({ taskId: task.id, at: Date.now() });\n setNotice({ tone: \"info\", text: t(\"automations.panel.runStarted\", { name: task.name }) });\n });\n const remove = async (task: ScheduledTask): Promise<boolean> => {\n try {\n await client.deleteScheduledTask(workspaceId, task.id);\n setTasks((current) => current?.filter((entry) => entry.id !== task.id));\n go({ kind: \"list\" });\n return true;\n } catch (error) {\n setNotice({\n tone: \"error\",\n text: t(\"automations.panel.actionFailed\", { reason: errorSentence(error) }).trim(),\n });\n return false;\n }\n };\n const save = async (task: ScheduledTask | null, draft: AutomationDraft) => {\n const ready = { ...draft, events: await standIns.realEvents(draft.events) };\n const saved = task\n ? await client.updateScheduledTask(workspaceId, task.id, {\n expectedExecutionDigest: task.executionDigest,\n ...automationUpdateRequest(t, automationDraftFrom(task), ready, new Date()),\n })\n : await client.createScheduledTask(\n workspaceId,\n automationCreateRequest(\n t,\n ready,\n sessionId ? { kind: \"chat\", sessionId } : { kind: \"new_chat\" },\n new Date(),\n ),\n );\n upsert(saved);\n if (standIns.usesStandIn(draft.events)) setSourcesAttempt((value) => value + 1);\n go({ kind: \"detail\", taskId: saved.id });\n };\n\n const menu = (task: ScheduledTask) => (\n <>\n <DropdownMenuItem onSelect={() => void runNow(task)}>\n {t(\"automations.panel.runNow\")}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => go({ kind: \"form\", taskId: task.id })}>\n {t(\"automations.panel.edit\")}\n </DropdownMenuItem>\n {offerSaved ? (\n <DropdownMenuItem onSelect={() => setTemplateDialog({ mode: \"save\", task })}>\n {t(\"automations.panel.saveAsTemplate\")}\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem variant=\"destructive\" onSelect={() => setDeleting(task)}>\n {t(\"automations.panel.delete\")}\n </DropdownMenuItem>\n </>\n );\n const templateMenu = (template: AutomationTemplate) => {\n const entry = savedTemplates?.find((candidate) => candidate.id === template.id);\n if (entry?.viewerAccess !== \"manage\") return undefined;\n return (\n <>\n <DropdownMenuItem onSelect={() => setTemplateDialog({ mode: \"rename\", template: entry })}>\n {t(\"automations.panel.rename\")}\n </DropdownMenuItem>\n <DropdownMenuItem variant=\"destructive\" onSelect={() => setDeletingTemplate(entry)}>\n {t(\"automations.panel.delete\")}\n </DropdownMenuItem>\n </>\n );\n };\n const viewed =\n view.kind === \"detail\" || view.kind === \"form\"\n ? (tasks?.find((task) => task.id === view.taskId) ?? null)\n : null;\n // A live region that stays mounted in the list and on an automation's page,\n // so what an action says is announced where it was done.\n const noticeLine = (\n <p\n role=\"status\"\n className={cn(\n \"m-0 text-sm leading-5 empty:hidden\",\n notice?.tone === \"error\" ? \"text-danger\" : \"text-fg-muted\",\n )}\n >\n {notice?.text}\n </p>\n );\n\n let body: ReactNode;\n if (view.kind === \"new\") {\n body = (\n <div className=\"flex min-w-0 flex-col gap-4\">\n <BackButton onClick={() => go({ kind: \"list\" })} />\n <h3 className=\"m-0 text-base leading-6 font-semibold text-fg\">\n {t(\"automations.form.newTitle\")}\n </h3>\n {noticeLine}\n <RowList label={t(\"automations.panel.fromScratch\")} variant=\"catalog\">\n <ListRow\n leading={<LogoTile name={t(\"automations.panel.fromScratch\")} icon={<PlusIcon />} />}\n title={t(\"automations.panel.fromScratch\")}\n description={t(\"automations.panel.fromScratchDescription\")}\n onOpen={() => go({ kind: \"form\", taskId: null })}\n />\n </RowList>\n {offered.length > 0 ? (\n <TemplateSection heading={t(\"automations.panel.templates\")}>\n <AutomationTemplateList\n label={t(\"automations.panel.templates\")}\n templates={offered}\n sourceLogo={sourceLogo}\n onUse={(template) => go({ kind: \"form\", taskId: null, template })}\n now={now}\n />\n </TemplateSection>\n ) : null}\n {savedOffered.length > 0 ? (\n <TemplateSection heading={t(\"automations.panel.savedTemplates\")}>\n <AutomationTemplateList\n label={t(\"automations.panel.savedTemplates\")}\n templates={savedOffered}\n sourceLogo={sourceLogo}\n onUse={(template) => go({ kind: \"form\", taskId: null, template })}\n menu={templateMenu}\n menuLabel={(template) => t(\"automations.panel.templateMenu\", { name: template.name })}\n now={now}\n />\n </TemplateSection>\n ) : null}\n </div>\n );\n } else if (view.kind === \"form\") {\n const task = view.taskId ? viewed : null;\n const template = task ? undefined : view.template;\n body = (\n <div className=\"flex min-w-0 flex-col gap-4\">\n <BackButton\n onClick={() =>\n go(\n task\n ? { kind: \"detail\", taskId: task.id }\n : hasTemplates\n ? { kind: \"new\" }\n : { kind: \"list\" },\n )\n }\n />\n <h3 className=\"m-0 text-base leading-6 font-semibold text-fg\">\n {task ? t(\"automations.form.editTitle\") : t(\"automations.form.newTitle\")}\n </h3>\n <AutomationForm\n key={task?.id ?? `new:${template?.id ?? \"\"}`}\n initial={\n task\n ? automationDraftFrom(task)\n : template\n ? automationDraftFromTemplate(template, { sources: formSources })\n : newAutomationDraft(eventTriggers ? { cadence: null } : {})\n }\n editing={Boolean(task)}\n destination={\n task\n ? task.runMode === \"new_session_per_run\"\n ? \"new_chat\"\n : \"chat\"\n : sessionId\n ? \"chat\"\n : \"new_chat\"\n }\n eventTriggers={eventTriggers || hasEventTriggers(task ?? {})}\n sources={formSources}\n loadEventTypes={standIns.loadEventTypes}\n sourceLogo={sourceLogo}\n argumentDefaults={argumentDefaults}\n onSubmit={(draft) => save(task, draft)}\n onCancel={() => go(task ? { kind: \"detail\", taskId: task.id } : { kind: \"list\" })}\n now={now}\n />\n </div>\n );\n } else if (view.kind === \"detail\" && viewed) {\n body = (\n <AutomationDetail\n client={client}\n workspaceId={workspaceId}\n task={viewed}\n sessionId={sessionId}\n sources={sources}\n sourceLogo={sourceLogo}\n onOpenSession={onOpenSession}\n busy={busy.has(viewed.id)}\n startedAt={started?.taskId === viewed.id ? started.at : null}\n now={now}\n onBack={() => go({ kind: \"list\" })}\n onSetOn={(on) => void setOn(viewed, on)}\n onRunNow={() => void runNow(viewed)}\n onEdit={() => go({ kind: \"form\", taskId: viewed.id })}\n onSaveAsTemplate={\n offerSaved ? () => setTemplateDialog({ mode: \"save\", task: viewed }) : undefined\n }\n onDelete={() => setDeleting(viewed)}\n notice={noticeLine}\n />\n );\n } else if (loadError && !tasks) {\n body = (\n <ErrorMessage\n variant=\"block\"\n align=\"center\"\n title={t(\"automations.panel.loadFailed\")}\n action={\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setLoadAttempt((value) => value + 1)}\n >\n {t(\"automations.panel.tryAgain\")}\n </Button>\n }\n >\n {t(\"automations.panel.loadFailedBody\")}\n </ErrorMessage>\n );\n } else if (!tasks) {\n body = (\n <RowList label={t(\"automations.panel.list\")} busy flush>\n <ListRowSkeleton count={3} />\n </RowList>\n );\n } else if (tasks.length === 0) {\n body = (\n <EmptyState\n icon={eventTriggers ? <ZapIcon /> : <CalendarClockIcon />}\n title={sessionId ? t(\"automations.panel.emptyChat\") : t(\"automations.panel.empty\")}\n description={\n sessionId ? t(\"automations.panel.descriptionChat\") : t(\"automations.panel.description\")\n }\n action={\n <Button type=\"button\" size=\"sm\" onClick={startNew}>\n <PlusIcon aria-hidden=\"true\" />\n {t(\"automations.panel.new\")}\n </Button>\n }\n />\n );\n } else {\n body = (\n <RowList label={t(\"automations.panel.list\")} flush>\n {sortAutomations(tasks, now).map((task) => {\n const next = automationNextRun(task, now);\n const when = automationWhenWords(t, task, sources ?? [], now);\n const nextWords = next\n ? t(\"automations.panel.next\", {\n time: formatRunTime(next, { timeZone: viewerTimeZone(), now, text: t }),\n })\n : null;\n return (\n <ListRow\n key={task.id}\n leading={<AutomationTile task={task} />}\n title={task.name}\n // One line that truncates once: when it runs, then the next run.\n // A phone-width list keeps only the next run, which says the most.\n description={\n nextWords ? (\n <>\n <span className=\"@max-[479px]/list:hidden\">\n {when}\n <span aria-hidden=\"true\"> · </span>\n {nextWords}\n </span>\n <span className=\"hidden @max-[479px]/list:inline\">{nextWords}</span>\n </>\n ) : (\n when\n )\n }\n status={showsStatus(task) ? <AutomationStatus task={task} /> : undefined}\n control={\n isFinishedOnce(task) ? undefined : (\n <Switch\n size=\"sm\"\n checked={task.status === \"active\"}\n pending={busy.has(task.id)}\n onCheckedChange={(on) => void setOn(task, on)}\n aria-label={t(\"automations.panel.toggle\", { name: task.name })}\n />\n )\n }\n menu={menu(task)}\n menuLabel={t(\"automations.panel.menu\", { name: task.name })}\n onOpen={() => go({ kind: \"detail\", taskId: task.id })}\n />\n );\n })}\n </RowList>\n );\n }\n\n return (\n <TooltipProvider>\n <section\n ref={rootRef}\n aria-label={title ?? t(\"automations.panel.title\")}\n className={cn(\"og-root og-automations flex min-w-0 flex-col gap-4\", className)}\n >\n <StandaloneOverlayRoot source={root}>\n {view.kind === \"list\" && (title !== null || (tasks?.length ?? 0) > 0) ? (\n <div className=\"flex min-w-0 flex-wrap items-start justify-between gap-x-4 gap-y-2\">\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n {title !== null ? (\n <h2 className=\"m-0 text-base leading-6 font-semibold text-fg\">{title}</h2>\n ) : null}\n {(tasks?.length ?? 0) > 0 ? (\n <p className=\"m-0 text-sm leading-5 text-fg-muted\">\n {sessionId\n ? t(\"automations.panel.descriptionChat\")\n : t(\"automations.panel.description\")}\n </p>\n ) : null}\n </div>\n {(tasks?.length ?? 0) > 0 ? (\n <Button type=\"button\" size=\"sm\" onClick={startNew} className=\"pointer-coarse:h-11\">\n <PlusIcon aria-hidden=\"true\" />\n {t(\"automations.panel.new\")}\n </Button>\n ) : null}\n </div>\n ) : null}\n {view.kind === \"list\" ? noticeLine : null}\n {body}\n <ConfirmDialog\n open={deleting !== null}\n onOpenChange={(open) => {\n if (!open) setDeleting(null);\n }}\n title={t(\"automations.panel.deleteTitle\", { name: deleting?.name ?? \"\" })}\n description={t(\"automations.panel.deleteBody\")}\n confirmLabel={t(\"automations.panel.deleteConfirm\")}\n pendingLabel={t(\"automations.panel.deleting\")}\n cancelLabel={t(\"automations.form.cancel\")}\n onConfirm={() => (deleting ? remove(deleting) : true)}\n />\n <ConfirmDialog\n open={deletingTemplate !== null}\n onOpenChange={(open) => {\n if (!open) setDeletingTemplate(null);\n }}\n title={t(\"automations.panel.templateDeleteTitle\", {\n name: deletingTemplate?.name ?? \"\",\n })}\n description={t(\"automations.panel.templateDeleteBody\")}\n confirmLabel={t(\"automations.panel.templateDeleteConfirm\")}\n pendingLabel={t(\"automations.panel.deleting\")}\n cancelLabel={t(\"automations.form.cancel\")}\n onConfirm={() => (deletingTemplate ? removeTemplate(deletingTemplate) : true)}\n />\n <AutomationTemplateDialog\n open={templateDialog !== null}\n onOpenChange={(open) => {\n if (!open) setTemplateDialog(null);\n }}\n mode={templateDialog?.mode ?? \"save\"}\n initial={\n templateDialog?.mode === \"rename\"\n ? {\n name: templateDialog.template.name,\n description: templateDialog.template.description,\n }\n : { name: templateDialog?.task.name ?? \"\", description: \"\" }\n }\n onSubmit={saveTemplate}\n />\n </StandaloneOverlayRoot>\n </section>\n </TooltipProvider>\n );\n}\n\nfunction BackButton({ onClick }: { onClick: () => void }) {\n const t = useOpenGeniText();\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClick}\n className=\"-ml-2 self-start text-fg-muted pointer-coarse:h-11\"\n >\n <ChevronLeftIcon aria-hidden=\"true\" />\n {t(\"automations.panel.back\")}\n </Button>\n );\n}\n\n/** A titled group on the New automation page. */\nfunction TemplateSection({ heading, children }: { heading: string; children: ReactNode }) {\n return (\n <section className=\"flex min-w-0 flex-col gap-1.5\">\n <h4 className=\"m-0 text-xs leading-4.5 font-medium text-fg-muted\">{heading}</h4>\n {children}\n </section>\n );\n}\n\nfunction AutomationTile({ task }: { task: ScheduledTask }) {\n return (\n <LogoTile\n name={task.name}\n icon={hasEventTriggers(task) ? <ZapIcon /> : <CalendarClockIcon />}\n />\n );\n}\n\n/** Paused or finished: the states a row calls out. */\nfunction showsStatus(task: ScheduledTask): boolean {\n return isFinishedOnce(task) || task.status === \"paused\";\n}\n\n/** Paused or Finished; nothing while it is on. */\nfunction AutomationStatus({ task }: { task: ScheduledTask }) {\n const t = useOpenGeniText();\n if (isFinishedOnce(task))\n return (\n <StatusBadge variant=\"dot\" status=\"succeeded\">\n {t(\"automations.panel.finished\")}\n </StatusBadge>\n );\n if (task.status === \"paused\")\n return (\n <StatusBadge variant=\"dot\" status=\"paused\">\n {t(\"automations.panel.paused\")}\n </StatusBadge>\n );\n return null;\n}\n\nfunction AutomationDetail({\n client,\n workspaceId,\n task,\n sessionId,\n sources,\n sourceLogo,\n onOpenSession,\n busy,\n startedAt,\n now,\n onBack,\n onSetOn,\n onRunNow,\n onEdit,\n onSaveAsTemplate,\n onDelete,\n notice,\n}: {\n client: OpenGeniClient;\n workspaceId: string;\n task: ScheduledTask;\n sessionId: string | undefined;\n sources: EventSource[] | undefined;\n sourceLogo: EventSourceLogoResolver | undefined;\n onOpenSession: ((sessionId: string) => void) | undefined;\n busy: boolean;\n /** When Run now last started this automation here. */\n startedAt: number | null;\n now: Date;\n onBack: () => void;\n onSetOn: (on: boolean) => void;\n onRunNow: () => void;\n onEdit: () => void;\n /** Offered where the workspace keeps templates. */\n onSaveAsTemplate: (() => void) | undefined;\n onDelete: () => void;\n /** What the last action here said. */\n notice: ReactNode;\n}) {\n const t = useOpenGeniText();\n const where =\n task.runMode === \"new_session_per_run\"\n ? t(\"automations.panel.whereNewChat\")\n : sessionId && task.targetSessionId === sessionId\n ? t(\"automations.panel.whereChat\")\n : t(\"automations.panel.whereOtherChat\");\n return (\n <div className=\"flex min-w-0 flex-col gap-5\">\n <BackButton onClick={onBack} />\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <AutomationTile task={task} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <h3 className=\"m-0 text-base leading-6 font-semibold break-words text-fg\">\n {task.name}\n </h3>\n {showsStatus(task) ? <AutomationStatus task={task} /> : null}\n </div>\n {isFinishedOnce(task) ? null : (\n <Switch\n checked={task.status === \"active\"}\n pending={busy}\n onCheckedChange={onSetOn}\n aria-label={t(\"automations.panel.toggle\", { name: task.name })}\n className=\"shrink-0\"\n />\n )}\n </div>\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onRunNow} disabled={busy}>\n <PlayIcon aria-hidden=\"true\" />\n {t(\"automations.panel.runNow\")}\n </Button>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onEdit}>\n {t(\"automations.panel.edit\")}\n </Button>\n {onSaveAsTemplate ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onSaveAsTemplate}>\n <BookmarkPlusIcon aria-hidden=\"true\" />\n {t(\"automations.panel.saveAsTemplate\")}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onDelete}\n className=\"ml-auto text-danger\"\n >\n {t(\"automations.panel.delete\")}\n </Button>\n </div>\n {notice}\n </div>\n <dl className=\"m-0 flex min-w-0 flex-col gap-4\">\n <DetailItem label={t(\"automations.panel.when\")}>\n <p className=\"m-0\">{automationWhenSentence(t, task, now)}</p>\n {task.events && task.events.triggers.length > 0 ? (\n <EventTriggerSummary\n triggers={task.events.triggers}\n sources={sources}\n sourceLogo={sourceLogo}\n />\n ) : null}\n </DetailItem>\n <DetailItem label={t(\"automations.panel.where\")}>\n <p className=\"m-0\">{where}</p>\n </DetailItem>\n <DetailItem label={t(\"automations.panel.instructions\")}>\n <p className=\"m-0 line-clamp-6 break-words whitespace-pre-wrap\">\n {task.agentConfig.prompt}\n </p>\n </DetailItem>\n </dl>\n <AutomationRuns\n client={client}\n workspaceId={workspaceId}\n task={task}\n startedAt={startedAt}\n onOpenSession={onOpenSession}\n />\n </div>\n );\n}\n\nfunction DetailItem({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <dt className=\"text-xs leading-4.5 font-medium text-fg-muted\">{label}</dt>\n <dd className=\"m-0 flex min-w-0 flex-col gap-2 text-sm leading-5 text-fg\">{children}</dd>\n </div>\n );\n}\n\nconst RUN_STATUS: Record<ScheduledTaskRun[\"status\"], ProductStatus> = {\n queued: \"queued\",\n dispatched: \"running\",\n succeeded: \"succeeded\",\n skipped: \"queued\",\n failed: \"failed\",\n};\n\n/** Runs the list shows at once. */\nconst RUNS_SHOWN = 10;\n/** After Run now, the list looks for the new run this often, for this many reads at most. */\nconst RUN_STARTED_READ_MS = 1_500;\nconst RUN_STARTED_READS = 20;\n/** While a run waits in the queue, the list reads its status this often. */\nconst RUN_QUEUED_READ_MS = 5_000;\n\nfunction AutomationRuns({\n client,\n workspaceId,\n task,\n startedAt,\n onOpenSession,\n}: {\n client: OpenGeniClient;\n workspaceId: string;\n task: ScheduledTask;\n startedAt: number | null;\n onOpenSession: ((sessionId: string) => void) | undefined;\n}) {\n const t = useOpenGeniText();\n const [runs, setRuns] = useState<ScheduledTaskRun[] | undefined>(undefined);\n const [failed, setFailed] = useState(false);\n // Every settled read, so the next one is scheduled from it.\n const [reads, setReads] = useState(0);\n const [again, setAgain] = useState(0);\n const shown = useRef<ScheduledTaskRun[] | undefined>(undefined);\n useEffect(() => {\n shown.current = runs;\n }, [runs]);\n // Run now starts the run in the background, so the list looks for it until\n // a run that wasn't shown when it was pressed appears. Opened after the\n // press, the list can't tell the new run apart and looks for the rest of the\n // window.\n const [looking, setLooking] = useState<{\n known: ReadonlySet<string> | null;\n reads: number;\n } | null>(null);\n useEffect(() => {\n if (startedAt === null) return;\n const left = RUN_STARTED_READS - Math.floor((Date.now() - startedAt) / RUN_STARTED_READ_MS);\n if (left <= 0) return;\n const known = shown.current;\n setLooking({ known: known ? new Set(known.map((run) => run.id)) : null, reads: left });\n }, [startedAt]);\n // Read again whenever the automation changes, after Run now, and on schedule.\n const revision = task.updatedAt;\n useEffect(() => {\n let live = true;\n setFailed(false);\n client.listScheduledTaskRuns(workspaceId, task.id, { limit: RUNS_SHOWN }).then(\n (list) => {\n if (!live) return;\n setRuns(list);\n setLooking((current) =>\n !current ||\n current.reads <= 1 ||\n (current.known && list.some((run) => !current.known?.has(run.id)))\n ? null\n : { ...current, reads: current.reads - 1 },\n );\n setReads((count) => count + 1);\n },\n () => {\n if (!live) return;\n setFailed(true);\n setReads((count) => count + 1);\n },\n );\n return () => {\n live = false;\n };\n }, [client, workspaceId, task.id, revision, startedAt, again]);\n const queued = runs?.some((run) => run.status === \"queued\") ?? false;\n useEffect(() => {\n if (reads === 0 || (!looking && !queued)) return;\n const timer = setTimeout(\n () => setAgain((count) => count + 1),\n looking ? RUN_STARTED_READ_MS : RUN_QUEUED_READ_MS,\n );\n return () => clearTimeout(timer);\n }, [reads, looking, queued]);\n const headingId = `${task.id}-runs`;\n return (\n <section aria-labelledby={headingId} className=\"flex min-w-0 flex-col gap-2\">\n <h4 id={headingId} className=\"m-0 text-xs leading-4.5 font-medium text-fg-muted\">\n {t(\"automations.panel.runs\")}\n </h4>\n {failed && !runs ? (\n <p className=\"m-0 text-sm leading-5 text-fg-muted\">{t(\"automations.panel.runsFailed\")}</p>\n ) : !runs ? (\n <div className=\"flex flex-col gap-2\" aria-busy=\"true\">\n <Skeleton className=\"h-5 w-3/4\" />\n <Skeleton className=\"h-5 w-2/3\" />\n </div>\n ) : runs.length === 0 ? (\n <p className=\"m-0 text-sm leading-5 text-fg-muted\">{t(\"automations.panel.runsEmpty\")}</p>\n ) : (\n <ul className=\"m-0 flex min-w-0 list-none flex-col p-0\">\n {runs.map((run) => {\n const cause =\n run.triggerType === \"event\"\n ? (automationRunEventsLabel(t, run) ??\n automationRunTriggerLabel(t, run.triggerType))\n : automationRunTriggerLabel(t, run.triggerType);\n const reason =\n (run.status === \"failed\" || run.status === \"skipped\") && run.error\n ? automationRunErrorText(t, run.error)\n : null;\n return (\n <li\n key={run.id}\n className=\"flex min-w-0 items-center gap-3 border-t border-border py-2.5 first:border-t-0 first:pt-1\"\n >\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"truncate text-sm leading-5 text-fg\" title={cause}>\n {cause}\n </span>\n <span className=\"flex min-w-0 flex-wrap items-center gap-x-1.5 text-xs leading-4.5 text-fg-muted\">\n <StatusBadge\n variant=\"dot\"\n status={RUN_STATUS[run.status]}\n className={cn(\"shrink-0\", run.status === \"failed\" && \"text-danger\")}\n >\n {automationRunStatusLabel(t, run.status)}\n </StatusBadge>\n <span aria-hidden=\"true\">·</span>\n <RelativeTime date={run.firedAt} />\n </span>\n {reason ? (\n <span\n className=\"line-clamp-2 text-xs leading-4.5 break-words text-fg-muted\"\n title={reason}\n >\n {reason}\n </span>\n ) : null}\n </span>\n {run.sessionId && onOpenSession ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onOpenSession(run.sessionId!)}\n className=\"shrink-0\"\n >\n {t(\"automations.panel.openChat\")}\n </Button>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </section>\n );\n}\n","/**\n * Create or edit an automation: what the agent does, when it runs, and an\n * optional name. Where its runs go is the host's choice (`destination`), and\n * the runs inherit their access from there; nothing here narrows it.\n * Presentational: the host saves through `onSubmit`.\n */\nimport { useMemo, useState, type FormEvent } from \"react\";\nimport { CircleAlertIcon } from \"lucide-react\";\n\nimport type { EventSource, EventTypeDescriptor } from \"@opengeni/sdk\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { apiErrorFacts } from \"../../ui/api-error\";\nimport { Button } from \"../../ui/button\";\nimport { Field, TextArea, TextInput } from \"../../ui/field\";\nimport { cn } from \"../../lib/cn\";\nimport {\n deriveAutomationName,\n hasAutomationDraftIssues,\n validateAutomationDraft,\n type AutomationDraft,\n type AutomationDraftIssues,\n} from \"./automation-model\";\nimport { AutomationWhenField } from \"./automation-when-field\";\nimport { withTemplateSources } from \"./automation-template-model\";\nimport type { EventSourceChoice } from \"./event-source-model\";\nimport type { EventSourceLogoResolver } from \"./event-source-tile\";\n\nexport interface AutomationFormProps {\n /** Where it starts: a saved automation's draft, or `newAutomationDraft()`. */\n initial: AutomationDraft;\n /** It edits a saved automation: the button says Save changes. */\n editing?: boolean | undefined;\n /** Where its runs go: on in one chat, or a new chat each run. */\n destination: \"chat\" | \"new_chat\";\n /** Event triggers run here. False offers the schedule only. */\n eventTriggers: boolean;\n /** Sources the person can point triggers at; undefined while loading. */\n sources: EventSource[] | undefined;\n loadEventTypes: (sourceId: string) => Promise<EventTypeDescriptor[]>;\n sourceLogo?: EventSourceLogoResolver | undefined;\n /** Opens the host's \"Add a source\" page; offered when no source fits. */\n onAddSource?: ((choice?: EventSourceChoice) => void) | undefined;\n /** Arguments a new MCP subscription starts with, such as `{ projectId }`. */\n argumentDefaults?: Readonly<Record<string, unknown>> | undefined;\n /** Saves the draft. Throw to keep the form open; the error's message is shown. */\n onSubmit: (draft: AutomationDraft) => Promise<void>;\n onCancel: () => void;\n /** The clock for schedule previews. */\n now?: Date | undefined;\n className?: string | undefined;\n}\n\nexport function AutomationForm({\n initial,\n editing = false,\n destination,\n eventTriggers,\n sources,\n loadEventTypes,\n sourceLogo,\n onAddSource,\n argumentDefaults,\n onSubmit,\n onCancel,\n now,\n className,\n}: AutomationFormProps) {\n const t = useOpenGeniText();\n const [draft, setDraft] = useState(initial);\n // A template's triggers take the person's own sources once those load.\n const [filledFrom, setFilledFrom] = useState(sources);\n if (sources !== filledFrom) {\n setFilledFrom(sources);\n const events = withTemplateSources(draft.events, sources);\n if (events !== draft.events) setDraft({ ...draft, events });\n }\n const [issues, setIssues] = useState<AutomationDraftIssues>({});\n const [saving, setSaving] = useState(false);\n const [failure, setFailure] = useState<string | null>(null);\n const derivedName = useMemo(() => deriveAutomationName(draft.instructions), [draft.instructions]);\n const update = (patch: Partial<AutomationDraft>) => {\n setDraft((current) => ({ ...current, ...patch }));\n setIssues((current) => ({\n ...current,\n ...(\"instructions\" in patch ? { instructions: undefined } : {}),\n ...(\"name\" in patch ? { name: undefined } : {}),\n ...(\"cadence\" in patch ? { cadence: undefined, when: undefined } : {}),\n ...(\"events\" in patch ? { events: undefined, when: undefined } : {}),\n }));\n };\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n if (saving) return;\n const found = validateAutomationDraft(t, draft, sources ?? [], now ?? new Date());\n setIssues(found);\n if (hasAutomationDraftIssues(found)) return;\n setSaving(true);\n setFailure(null);\n try {\n await onSubmit(draft);\n } catch (error) {\n setFailure(errorSentence(error));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <form\n noValidate\n onSubmit={(event) => void submit(event)}\n aria-busy={saving || undefined}\n className={cn(\"flex min-w-0 flex-col gap-5\", className)}\n >\n <Field\n label={t(\"automations.form.instructions\")}\n error={issues.instructions}\n hint={\n destination === \"chat\"\n ? t(\"automations.form.instructionsHintChat\")\n : t(\"automations.form.instructionsHintNewChat\")\n }\n >\n <TextArea\n rows={4}\n value={draft.instructions}\n onChange={(event) => update({ instructions: event.target.value })}\n placeholder={t(\"automations.form.instructionsPlaceholder\")}\n disabled={saving}\n autoFocus={!editing}\n />\n </Field>\n <AutomationWhenField\n cadence={draft.cadence}\n onCadenceChange={(cadence) => update({ cadence })}\n events={draft.events}\n onEventsChange={(events) => update({ events })}\n eventTriggers={eventTriggers}\n sources={sources}\n loadEventTypes={loadEventTypes}\n eventIssues={issues.events}\n error={issues.when ?? issues.cadence}\n sourceLogo={sourceLogo}\n onAddSource={onAddSource}\n argumentDefaults={argumentDefaults}\n now={now}\n disabled={saving}\n />\n <Field label={t(\"automations.form.name\")} optional error={issues.name}>\n <TextInput\n value={draft.name}\n onChange={(event) => update({ name: event.target.value })}\n placeholder={derivedName || t(\"automations.form.namePlaceholder\")}\n disabled={saving}\n suppressAutofill\n />\n </Field>\n {failure ? (\n <p\n role=\"alert\"\n className=\"m-0 flex min-w-0 items-start gap-1.5 text-sm leading-5 text-danger\"\n >\n <CircleAlertIcon aria-hidden=\"true\" className=\"mt-0.5 size-4 shrink-0\" />\n <span className=\"min-w-0 break-words\">\n <span className=\"font-medium\">{t(\"automations.form.saveFailed\")}</span> {failure}\n </span>\n </p>\n ) : null}\n <div className=\"flex min-w-0 flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onCancel}\n disabled={saving}\n className=\"pointer-coarse:h-11\"\n >\n {t(\"automations.form.cancel\")}\n </Button>\n <Button type=\"submit\" disabled={saving} className=\"pointer-coarse:h-11\">\n {saving\n ? editing\n ? t(\"automations.form.saving\")\n : t(\"automations.form.creating\")\n : editing\n ? t(\"automations.form.save\")\n : t(\"automations.form.create\")}\n </Button>\n </div>\n </form>\n );\n}\n\n/** What went wrong, as the server said it, ending in a full stop. */\nexport function errorSentence(error: unknown): string {\n const message = apiErrorFacts(error).serverMessage ?? \"\";\n if (!message) return \"\";\n const sentence = message.charAt(0).toLocaleUpperCase() + message.slice(1);\n return /[.!?]$/u.test(sentence) ? sentence : `${sentence}.`;\n}\n","/**\n * An automation's \"When\": its schedule and its event triggers, each optional.\n * With neither it runs only when someone presses Run now. Controlled and\n * data-agnostic like `EventTriggersField`: the host passes the sources it can\n * read and a loader for each source's event types.\n */\nimport { useId, useMemo, type ReactNode } from \"react\";\nimport { CircleAlertIcon, PlusIcon, Trash2Icon } from \"lucide-react\";\n\nimport type { EventSource, EventTypeDescriptor } from \"@opengeni/sdk\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { Button } from \"../../ui/button\";\nimport {\n CadencePicker,\n timeZoneLabels,\n type CadenceFrequency,\n type CadenceTimeZoneOption,\n type CadenceValue,\n} from \"../../ui/cadence-picker\";\nimport { cn } from \"../../lib/cn\";\nimport { defaultAutomationCadence, viewerTimeZone as localTimeZone } from \"./automation-model\";\nimport { EventTriggersField } from \"./event-trigger-editor\";\nimport type { EventSourceChoice } from \"./event-source-model\";\nimport type { EventSourceLogoResolver } from \"./event-source-tile\";\nimport type { EventTriggersDraft, EventTriggersIssues } from \"./event-trigger-model\";\n\n/**\n * The frequencies an automation's schedule can store. No \"Every month on day\n * N\": the API's calendar spec has no day of month yet.\n */\nexport const AUTOMATION_FREQUENCIES: readonly CadenceFrequency[] = [\n \"hourly\",\n \"daily\",\n \"weekdays\",\n \"weekly\",\n \"interval\",\n \"once\",\n];\n\nexport interface AutomationWhenFieldProps {\n /** Null: no schedule. */\n cadence: CadenceValue | null;\n onCadenceChange: (cadence: CadenceValue | null) => void;\n events: EventTriggersDraft;\n onEventsChange: (events: EventTriggersDraft) => void;\n /** Event triggers run here. False offers the schedule only. */\n eventTriggers: boolean;\n /** Sources the person can point triggers at; undefined while loading. */\n sources: EventSource[] | undefined;\n /** Reads one source's event types. */\n loadEventTypes: (sourceId: string) => Promise<EventTypeDescriptor[]>;\n eventIssues?: EventTriggersIssues | undefined;\n /** Why the schedule and the events don't fit together. */\n error?: string | undefined;\n sourceLogo?: EventSourceLogoResolver | undefined;\n /**\n * Opens the host's \"Add a source\" page; offered when no source fits. Gets\n * the kind a template's trigger asks for, when it asks for one.\n */\n onAddSource?: ((choice?: EventSourceChoice) => void) | undefined;\n /** Arguments a new MCP subscription starts with; see `EventTriggersField`. */\n argumentDefaults?: Readonly<Record<string, unknown>> | undefined;\n /** Default `AUTOMATION_FREQUENCIES`. */\n frequencies?: readonly CadenceFrequency[] | undefined;\n /** Suggested zones. Default: the viewer's, the schedule's and UTC. */\n timeZones?: readonly CadenceTimeZoneOption[] | undefined;\n /** Default: the browser's zone. */\n viewerTimeZone?: string | undefined;\n /** The clock for previews. */\n now?: Date | undefined;\n /** Notes under the triggers, such as what a run can open. */\n children?: ReactNode;\n disabled?: boolean | undefined;\n className?: string | undefined;\n}\n\nexport function AutomationWhenField({\n cadence,\n onCadenceChange,\n events,\n onEventsChange,\n eventTriggers,\n sources,\n loadEventTypes,\n eventIssues,\n error,\n sourceLogo,\n onAddSource,\n argumentDefaults,\n frequencies = AUTOMATION_FREQUENCIES,\n timeZones,\n viewerTimeZone,\n now,\n children,\n disabled = false,\n className,\n}: AutomationWhenFieldProps) {\n const t = useOpenGeniText();\n const labelId = useId();\n const viewerZone = viewerTimeZone ?? localTimeZone();\n const scheduleZone = cadence?.timeZone ?? viewerZone;\n const zones = useMemo(\n () =>\n timeZones ??\n [...new Set([viewerZone, scheduleZone, \"UTC\"])].map((id) => ({\n id,\n ...timeZoneLabels(id, t),\n })),\n [scheduleZone, t, timeZones, viewerZone],\n );\n const addSchedule = (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onCadenceChange(defaultAutomationCadence(viewerZone))}\n disabled={disabled}\n className=\"pointer-coarse:h-11\"\n >\n <PlusIcon aria-hidden=\"true\" />\n {t(\"automations.whenField.addSchedule\")}\n </Button>\n );\n const picker = cadence ? (\n <CadencePicker\n aria-labelledby={labelId}\n value={cadence}\n onChange={onCadenceChange}\n frequencies={frequencies}\n now={now}\n viewerTimeZone={viewerZone}\n timeZones={zones}\n disabled={disabled}\n className=\"min-w-0 flex-1\"\n />\n ) : null;\n const nothing = !cadence && events.triggers.length === 0;\n return (\n <div\n role=\"group\"\n aria-labelledby={labelId}\n className={cn(\"flex min-w-0 flex-col gap-3\", className)}\n >\n <p id={labelId} className=\"m-0 text-sm leading-5 font-medium text-fg\">\n {t(\"automations.panel.when\")}\n </p>\n {picker && eventTriggers ? (\n // Beside event triggers the schedule is one block among others, and removable.\n <div\n role=\"group\"\n aria-label={t(\"automations.whenField.schedule\")}\n className=\"flex min-w-0 items-start gap-3 rounded-lg border border-border bg-surface p-4\"\n >\n {picker}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => onCadenceChange(null)}\n disabled={disabled}\n aria-label={t(\"automations.whenField.removeSchedule\")}\n title={t(\"automations.whenField.removeSchedule\")}\n className=\"shrink-0 text-fg-muted pointer-coarse:size-11\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n </Button>\n </div>\n ) : (\n picker\n )}\n {nothing ? (\n <p className=\"m-0 text-sm leading-5 text-fg-muted\">\n {eventTriggers\n ? t(\"automations.whenField.manualUntilAdded\")\n : t(\"automations.whenField.manual\")}\n </p>\n ) : null}\n {eventTriggers ? (\n <EventTriggersField\n value={events}\n onChange={onEventsChange}\n sources={sources}\n loadEventTypes={loadEventTypes}\n issues={eventIssues}\n sourceLogo={sourceLogo}\n onAddSource={onAddSource}\n argumentDefaults={argumentDefaults}\n actions={cadence ? null : addSchedule}\n disabled={disabled}\n />\n ) : cadence ? null : (\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2\">{addSchedule}</div>\n )}\n {children}\n {cadence && events.triggers.length > 0 && !error ? (\n <p className=\"m-0 text-xs leading-4.5 text-fg-muted\">{t(\"automations.whenField.both\")}</p>\n ) : null}\n {error ? (\n <p\n role=\"alert\"\n className=\"m-0 flex min-w-0 items-start gap-1.5 text-xs leading-4.5 text-danger\"\n >\n <CircleAlertIcon aria-hidden=\"true\" className=\"mt-0.5 size-3.5 shrink-0\" />\n <span className=\"min-w-0 break-words\">{error}</span>\n </p>\n ) : null}\n </div>\n );\n}\n","/**\n * The event half of an automation's \"When\": one block per trigger (where the\n * events come from, which events, and optional conditions), plus \"Run once\".\n * Controlled and data-agnostic: the host passes the sources it can read and a\n * loader for each source's event types.\n */\nimport { useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { PlusIcon, Trash2Icon, XIcon } from \"lucide-react\";\n\nimport type { EventSource, EventTypeDescriptor } from \"@opengeni/sdk\";\n\nimport { useOpenGeniText, type OpenGeniText } from \"../../messages/runtime\";\nimport { Button } from \"../../ui/button\";\nimport { CheckboxField, Field, TextInput } from \"../../ui/field\";\nimport { ComboboxSelect, SelectMenu, type SelectOption } from \"../../ui/select-menu\";\nimport { cn } from \"../../lib/cn\";\nimport { EventArgumentsField } from \"./event-arguments-field\";\nimport { eventArgumentsForEvent } from \"./event-arguments-model\";\nimport {\n eventSourceAddLabel,\n eventSourceChoiceName,\n eventSourceKindLabel,\n eventStatusReasonText,\n type EventSourceChoice,\n} from \"./event-source-model\";\nimport { EventSourceTile, type EventSourceLogoResolver } from \"./event-source-tile\";\nimport {\n automationTemplateSourceChoice,\n eventSourceFitsTemplate,\n} from \"./automation-template-model\";\nimport {\n EVENT_CONDITION_OPERATORS,\n EVENT_TRIGGER_CONDITIONS_MAX,\n EVENT_TRIGGERS_PER_AUTOMATION_MAX,\n eventConditionFieldSuggestions,\n eventConditionOperator,\n eventConditionOperatorLabel,\n eventTypeIssue,\n eventTypeLabel,\n eventTypesLabel,\n newEventConditionDraft,\n newEventTriggerDraft,\n type EventConditionDraft,\n type EventTriggerDraft,\n type EventTriggerIssues,\n type EventTriggersDraft,\n type EventTriggersIssues,\n} from \"./event-trigger-model\";\n\n/** A source's event types, or why they couldn't be read. */\nexport type EventTypesState =\n | { status: \"loading\" }\n | { status: \"ready\"; eventTypes: EventTypeDescriptor[] }\n | { status: \"error\"; message: string };\n\n/**\n * Reads each picked source's event types once and keeps them, so switching a\n * trigger's source back and forth never refetches.\n */\nexport function useEventTypes(\n sourceIds: readonly string[],\n load: (sourceId: string) => Promise<EventTypeDescriptor[]>,\n): Record<string, EventTypesState> {\n const t = useOpenGeniText();\n const [states, setStates] = useState<Record<string, EventTypesState>>({});\n const requested = useRef(new Set<string>());\n const loadRef = useRef(load);\n loadRef.current = load;\n const textRef = useRef(t);\n textRef.current = t;\n const key = [...new Set(sourceIds)].filter(Boolean).sort().join(\",\");\n useEffect(() => {\n for (const sourceId of key ? key.split(\",\") : []) {\n if (requested.current.has(sourceId)) continue;\n requested.current.add(sourceId);\n setStates((current) => ({ ...current, [sourceId]: { status: \"loading\" } }));\n loadRef.current(sourceId).then(\n (eventTypes) =>\n setStates((current) => ({ ...current, [sourceId]: { status: \"ready\", eventTypes } })),\n (error: unknown) => {\n requested.current.delete(sourceId);\n setStates((current) => ({\n ...current,\n [sourceId]: {\n status: \"error\",\n message:\n error instanceof Error\n ? error.message\n : textRef.current(\"automations.editor.loadEventsFailed\"),\n },\n }));\n },\n );\n }\n }, [key]);\n return states;\n}\n\n/* ----------------------------------------------------------------------------\n The field: every trigger, Add, and Run once.\n -------------------------------------------------------------------------- */\n\nexport interface EventTriggersFieldProps {\n value: EventTriggersDraft;\n onChange: (next: EventTriggersDraft) => void;\n /** Sources the person can point triggers at; undefined while loading. */\n sources: EventSource[] | undefined;\n /** Reads one source's event types. */\n loadEventTypes: (sourceId: string) => Promise<EventTypeDescriptor[]>;\n issues?: EventTriggersIssues | undefined;\n /** The source's brand logo, from the host's connector catalog. */\n sourceLogo?: EventSourceLogoResolver | undefined;\n /**\n * Opens the host's \"Add a source\" page; offered when no source fits. Gets\n * the kind a template's trigger asks for, when it asks for one.\n */\n onAddSource?: ((choice?: EventSourceChoice) => void) | undefined;\n /** Offer \"Run once, then finish\" (default true). */\n allowOnce?: boolean | undefined;\n /**\n * Arguments a new MCP subscription starts with, by name, such as the\n * project the host's chat belongs to. Only arguments the event takes apply.\n */\n argumentDefaults?: Readonly<Record<string, unknown>> | undefined;\n /** More buttons beside Add an event, such as the host's Add a schedule. */\n actions?: ReactNode | undefined;\n disabled?: boolean | undefined;\n}\n\nexport function EventTriggersField({\n value,\n onChange,\n sources,\n loadEventTypes,\n issues,\n sourceLogo,\n onAddSource,\n allowOnce = true,\n argumentDefaults,\n actions,\n disabled = false,\n}: EventTriggersFieldProps) {\n const t = useOpenGeniText();\n const eventTypes = useEventTypes(\n value.triggers.map((trigger) => trigger.sourceId),\n loadEventTypes,\n );\n const lastAdded = useRef<string | null>(null);\n const update = (key: string, next: EventTriggerDraft) =>\n onChange({\n ...value,\n triggers: value.triggers.map((trigger) => (trigger.key === key ? next : trigger)),\n });\n const remove = (key: string) => {\n const triggers = value.triggers.filter((trigger) => trigger.key !== key);\n onChange({ ...value, triggers, ...(triggers.length === 0 ? { once: false } : {}) });\n };\n const add = () => {\n const only = sources?.length === 1 ? sources[0]!.id : \"\";\n const trigger = newEventTriggerDraft(only);\n lastAdded.current = trigger.key;\n onChange({ ...value, triggers: [...value.triggers, trigger] });\n };\n const full = value.triggers.length >= EVENT_TRIGGERS_PER_AUTOMATION_MAX;\n return (\n <div className=\"flex min-w-0 flex-col gap-3\">\n {value.triggers.map((trigger, index) => (\n <EventTriggerEditor\n key={trigger.key}\n index={index}\n value={trigger}\n onChange={(next) => update(trigger.key, next)}\n onRemove={() => remove(trigger.key)}\n sources={sources}\n eventTypes={trigger.sourceId ? eventTypes[trigger.sourceId] : undefined}\n issues={issues?.triggers[trigger.key]}\n sourceLogo={sourceLogo}\n onAddSource={onAddSource}\n argumentDefaults={argumentDefaults}\n autoFocus={lastAdded.current === trigger.key}\n disabled={disabled}\n />\n ))}\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={add}\n disabled={disabled || full}\n className=\"pointer-coarse:h-11\"\n >\n <PlusIcon aria-hidden=\"true\" />\n {value.triggers.length === 0\n ? t(\"automations.editor.addEvent\")\n : t(\"automations.editor.addAnotherEvent\")}\n </Button>\n {actions}\n {full ? (\n <span className=\"text-xs text-fg-muted\">\n {t(\"automations.editor.triggersMax\", { max: EVENT_TRIGGERS_PER_AUTOMATION_MAX })}\n </span>\n ) : null}\n </div>\n {allowOnce && value.triggers.length > 0 ? (\n <CheckboxField\n label={t(\"automations.editor.once\")}\n description={t(\"automations.editor.onceDescription\")}\n checked={value.once}\n onCheckedChange={(once) => onChange({ ...value, once })}\n disabled={disabled}\n />\n ) : null}\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n One trigger.\n -------------------------------------------------------------------------- */\n\nexport interface EventTriggerEditorProps {\n value: EventTriggerDraft;\n onChange: (next: EventTriggerDraft) => void;\n onRemove: () => void;\n /** Position in the list, for accessible names. */\n index: number;\n sources: EventSource[] | undefined;\n /** The chosen source's event types; undefined before a source is chosen. */\n eventTypes: EventTypesState | undefined;\n issues?: EventTriggerIssues | undefined;\n sourceLogo?: EventSourceLogoResolver | undefined;\n onAddSource?: ((choice?: EventSourceChoice) => void) | undefined;\n /** Arguments a new MCP subscription starts with; see `EventTriggersField`. */\n argumentDefaults?: Readonly<Record<string, unknown>> | undefined;\n /** Move focus to the source picker when the block appears. */\n autoFocus?: boolean | undefined;\n disabled?: boolean | undefined;\n}\n\nexport function EventTriggerEditor({\n value,\n onChange,\n onRemove,\n index,\n sources,\n eventTypes,\n issues,\n sourceLogo,\n onAddSource,\n argumentDefaults,\n autoFocus = false,\n disabled = false,\n}: EventTriggerEditorProps) {\n const t = useOpenGeniText();\n const blockRef = useRef<HTMLDivElement>(null);\n const source = sources?.find((candidate) => candidate.id === value.sourceId);\n /** What a template asked for, while no source of that kind is chosen. */\n const wanted = !value.sourceId ? value.templateSource : undefined;\n const wantedChoice = wanted ? automationTemplateSourceChoice(wanted) : undefined;\n const descriptors = eventTypes?.status === \"ready\" ? eventTypes.eventTypes : [];\n const schemaOf = (types: readonly string[]) =>\n types\n .map((type) => descriptors.find((descriptor) => descriptor.type === type)?.argumentsSchema)\n .find((schema) => schema && Object.keys(schema).length > 0);\n const argumentsSchema = schemaOf(value.eventTypes);\n useEffect(() => {\n if (!autoFocus) return;\n blockRef.current?.querySelector<HTMLElement>(\"button, input\")?.focus();\n }, [autoFocus]);\n\n const sourceOptions: SelectOption[] = (sources ?? []).map((candidate) => ({\n value: candidate.id,\n label: candidate.name,\n meta: eventSourceKindLabel(t, candidate),\n leading: <EventSourceTile source={candidate} logo={sourceLogo} size=\"sm\" />,\n ...(candidate.status === \"active\"\n ? {}\n : {\n description:\n eventStatusReasonText(\n t,\n {\n text: candidate.statusReason,\n code: candidate.statusReasonCode,\n detail: candidate.statusReasonDetail,\n },\n candidate.name,\n ) ?? t(\"automations.editor.sourceOff\"),\n }),\n }));\n const label = t(\"automations.editor.eventN\", { index: index + 1 });\n\n return (\n <div\n ref={blockRef}\n role=\"group\"\n aria-label={label}\n className=\"flex min-w-0 flex-col gap-4 rounded-lg border border-border bg-surface p-4\"\n >\n <div className=\"flex min-w-0 items-start gap-3\">\n <Field\n label={t(\"automations.editor.from\")}\n error={issues?.source}\n className=\"min-w-0 flex-1\"\n >\n <SelectMenu\n variant={sourceOptions.length > 8 ? \"combobox\" : \"menu\"}\n options={sourceOptions}\n value={value.sourceId || null}\n onValueChange={(sourceId) => {\n const picked = sources?.find((candidate) => candidate.id === sourceId);\n // A source of the kind the template asked for keeps its events.\n onChange(\n wanted && picked && eventSourceFitsTemplate(wanted, picked)\n ? { ...value, sourceId }\n : { ...value, sourceId, eventTypes: [], conditions: [], argumentsText: \"\" },\n );\n }}\n placeholder={\n sources === undefined\n ? t(\"automations.editor.loadingSources\")\n : t(\"automations.editor.chooseSource\")\n }\n loading={sources === undefined}\n searchPlaceholder={t(\"automations.editor.searchSources\")}\n emptyMessage={\n onAddSource ? (\n <span>\n {t(\"automations.editor.noSources\")}{\" \"}\n <button\n type=\"button\"\n className=\"og-link\"\n onClick={() => onAddSource(wantedChoice)}\n >\n {t(\"automations.editor.addSource\")}\n </button>\n </span>\n ) : (\n t(\"automations.editor.noSourcesAskAdmin\")\n )\n }\n invalid={Boolean(issues?.source)}\n disabled={disabled}\n className=\"max-w-full\"\n />\n </Field>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={onRemove}\n disabled={disabled}\n aria-label={t(\"automations.editor.removeEventN\", { index: index + 1 })}\n title={t(\"automations.editor.remove\")}\n className=\"mt-7 shrink-0 text-fg-muted pointer-coarse:size-11\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n </Button>\n </div>\n {wanted && wantedChoice && sources !== undefined ? (\n <p className=\"m-0 text-sm leading-5 text-fg-muted\">\n {t(\"automations.editor.templateWants\", {\n events: eventTypesLabel(t, value.eventTypes),\n source:\n wanted.kind === \"mcp\" && wanted.mcpServerId\n ? wanted.mcpServerId\n : eventSourceChoiceName(t, wantedChoice),\n })}\n {onAddSource ? (\n <>\n {\" \"}\n <button\n type=\"button\"\n className=\"og-link\"\n onClick={() => onAddSource(wantedChoice)}\n disabled={disabled}\n >\n {eventSourceAddLabel(t, wantedChoice)}\n </button>\n </>\n ) : null}\n </p>\n ) : null}\n {value.sourceId ? (\n <>\n <Field\n label={\n source?.kind === \"mcp\"\n ? t(\"automations.editor.event\")\n : t(\"automations.editor.events\")\n }\n error={issues?.eventTypes}\n hint={\n source?.kind === \"mcp\"\n ? t(\"automations.editor.mcpOneEventHint\")\n : t(\"automations.editor.anyStartsRun\")\n }\n >\n <EventTypePicker\n value={value.eventTypes}\n onChange={(picked) =>\n onChange({\n ...value,\n eventTypes: picked,\n // A newly picked MCP event keeps what applies and fills in the host's defaults.\n ...(source?.kind === \"mcp\" && picked.length > 0\n ? {\n argumentsText: eventArgumentsForEvent(\n schemaOf(picked),\n value.argumentsText,\n argumentDefaults,\n ),\n }\n : {}),\n })\n }\n state={eventTypes}\n sourceName={source?.name}\n single={source?.kind === \"mcp\"}\n grouped={source?.kind === \"workspace\"}\n invalid={Boolean(issues?.eventTypes)}\n disabled={disabled}\n />\n </Field>\n {source?.kind === \"mcp\" ? (\n <EventArgumentsField\n schema={argumentsSchema}\n value={value.argumentsText}\n onChange={(argumentsText) => onChange({ ...value, argumentsText })}\n error={issues?.arguments}\n disabled={disabled}\n />\n ) : null}\n <EventConditionsEditor\n value={value.conditions}\n onChange={(conditions) => onChange({ ...value, conditions })}\n suggestions={eventConditionFieldSuggestions(t, value.eventTypes, descriptors)}\n issues={issues?.conditions}\n disabled={disabled}\n />\n {source?.kind === \"github\" || source?.kind === \"slack\" || source?.kind === \"workspace\" ? (\n <CheckboxField\n label={t(\"automations.editor.includeOwn\")}\n description={\n source.kind === \"workspace\"\n ? t(\"automations.editor.includeOwnWorkspaceDescription\")\n : t(\"automations.editor.includeOwnDescription\")\n }\n checked={value.includeOwnEvents}\n onCheckedChange={(includeOwnEvents) => onChange({ ...value, includeOwnEvents })}\n disabled={disabled}\n />\n ) : null}\n </>\n ) : null}\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n Event types.\n -------------------------------------------------------------------------- */\n\nconst CUSTOM_PREFIX = \"custom:\";\n/** One empty list while types load, so the picker's options keep their identity. */\nconst NO_EVENT_TYPES: EventTypeDescriptor[] = [];\n\n/** \"This workspace\" types under Chats, Usage and Meetings, in the catalog's order. */\nfunction workspaceEventGroup(t: OpenGeniText, type: string): string | undefined {\n if (type.startsWith(\"recording.\")) return t(\"automations.picker.groupMeetings\");\n if (type.startsWith(\"usage.\")) return t(\"automations.picker.groupUsage\");\n if (type.startsWith(\"turn.\") || type.startsWith(\"session.\")) {\n return t(\"automations.picker.groupChats\");\n }\n return undefined;\n}\n\nexport function EventTypePicker({\n value,\n onChange,\n state,\n sourceName,\n single = false,\n grouped = false,\n invalid = false,\n disabled = false,\n}: {\n value: string[];\n onChange: (eventTypes: string[]) => void;\n state: EventTypesState | undefined;\n /** The source's name, which the reasons a type can't be picked mention. */\n sourceName?: string | undefined;\n /** Only one type (MCP triggers); picking replaces it. */\n single?: boolean | undefined;\n /** Headings for \"This workspace\" types: Chats, Usage and Meetings. */\n grouped?: boolean | undefined;\n invalid?: boolean | undefined;\n disabled?: boolean | undefined;\n}) {\n const t = useOpenGeniText();\n const [query, setQuery] = useState(\"\");\n const descriptors = state?.status === \"ready\" ? state.eventTypes : NO_EVENT_TYPES;\n const options = useMemo(() => {\n const picked = new Set(value);\n const known: SelectOption[] = descriptors\n .filter((descriptor) => !picked.has(descriptor.type))\n .map((descriptor) => {\n const unavailable = descriptor.available\n ? null\n : eventStatusReasonText(\n t,\n {\n text: descriptor.unavailableReason,\n code: descriptor.unavailableReasonCode,\n detail: descriptor.unavailableReasonDetail,\n },\n sourceName,\n );\n return {\n value: descriptor.type,\n label: descriptor.type,\n description: unavailable ?? descriptor.description,\n disabled: !descriptor.available,\n ...(grouped ? { group: workspaceEventGroup(t, descriptor.type) } : {}),\n ...(descriptor.available\n ? {}\n : { disabledReason: unavailable ?? t(\"automations.picker.cantReceive\") }),\n keywords: [descriptor.description],\n };\n });\n const all: SelectOption[] =\n single || picked.has(\"*\")\n ? []\n : [\n {\n value: \"*\",\n label: eventTypeLabel(t, \"*\"),\n description: t(\"automations.picker.everyEventDescription\"),\n },\n ];\n const needle = query.trim().toLowerCase();\n const matches = [...all, ...known].filter(\n (option) =>\n !needle ||\n option.value.toLowerCase().includes(needle) ||\n String(option.description ?? \"\")\n .toLowerCase()\n .includes(needle),\n );\n const typed = query.trim();\n const custom =\n typed &&\n !single &&\n !picked.has(typed) &&\n !descriptors.some((descriptor) => descriptor.type === typed) &&\n eventTypeIssue(t, typed) === null\n ? [\n {\n value: `${CUSTOM_PREFIX}${typed}`,\n label: t(\"automations.picker.use\", { type: typed }),\n description: typed.endsWith(\".*\")\n ? t(\"automations.picker.prefixDescription\", { prefix: typed.slice(0, -1) })\n : t(\"automations.picker.unlisted\"),\n },\n ]\n : [];\n return [...matches, ...custom];\n }, [descriptors, grouped, query, single, sourceName, t, value]);\n\n const add = (picked: string) => {\n const type = picked.startsWith(CUSTOM_PREFIX) ? picked.slice(CUSTOM_PREFIX.length) : picked;\n setQuery(\"\");\n onChange(single ? [type] : [...value, type]);\n };\n const loading = state === undefined || state.status === \"loading\";\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n {value.length > 0 ? (\n <ul\n aria-label={t(\"automations.picker.picked\")}\n className=\"m-0 flex min-w-0 list-none flex-wrap gap-1.5 p-0\"\n >\n {value.map((type) => {\n const description = descriptors.find((entry) => entry.type === type)?.description;\n return (\n <li\n key={type}\n title={description}\n className=\"inline-flex h-7 max-w-full min-w-0 items-center gap-1 rounded-full border border-border bg-surface-2 pr-0.5 pl-2.5 text-xs font-medium text-fg\"\n >\n <span className={cn(\"min-w-0 truncate\", type !== \"*\" && \"font-mono\")}>\n {eventTypeLabel(t, type)}\n </span>\n <button\n type=\"button\"\n onClick={() => onChange(value.filter((entry) => entry !== type))}\n disabled={disabled}\n aria-label={t(\"automations.picker.removeType\", { type: eventTypeLabel(t, type) })}\n className=\"grid size-6 shrink-0 place-items-center rounded-full text-fg-muted hover:bg-hover hover:text-fg pointer-coarse:size-8\"\n >\n <XIcon aria-hidden=\"true\" className=\"size-3\" />\n </button>\n </li>\n );\n })}\n </ul>\n ) : null}\n {state?.status === \"error\" ? (\n <p className=\"m-0 text-xs leading-4.5 text-fg-muted\">\n {t(\"automations.picker.loadFailed\", { reason: state.message.replace(/\\.$/, \"\") })}\n </p>\n ) : null}\n {single && value.length > 0 ? null : (\n <ComboboxSelect\n options={options}\n value={null}\n onValueChange={add}\n onSearchChange={setQuery}\n filterLocally={false}\n placeholder={\n value.length === 0 ? t(\"automations.picker.choose\") : t(\"automations.picker.addEvent\")\n }\n searchPlaceholder={t(\"automations.picker.search\")}\n loading={loading && state?.status !== \"error\"}\n loadingLabel={t(\"automations.picker.loading\")}\n emptyMessage={t(\"automations.picker.empty\")}\n invalid={invalid}\n disabled={disabled}\n showMetaInTrigger={false}\n className=\"max-w-full sm:max-w-80\"\n aria-label={\n value.length === 0 ? t(\"automations.picker.choose\") : t(\"automations.picker.addEvent\")\n }\n />\n )}\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n Conditions.\n -------------------------------------------------------------------------- */\n\nexport function EventConditionsEditor({\n value,\n onChange,\n suggestions,\n issues,\n disabled = false,\n}: {\n value: EventConditionDraft[];\n onChange: (conditions: EventConditionDraft[]) => void;\n /** Fields worth matching, for autocomplete. */\n suggestions: ReadonlyArray<{ field: string; description: string }>;\n /** By condition key. */\n issues?: Record<string, string> | undefined;\n disabled?: boolean | undefined;\n}) {\n const t = useOpenGeniText();\n const listId = useId();\n const headingId = useId();\n const update = (key: string, next: Partial<EventConditionDraft>) =>\n onChange(\n value.map((condition) => (condition.key === key ? { ...condition, ...next } : condition)),\n );\n const full = value.length >= EVENT_TRIGGER_CONDITIONS_MAX;\n return (\n <div role=\"group\" aria-labelledby={headingId} className=\"flex min-w-0 flex-col gap-2\">\n <p id={headingId} className=\"m-0 text-sm leading-5 font-medium text-fg\">\n {t(\"automations.conditions.heading\")}\n <span className=\"ml-1.5 text-xs font-normal text-fg-subtle\">\n {t(\"automations.conditions.optional\")}\n </span>\n </p>\n <datalist id={listId}>\n {suggestions.map((entry) => (\n <option key={entry.field} value={entry.field}>\n {entry.description}\n </option>\n ))}\n </datalist>\n {value.map((condition, index) => {\n const operator = eventConditionOperator(condition.op);\n const issue = issues?.[condition.key];\n const position = { index: index + 1 };\n return (\n <div key={condition.key} className=\"flex min-w-0 flex-col gap-1.5\">\n <div className=\"grid min-w-0 grid-cols-[minmax(0,1fr)_auto] gap-2 sm:grid-cols-[minmax(0,1.2fr)_9.5rem_minmax(0,1fr)_auto]\">\n <TextInput\n value={condition.field}\n onChange={(event) => update(condition.key, { field: event.target.value })}\n list={listId}\n placeholder=\"data.action\"\n aria-label={t(\"automations.conditions.fieldFor\", position)}\n aria-invalid={issue ? true : undefined}\n mono\n suppressAutofill\n disabled={disabled}\n className=\"col-span-1\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => onChange(value.filter((entry) => entry.key !== condition.key))}\n disabled={disabled}\n aria-label={t(\"automations.conditions.remove\", position)}\n title={t(\"automations.editor.remove\")}\n className=\"text-fg-muted sm:order-last pointer-coarse:size-11\"\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n <SelectMenu\n variant=\"native\"\n options={EVENT_CONDITION_OPERATORS.map((option) => ({\n value: option.value,\n label: eventConditionOperatorLabel(t, option.value),\n }))}\n value={condition.op}\n onValueChange={(op) =>\n update(condition.key, {\n op,\n ...(eventConditionOperator(op).takes === null ? { value: \"\" } : {}),\n })\n }\n aria-label={t(\"automations.conditions.comparisonFor\", position)}\n showSelectedDescription={false}\n disabled={disabled}\n className=\"col-span-2 sm:col-span-1\"\n />\n {operator.takes === null ? (\n <span className=\"hidden sm:block\" />\n ) : (\n <TextInput\n value={condition.value}\n onChange={(event) => update(condition.key, { value: event.target.value })}\n placeholder={operator.takes === \"list\" ? \"opened, reopened\" : \"opened\"}\n aria-label={t(\"automations.conditions.valueFor\", position)}\n aria-invalid={issue ? true : undefined}\n suppressAutofill\n disabled={disabled}\n className=\"col-span-2 sm:col-span-1\"\n />\n )}\n </div>\n {issue ? <p className=\"m-0 text-xs leading-4.5 text-danger\">{issue}</p> : null}\n </div>\n );\n })}\n <div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onChange([...value, newEventConditionDraft()])}\n disabled={disabled || full}\n className=\"-ml-2 text-fg-muted pointer-coarse:h-11\"\n >\n <PlusIcon aria-hidden=\"true\" />\n {t(\"automations.conditions.add\")}\n </Button>\n </div>\n </div>\n );\n}\n","/**\n * An MCP event's subscription settings: a labelled field per argument when\n * the server's schema is flat, JSON otherwise. The value stays JSON text.\n */\nimport { useMemo } from \"react\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { CheckboxField, Field, TextArea, TextInput } from \"../../ui/field\";\nimport { SelectMenu } from \"../../ui/select-menu\";\nimport {\n eventArgumentFields,\n eventArgumentsValue,\n withEventArgument,\n type EventArgumentField,\n} from \"./event-arguments-model\";\n\nexport interface EventArgumentsFieldProps {\n /** The event's `argumentsSchema`; null or empty when it takes no arguments. */\n schema: Record<string, unknown> | null | undefined;\n /** The arguments as JSON text; empty for none. */\n value: string;\n onChange: (value: string) => void;\n error?: string | undefined;\n disabled?: boolean | undefined;\n}\n\nexport function EventArgumentsField({\n schema,\n value,\n onChange,\n error,\n disabled = false,\n}: EventArgumentsFieldProps) {\n const t = useOpenGeniText();\n const fields = useMemo(() => eventArgumentFields(schema), [schema]);\n const values = eventArgumentsValue(value);\n const title = t(\"automations.editor.subscriptionSettings\");\n if (fields === null || values === null || (fields.length === 0 && value.trim())) {\n return (\n <Field\n label={title}\n optional\n error={error}\n hint={t(\"automations.editor.subscriptionSettingsHint\")}\n >\n <TextArea\n mono\n rows={4}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n placeholder={jsonExample(schema)}\n disabled={disabled}\n spellCheck={false}\n />\n </Field>\n );\n }\n if (fields.length === 0) return null;\n return (\n <fieldset className=\"m-0 flex min-w-0 flex-col gap-4 border-0 p-0\" disabled={disabled}>\n <legend className=\"sr-only\">{title}</legend>\n {fields.map((field) => (\n <ArgumentInput\n key={field.name}\n field={field}\n value={values[field.name]}\n onChange={(next) => onChange(withEventArgument(value, field.name, next))}\n disabled={disabled}\n />\n ))}\n {error ? (\n <p role=\"alert\" className=\"m-0 text-xs leading-4.5 text-danger\">\n {error}\n </p>\n ) : null}\n </fieldset>\n );\n}\n\nfunction ArgumentInput({\n field,\n value,\n onChange,\n disabled,\n}: {\n field: EventArgumentField;\n value: unknown;\n onChange: (value: unknown) => void;\n disabled: boolean;\n}) {\n const t = useOpenGeniText();\n if (field.kind === \"boolean\") {\n return (\n <CheckboxField\n label={field.label}\n description={field.description ?? undefined}\n checked={value === true}\n onCheckedChange={(checked) => onChange(checked ? true : field.required ? false : undefined)}\n disabled={disabled}\n />\n );\n }\n const hint = field.description ?? undefined;\n if (field.kind === \"choice\") {\n const selected = field.options.findIndex((option) => option.value === value);\n return (\n <Field label={field.label} optional={!field.required} hint={hint}>\n <SelectMenu\n options={field.options.map((option, index) => ({\n value: String(index),\n label: option.label,\n }))}\n value={selected >= 0 ? String(selected) : null}\n onValueChange={(index) => onChange(field.options[Number(index)]?.value)}\n placeholder={t(\"automations.arguments.choose\")}\n disabled={disabled}\n className=\"max-w-full\"\n />\n </Field>\n );\n }\n const text = typeof value === \"string\" || typeof value === \"number\" ? String(value) : \"\";\n return (\n <Field label={field.label} optional={!field.required} hint={hint}>\n <TextInput\n value={text}\n onChange={(event) => {\n const typed = event.target.value;\n if (!typed.trim()) return onChange(undefined);\n if (field.kind === \"number\") {\n // Kept as typed until it reads as a number, so \"1.\" can become \"1.5\".\n const number = Number(typed.trim());\n return onChange(String(number) === typed.trim() ? number : typed);\n }\n onChange(typed);\n }}\n inputMode={field.kind === \"number\" ? (field.integer ? \"numeric\" : \"decimal\") : undefined}\n mono={field.kind === \"text\" && field.format === \"uuid\"}\n placeholder={field.placeholder ?? undefined}\n disabled={disabled}\n spellCheck={false}\n suppressAutofill\n />\n </Field>\n );\n}\n\n/** A filled-in example from a JSON Schema's properties, for the JSON placeholder. */\nfunction jsonExample(schema: Record<string, unknown> | null | undefined): string {\n const properties = schema?.properties;\n if (!properties || typeof properties !== \"object\") return \"{}\";\n const example: Record<string, unknown> = {};\n for (const [name, property] of Object.entries(properties as Record<string, unknown>)) {\n const type = (property as { type?: unknown } | null)?.type;\n example[name] = type === \"number\" || type === \"integer\" ? 0 : type === \"boolean\" ? true : \"\";\n }\n return JSON.stringify(example, null, 2);\n}\n","/**\n * An MCP event's subscription settings as a form. MCP servers describe a\n * subscription's arguments with a JSON Schema; flat schemas of text, numbers,\n * yes/no and fixed choices become labelled fields, and anything richer is\n * edited as JSON. The draft keeps the arguments as JSON text either way, so\n * keys the form doesn't show survive an edit.\n */\n\n/** One argument the form can edit. */\nexport type EventArgumentField = {\n name: string;\n /** The schema's title, else the property name in words. */\n label: string;\n description: string | null;\n required: boolean;\n} & (\n | {\n kind: \"text\";\n /** The schema's `format`, such as \"uuid\" or \"email\". */\n format: string | null;\n placeholder: string | null;\n }\n | { kind: \"number\"; integer: boolean; placeholder: string | null }\n | { kind: \"boolean\" }\n | { kind: \"choice\"; options: EventArgumentOption[] }\n);\n\nexport interface EventArgumentOption {\n value: string | number | boolean;\n label: string;\n}\n\ntype Schema = Record<string, unknown>;\n\nfunction isSchema(value: unknown): value is Schema {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/** \"projectId\" -> \"Project id\", \"max_items\" -> \"Max items\". */\nexport function eventArgumentLabel(name: string): string {\n const words = name\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .trim()\n .toLowerCase();\n return words ? words.charAt(0).toUpperCase() + words.slice(1) : name;\n}\n\nfunction scalarExample(value: unknown): string | null {\n return typeof value === \"string\" || typeof value === \"number\" ? String(value) : null;\n}\n\nfunction choiceOptions(property: Schema): EventArgumentOption[] | null {\n if (Array.isArray(property.enum)) {\n const values = property.enum.filter(\n (value): value is string | number | boolean =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\",\n );\n if (values.length === 0 || values.length !== property.enum.length) return null;\n return values.map((value) => ({ value, label: String(value) }));\n }\n const variants = Array.isArray(property.oneOf)\n ? property.oneOf\n : Array.isArray(property.anyOf)\n ? property.anyOf\n : null;\n if (!variants || variants.length === 0) return null;\n const options: EventArgumentOption[] = [];\n for (const variant of variants) {\n if (!isSchema(variant) || !(\"const\" in variant)) return null;\n const value = variant.const;\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\")\n return null;\n options.push({\n value,\n label: typeof variant.title === \"string\" && variant.title ? variant.title : String(value),\n });\n }\n return options;\n}\n\nfunction argumentField(\n name: string,\n property: unknown,\n required: boolean,\n): EventArgumentField | null {\n if (!isSchema(property)) return null;\n const base = {\n name,\n label:\n typeof property.title === \"string\" && property.title.trim()\n ? property.title.trim()\n : eventArgumentLabel(name),\n description:\n typeof property.description === \"string\" && property.description.trim()\n ? property.description.trim()\n : null,\n required,\n };\n const options = choiceOptions(property);\n if (options) return { ...base, kind: \"choice\", options };\n const examples = Array.isArray(property.examples) ? property.examples : [];\n const placeholder = scalarExample(property.default) ?? scalarExample(examples[0]);\n switch (property.type) {\n case \"string\":\n return {\n ...base,\n kind: \"text\",\n format: typeof property.format === \"string\" ? property.format : null,\n placeholder,\n };\n case \"number\":\n case \"integer\":\n return { ...base, kind: \"number\", integer: property.type === \"integer\", placeholder };\n case \"boolean\":\n return { ...base, kind: \"boolean\" };\n default:\n return null;\n }\n}\n\n/**\n * The fields for a subscription's arguments, required ones first; an empty\n * list when it takes none, and null when the schema needs JSON (nested\n * objects, lists, or types the form can't show).\n */\nexport function eventArgumentFields(\n schema: Record<string, unknown> | null | undefined,\n): EventArgumentField[] | null {\n if (!schema) return [];\n if (schema.type !== undefined && schema.type !== \"object\") return null;\n const properties = schema.properties;\n if (properties === undefined) return [];\n if (!isSchema(properties)) return null;\n const required = new Set(\n Array.isArray(schema.required)\n ? schema.required.filter((name): name is string => typeof name === \"string\")\n : [],\n );\n const fields: EventArgumentField[] = [];\n for (const [name, property] of Object.entries(properties)) {\n const field = argumentField(name, property, required.has(name));\n if (!field) return null;\n fields.push(field);\n }\n return [\n ...fields.filter((field) => field.required),\n ...fields.filter((field) => !field.required),\n ];\n}\n\n/** The arguments in JSON text as an object; null when the text isn't a JSON object. */\nexport function eventArgumentsValue(text: string): Record<string, unknown> | null {\n if (!text.trim()) return {};\n try {\n const value: unknown = JSON.parse(text);\n return isSchema(value) ? value : null;\n } catch {\n return null;\n }\n}\n\n/** The JSON text with one argument set, or removed when `value` is undefined. */\nexport function withEventArgument(text: string, name: string, value: unknown): string {\n const current = eventArgumentsValue(text) ?? {};\n const next: Record<string, unknown> = { ...current };\n if (value === undefined) delete next[name];\n else next[name] = value;\n return Object.keys(next).length > 0 ? JSON.stringify(next, null, 2) : \"\";\n}\n\n/**\n * The arguments for a newly picked event: what was already entered for\n * arguments it takes, else the host's defaults (such as the project a chat\n * belongs to). Arguments it doesn't take are dropped; text that isn't a JSON\n * object, or an event without a schema, keeps the text as it is.\n */\nexport function eventArgumentsForEvent(\n schema: Record<string, unknown> | null | undefined,\n text: string,\n defaults: Readonly<Record<string, unknown>> | undefined,\n): string {\n const properties = schema?.properties;\n const current = eventArgumentsValue(text);\n if (!isSchema(properties) || current === null) return text;\n const next: Record<string, unknown> = {};\n for (const name of Object.keys(properties)) {\n const value = name in current ? current[name] : defaults?.[name];\n if (value !== undefined) next[name] = value;\n }\n return Object.keys(next).length > 0 ? JSON.stringify(next, null, 2) : \"\";\n}\n","import { Building2Icon, WebhookIcon, WorkflowIcon } from \"lucide-react\";\n\nimport type { CapabilityCatalogItem, EventSource } from \"@opengeni/sdk\";\n\nimport { connectorLogo, connectorLogoIndex } from \"../../timeline/connector-logo-index\";\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { LogoTile, type LogoTileSize } from \"../../ui/logo-tile\";\nimport {\n eventSourceChoiceOf,\n eventSourceChoiceName,\n eventSourceProviderDomain,\n type EventSourceChoice,\n type EventSourceChoiceSubject,\n} from \"./event-source-model\";\n\n/** Resolves the brand logo for a source (a provider domain), when the host has one. */\nexport type EventSourceLogoResolver = (source: EventSourceLogoSubject) => string | null | undefined;\n\nexport type EventSourceLogoSubject = Pick<EventSource, \"kind\" | \"adapter\" | \"name\" | \"mcp\"> &\n Pick<EventSourceChoiceSubject, \"format\">;\n\n/**\n * Logos from a capability catalog: the app's own logo for GitHub, Slack,\n * Gmail, Linear, Sentry and apps with a webhook preset such as Tailscale, and\n * the MCP server's logo for an MCP source.\n * Build it once per catalog.\n */\nexport function eventSourceLogoResolver(\n catalog: readonly Pick<\n CapabilityCatalogItem,\n \"id\" | \"runtime\" | \"providerDomain\" | \"mcpUrl\" | \"connectionRef\" | \"logoAssetPath\"\n >[],\n assetUrl: (logoAssetPath: string) => string | null | undefined,\n): EventSourceLogoResolver {\n const index = connectorLogoIndex(catalog, (path) => (path ? assetUrl(path) : null));\n return (source) => {\n if (source.kind === \"mcp\" && source.mcp) {\n const serverId = source.mcp.serverId;\n const item = catalog.find(\n (entry) => entry.runtime.mcpServerId === serverId || entry.id === serverId,\n );\n if (!item) return null;\n return item.logoAssetPath\n ? (assetUrl(item.logoAssetPath) ?? null)\n : connectorLogo(index, item.providerDomain);\n }\n return connectorLogo(index, eventSourceProviderDomain(source));\n };\n}\n\nconst GLYPH: Partial<Record<EventSourceChoice, typeof WebhookIcon>> = {\n webhook: WebhookIcon,\n mcp: WorkflowIcon,\n workspace: Building2Icon,\n};\n\n/**\n * The tile for a source: its app's logo when the host resolves one, a webhook\n * MCP or workspace glyph for those kinds, otherwise the app's monogram (\"G\"\n * for a GitHub source, whatever the source is named).\n */\nexport function EventSourceTile({\n source,\n logo,\n size,\n className,\n}: {\n source: EventSourceLogoSubject;\n logo?: EventSourceLogoResolver | undefined;\n size?: LogoTileSize | undefined;\n className?: string | undefined;\n}) {\n const t = useOpenGeniText();\n const src = logo?.(source) ?? null;\n const choice = eventSourceChoiceOf(source);\n const Glyph = GLYPH[choice];\n return (\n <LogoTile\n size={size}\n src={src}\n name={Glyph ? source.name : eventSourceChoiceName(t, choice)}\n icon={Glyph ? <Glyph /> : undefined}\n className={className}\n />\n );\n}\n","/**\n * Automation templates: where a new automation starts. Using one fills the\n * ordinary form; nothing is created until the person saves. A template holds\n * what an automation does and when, never where its runs go, who owns it or\n * which accounts it uses. Its schedule has no time zone (the person's own\n * applies) and its triggers name a kind of source, resolved to the person's\n * own source when the form opens. Pure; text comes from the host's catalog.\n */\nimport { AUTOMATION_TEMPLATE_NAME_MAX_LENGTH } from \"@opengeni/contracts/automation-templates\";\nimport { webhookPresetOf } from \"@opengeni/contracts/event-triggers\";\nimport type {\n AutomationTemplateEventSource,\n AutomationTemplateSchedule,\n AutomationTemplateTrigger,\n CreateAutomationTemplateRequest,\n EventSource,\n ScheduledTask,\n WorkspaceAutomationTemplate,\n} from \"@opengeni/sdk\";\n\nimport type { OpenGeniText } from \"../../messages/runtime\";\nimport {\n cadenceFromScheduleSpec,\n describeCadence,\n toScheduleSpec,\n type CadenceValue,\n} from \"../../ui/cadence-picker\";\nimport {\n AUTOMATION_NAME_MAX_LENGTH,\n automationCadence,\n automationName,\n viewerTimeZone,\n type AutomationDraft,\n} from \"./automation-model\";\nimport {\n eventSourceChoiceName,\n eventSourceChoiceOf,\n type EventSourceChoice,\n} from \"./event-source-model\";\nimport {\n DEFAULT_EVENT_RUNS_PER_HOUR,\n emptyEventTriggersDraft,\n eventTriggerDraftFrom,\n eventTypesLabel,\n type EventTriggerDraft,\n type EventTriggersDraft,\n} from \"./event-trigger-model\";\n\n/** A template a person can start an automation from: built in, the host's own, or saved in the workspace. */\nexport interface AutomationTemplate {\n /** Unique among the templates offered together. */\n id: string;\n name: string;\n /** One sentence: what it does. */\n description: string;\n /** What the agent does on each run. */\n instructions: string;\n /** Null: it runs only on its events or with Run now. */\n schedule: AutomationTemplateSchedule | null;\n triggers: readonly AutomationTemplateTrigger[];\n /** The storm guard for event runs; omitted or null takes the default. */\n maxRunsPerHour?: number | null | undefined;\n /** When it runs, for its card: \"When a pull request opens\". Default: said from its schedule and triggers. */\n when?: string | undefined;\n}\n\n/* ----------------------------------------------------------------------------\n Built-in templates.\n -------------------------------------------------------------------------- */\n\nconst WEEKDAYS = [\"MONDAY\", \"TUESDAY\", \"WEDNESDAY\", \"THURSDAY\", \"FRIDAY\"] as const;\n\n/**\n * The templates that ship with Opengeni, in the host's language. Event\n * templates listen on GitHub, Linear and this workspace's meetings; offer\n * them where those sources can be added.\n */\nexport function builtinAutomationTemplates(t: OpenGeniText): AutomationTemplate[] {\n return [\n {\n id: \"meeting-notes\",\n name: t(\"automations.template.meetingNotes.name\"),\n description: t(\"automations.template.meetingNotes.description\"),\n instructions: t(\"automations.template.meetingNotes.instructions\"),\n when: t(\"automations.template.meetingNotes.when\"),\n schedule: null,\n triggers: [\n {\n source: { kind: \"workspace\" },\n eventTypes: [\"recording.transcript.ready\"],\n conditions: [\n { field: \"data.purpose\", op: \"equals\", value: \"meeting\" },\n // The person's own meetings: everyone who uses the template writes their own.\n { field: \"data.recordedByYou\", op: \"equals\", value: true },\n ],\n },\n ],\n },\n {\n id: \"pr-review\",\n name: t(\"automations.template.prReview.name\"),\n description: t(\"automations.template.prReview.description\"),\n instructions: t(\"automations.template.prReview.instructions\"),\n when: t(\"automations.template.prReview.when\"),\n schedule: null,\n triggers: [\n {\n source: { kind: \"github\" },\n eventTypes: [\"pull_request.opened\", \"pull_request.ready_for_review\"],\n // A draft is reviewed once it is marked ready for review.\n conditions: [{ field: \"data.pull_request.draft\", op: \"equals\", value: false }],\n },\n ],\n },\n {\n id: \"automation-failed\",\n name: t(\"automations.template.automationFailed.name\"),\n description: t(\"automations.template.automationFailed.description\"),\n instructions: t(\"automations.template.automationFailed.instructions\"),\n when: t(\"automations.template.automationFailed.when\"),\n schedule: null,\n triggers: [\n {\n source: { kind: \"workspace\" },\n eventTypes: [\"turn.failed\"],\n // Failed automation chats are Opengeni's own events: only chats an\n // automation ran, and only the person's own automations.\n includeOwnEvents: true,\n conditions: [\n { field: \"data.automationRunId\", op: \"exists\" },\n { field: \"data.startedByYou\", op: \"equals\", value: true },\n ],\n },\n ],\n },\n {\n id: \"issue-triage\",\n name: t(\"automations.template.issueTriage.name\"),\n description: t(\"automations.template.issueTriage.description\"),\n instructions: t(\"automations.template.issueTriage.instructions\"),\n when: t(\"automations.template.issueTriage.when\"),\n schedule: null,\n triggers: [\n {\n source: { kind: \"webhook\", adapter: \"custom\", preset: \"linear\" },\n eventTypes: [\"Issue.create\"],\n },\n ],\n },\n {\n id: \"morning-brief\",\n name: t(\"automations.template.morningBrief.name\"),\n description: t(\"automations.template.morningBrief.description\"),\n instructions: t(\"automations.template.morningBrief.instructions\"),\n schedule: { type: \"calendar\", hour: 8, minute: 0, daysOfWeek: [...WEEKDAYS] },\n triggers: [],\n },\n {\n id: \"dependency-pr\",\n name: t(\"automations.template.dependencyPr.name\"),\n description: t(\"automations.template.dependencyPr.description\"),\n instructions: t(\"automations.template.dependencyPr.instructions\"),\n schedule: { type: \"calendar\", hour: 9, minute: 30, daysOfWeek: [\"MONDAY\"] },\n triggers: [],\n },\n {\n id: \"cost-check\",\n name: t(\"automations.template.costCheck.name\"),\n description: t(\"automations.template.costCheck.description\"),\n instructions: t(\"automations.template.costCheck.instructions\"),\n schedule: { type: \"calendar\", hour: 8, minute: 0, daysOfWeek: [...WEEKDAYS] },\n triggers: [],\n },\n ];\n}\n\n/**\n * The templates a place can offer: one with event triggers only where events\n * run, and one on this workspace's own events only where those are offered.\n */\nexport function automationTemplatesFor(\n templates: readonly AutomationTemplate[],\n options: { eventTriggers: boolean; workspaceEvents?: boolean | undefined },\n): AutomationTemplate[] {\n return templates.filter(\n (template) =>\n (options.eventTriggers || template.triggers.length === 0) &&\n (options.workspaceEvents === true ||\n !template.triggers.some((trigger) => trigger.source.kind === \"workspace\")),\n );\n}\n\n/** A template saved in the workspace, as the list and the form use it. */\nexport function automationTemplateOfSaved(saved: WorkspaceAutomationTemplate): AutomationTemplate {\n return {\n id: saved.id,\n name: saved.name,\n description: saved.description,\n instructions: saved.instructions,\n schedule: saved.schedule,\n triggers: saved.triggers,\n maxRunsPerHour: saved.maxRunsPerHour,\n };\n}\n\n/* ----------------------------------------------------------------------------\n Words.\n -------------------------------------------------------------------------- */\n\n/** The kind of source a template trigger asks for, as \"Add a source\" offers it. */\nexport function automationTemplateSourceChoice(\n source: AutomationTemplateEventSource,\n): EventSourceChoice {\n return eventSourceChoiceOf({\n kind: source.kind,\n adapter: source.adapter ?? null,\n format: source.preset ? { preset: source.preset } : null,\n });\n}\n\n/** When a template runs, for its card: its own words, else its schedule or first trigger. */\nexport function automationTemplateWhenWords(\n t: OpenGeniText,\n template: AutomationTemplate,\n now: Date,\n): string {\n if (template.when) return template.when;\n const cadence = template.schedule\n ? automationTemplateCadence(template.schedule, viewerTimeZone())\n : null;\n if (cadence) {\n return describeCadence(cadence.rule, {\n timeZone: cadence.timeZone,\n now,\n text: t,\n }).short.replace(/ · .*$/u, \"\");\n }\n const [first] = template.triggers;\n if (!first) return t(\"automations.when.manual\");\n const words = t(\"automations.trigger.short\", {\n events: eventTypesLabel(t, first.eventTypes),\n source: eventSourceChoiceName(t, automationTemplateSourceChoice(first.source)),\n });\n return template.triggers.length === 1\n ? words\n : t(\"automations.triggers.shortAndMore\", { words, count: template.triggers.length - 1 });\n}\n\n/* ----------------------------------------------------------------------------\n Schedules.\n -------------------------------------------------------------------------- */\n\n/** A template's schedule in the person's time zone, as the form edits it. */\nexport function automationTemplateCadence(\n schedule: AutomationTemplateSchedule,\n timeZone: string,\n): CadenceValue {\n return schedule.type === \"calendar\"\n ? cadenceFromScheduleSpec({ ...schedule, timeZone }, timeZone)\n : cadenceFromScheduleSpec({ type: \"interval\", everySeconds: schedule.everySeconds }, timeZone);\n}\n\n/**\n * The schedule a template keeps: the time of day and days without the time\n * zone, or the interval without its start. A one-time run has none.\n */\nexport function automationTemplateSchedule(\n cadence: CadenceValue | null,\n now: Date,\n): AutomationTemplateSchedule | null {\n if (!cadence) return null;\n const spec = toScheduleSpec(cadence.rule, { timeZone: cadence.timeZone, now });\n if (spec.type === \"calendar\") {\n if (spec.daysOfMonth?.length) return null;\n return {\n type: \"calendar\",\n hour: spec.hour,\n minute: spec.minute,\n ...(spec.daysOfWeek?.length ? { daysOfWeek: [...spec.daysOfWeek] } : {}),\n };\n }\n if (spec.type === \"interval\") return { type: \"interval\", everySeconds: spec.everySeconds };\n return null;\n}\n\n/* ----------------------------------------------------------------------------\n Sources.\n -------------------------------------------------------------------------- */\n\n/** Whether `source` is of the kind a template trigger asks for. */\nexport function eventSourceFitsTemplate(\n wanted: AutomationTemplateEventSource,\n source: Pick<EventSource, \"kind\" | \"adapter\" | \"mcp\"> & Partial<Pick<EventSource, \"format\">>,\n): boolean {\n if (source.kind !== wanted.kind) return false;\n if (wanted.kind === \"webhook\") {\n const have = webhookPresetOf({ adapter: source.adapter, preset: source.format?.preset });\n const want = webhookPresetOf(wanted);\n return have.adapter === want.adapter && have.preset === want.preset;\n }\n if (wanted.kind === \"mcp\") return source.mcp?.serverId === wanted.mcpServerId;\n return true;\n}\n\n/**\n * The source a template trigger listens on for this person: the source the\n * template names when they can use it, else their first active source of its\n * kind; empty when they have none yet.\n */\nexport function automationTemplateSourceId(\n wanted: AutomationTemplateEventSource,\n sources: readonly EventSource[],\n): string {\n const usable = sources.filter(\n (source) => source.status === \"active\" && eventSourceFitsTemplate(wanted, source),\n );\n return usable.find((source) => source.id === wanted.sourceId)?.id ?? usable[0]?.id ?? \"\";\n}\n\n/**\n * Triggers still waiting for a source get one once sources load. Returns the\n * same draft when nothing changed, so it is safe to run on every load.\n */\nexport function withTemplateSources(\n events: EventTriggersDraft,\n sources: readonly EventSource[] | undefined,\n): EventTriggersDraft {\n if (!sources) return events;\n let changed = false;\n const triggers = events.triggers.map((trigger) => {\n if (trigger.sourceId || !trigger.templateSource) return trigger;\n const sourceId = automationTemplateSourceId(trigger.templateSource, sources);\n if (!sourceId) return trigger;\n changed = true;\n return { ...trigger, sourceId };\n });\n return changed ? { ...events, triggers } : events;\n}\n\n/* ----------------------------------------------------------------------------\n Drafts.\n -------------------------------------------------------------------------- */\n\n/**\n * The draft a template starts: its name, message, schedule in the person's\n * time zone, and triggers on their own sources. A trigger whose source isn't\n * there yet remembers what it asks for, so `withTemplateSources` can fill it\n * when sources load and the editor can offer to add one.\n */\nexport function automationDraftFromTemplate(\n template: AutomationTemplate,\n options: { sources?: readonly EventSource[] | undefined; timeZone?: string | undefined } = {},\n): AutomationDraft {\n const timeZone = options.timeZone ?? viewerTimeZone();\n const events: EventTriggersDraft = {\n ...emptyEventTriggersDraft(),\n maxRunsPerHour: template.maxRunsPerHour ?? DEFAULT_EVENT_RUNS_PER_HOUR,\n triggers: template.triggers.map(\n (trigger): EventTriggerDraft => ({\n ...eventTriggerDraftFrom({\n sourceId: \"\",\n eventTypes: trigger.eventTypes,\n conditions: trigger.conditions ?? [],\n includeOwnEvents: trigger.includeOwnEvents ?? false,\n arguments: trigger.arguments ?? null,\n }),\n templateSource: trigger.source,\n }),\n ),\n };\n return {\n instructions: template.instructions,\n name: template.name.slice(0, AUTOMATION_NAME_MAX_LENGTH),\n cadence: template.schedule ? automationTemplateCadence(template.schedule, timeZone) : null,\n events: withTemplateSources(events, options.sources),\n };\n}\n\n/**\n * The template an automation saves as: its message, schedule and triggers.\n * A trigger keeps the kind of its source, and names the source only when it\n * is shared with the workspace; a trigger on a source the saver can't see is\n * left out, since its kind can't be told.\n */\nexport function automationTemplateFromTask(\n t: OpenGeniText,\n task: Pick<ScheduledTask, \"name\" | \"schedule\" | \"events\" | \"agentConfig\">,\n sources: readonly EventSource[],\n input: { name?: string | undefined; description?: string | undefined; now: Date },\n): CreateAutomationTemplateRequest {\n const cadence = automationCadence(task.schedule);\n const triggers = (task.events?.triggers ?? []).flatMap((trigger) => {\n const source = sources.find((candidate) => candidate.id === trigger.sourceId);\n const wanted = templateSourceOf(trigger.sourceKind, source);\n if (!wanted) return [];\n return [\n {\n source: wanted,\n eventTypes: [...trigger.eventTypes],\n conditions: trigger.conditions.map((condition) => ({ ...condition })),\n includeOwnEvents: trigger.includeOwnEvents,\n ...(trigger.arguments && Object.keys(trigger.arguments).length > 0\n ? { arguments: { ...trigger.arguments } }\n : {}),\n },\n ];\n });\n const name = (input.name ?? \"\").trim() || task.name;\n return {\n name: automationName(t, { name, instructions: task.agentConfig.prompt }).slice(\n 0,\n AUTOMATION_TEMPLATE_NAME_MAX_LENGTH,\n ),\n description: (input.description ?? \"\").trim(),\n instructions: task.agentConfig.prompt,\n schedule: automationTemplateSchedule(cadence, input.now),\n triggers,\n maxRunsPerHour:\n triggers.length > 0 &&\n task.events &&\n task.events.maxRunsPerHour !== DEFAULT_EVENT_RUNS_PER_HOUR\n ? task.events.maxRunsPerHour\n : null,\n };\n}\n\nfunction templateSourceOf(\n kind: EventSource[\"kind\"],\n source: EventSource | undefined,\n): AutomationTemplateEventSource | null {\n const shared = source?.visibility === \"workspace\" ? { sourceId: source.id } : {};\n if (kind === \"webhook\") {\n if (!source?.adapter) return null;\n const { adapter, preset } = webhookPresetOf({\n adapter: source.adapter,\n preset: source.format?.preset,\n });\n return { kind, adapter, ...(preset ? { preset } : {}), ...shared };\n }\n if (kind === \"mcp\") {\n return source?.mcp ? { kind, mcpServerId: source.mcp.serverId, ...shared } : null;\n }\n return { kind, ...shared };\n}\n","/**\n * Templates on screen: the tile that tells a template's kind at a glance, the\n * list a person picks one from, and the dialog that saves an automation as a\n * template or renames one. Controlled; the host reads and writes templates.\n */\nimport { useState, type ReactNode } from \"react\";\nimport { CalendarClockIcon } from \"lucide-react\";\n\nimport {\n AUTOMATION_TEMPLATE_DESCRIPTION_MAX_LENGTH,\n AUTOMATION_TEMPLATE_NAME_MAX_LENGTH,\n} from \"@opengeni/contracts/automation-templates\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { Field, FieldStack, TextArea, TextInput } from \"../../ui/field\";\nimport { FormDialog } from \"../../ui/form-dialog\";\nimport { inAppClick } from \"../../ui/in-app-click\";\nimport { ListRow, RowList } from \"../../ui/list-row\";\nimport { LogoTile, type LogoTileSize } from \"../../ui/logo-tile\";\nimport {\n automationTemplateSourceChoice,\n automationTemplateWhenWords,\n type AutomationTemplate,\n} from \"./automation-template-model\";\nimport { eventSourceSubjectOfChoice } from \"./event-source-model\";\nimport { EventSourceTile, type EventSourceLogoResolver } from \"./event-source-tile\";\n\nexport interface AutomationTemplateTileProps {\n template: AutomationTemplate;\n sourceLogo?: EventSourceLogoResolver | undefined;\n /** The host's own art for this template. */\n icon?: ReactNode | undefined;\n size?: LogoTileSize | undefined;\n}\n\n/**\n * The tile for a template: the app its first event comes from, or a calendar\n * for one that runs on a schedule. `icon` replaces it, for a host's own art.\n */\nexport function AutomationTemplateTile({\n template,\n sourceLogo,\n icon,\n size,\n}: AutomationTemplateTileProps) {\n const t = useOpenGeniText();\n const [first] = template.triggers;\n if (icon || !first) {\n return <LogoTile size={size} name={template.name} icon={icon ?? <CalendarClockIcon />} />;\n }\n const choice = automationTemplateSourceChoice(first.source);\n const subject = {\n ...eventSourceSubjectOfChoice(t, choice),\n ...(first.source.kind === \"mcp\" && first.source.mcpServerId\n ? { mcp: { serverId: first.source.mcpServerId, connectionId: null } }\n : {}),\n };\n return <EventSourceTile source={subject} logo={sourceLogo} size={size} />;\n}\n\nexport interface AutomationTemplateListProps {\n /** Names the list for assistive technology: \"Templates\". */\n label: string;\n templates: readonly AutomationTemplate[];\n /** Opens the form filled in from the template. */\n onUse: (template: AutomationTemplate) => void;\n /**\n * The form's address for a template, so a row is a link that can open in\n * a new tab; a plain click still calls `onUse`.\n */\n href?: ((template: AutomationTemplate) => string) | undefined;\n sourceLogo?: EventSourceLogoResolver | undefined;\n /** A host's own tile for a template, by id. */\n icon?: ((template: AutomationTemplate) => ReactNode | undefined) | undefined;\n /** Menu items for one template, such as Rename and Delete; none for a template without any. */\n menu?: ((template: AutomationTemplate) => ReactNode | undefined) | undefined;\n /** The menu button's accessible name. */\n menuLabel?: ((template: AutomationTemplate) => string) | undefined;\n now: Date;\n}\n\n/**\n * Templates as a catalog to pick from: what each does, in up to two lines,\n * and when it runs. Opening one uses it.\n */\nexport function AutomationTemplateList({\n label,\n templates,\n onUse,\n href,\n sourceLogo,\n icon,\n menu,\n menuLabel,\n now,\n}: AutomationTemplateListProps) {\n const t = useOpenGeniText();\n return (\n <RowList label={label} variant=\"catalog\">\n {templates.map((template) => {\n const items = menu?.(template);\n return (\n <ListRow\n key={template.id}\n leading={\n <AutomationTemplateTile\n template={template}\n sourceLogo={sourceLogo}\n icon={icon?.(template)}\n />\n }\n title={template.name}\n description={template.description || undefined}\n meta={[automationTemplateWhenWords(t, template, now)]}\n menu={items}\n menuLabel={items ? menuLabel?.(template) : undefined}\n {...(href\n ? {\n href: href(template),\n linkProps: { onClick: inAppClick(() => onUse(template)) },\n }\n : { onOpen: () => onUse(template) })}\n />\n );\n })}\n </RowList>\n );\n}\n\nexport interface AutomationTemplateDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Save an automation as a new template, or rename a saved one. */\n mode: \"save\" | \"rename\";\n /** The name and description it opens with. */\n initial: { name: string; description: string };\n /** Saves; a thrown error shows in the dialog and keeps it open. */\n onSubmit: (values: { name: string; description: string }) => Promise<void>;\n}\n\n/** The name and description of a template, to save one or rename it. */\nexport function AutomationTemplateDialog({\n open,\n onOpenChange,\n mode,\n initial,\n onSubmit,\n}: AutomationTemplateDialogProps) {\n const t = useOpenGeniText();\n const [name, setName] = useState(initial.name);\n const [description, setDescription] = useState(initial.description);\n const [nameError, setNameError] = useState<string | null>(null);\n const [opened, setOpened] = useState(open);\n // Each opening starts from what it was opened with.\n if (open !== opened) {\n setOpened(open);\n if (open) {\n setName(initial.name);\n setDescription(initial.description);\n setNameError(null);\n }\n }\n return (\n <FormDialog\n open={open}\n onOpenChange={onOpenChange}\n size=\"sm\"\n title={\n mode === \"save\"\n ? t(\"automations.templateDialog.saveTitle\")\n : t(\"automations.templateDialog.renameTitle\")\n }\n description={mode === \"save\" ? t(\"automations.templateDialog.saveDescription\") : undefined}\n submitLabel={\n mode === \"save\"\n ? t(\"automations.templateDialog.saveSubmit\")\n : t(\"automations.templateDialog.renameSubmit\")\n }\n pendingLabel={t(\"automations.templateDialog.saving\")}\n cancelLabel={t(\"automations.form.cancel\")}\n onSubmit={async () => {\n const trimmed = name.trim();\n if (!trimmed) {\n setNameError(t(\"automations.templateDialog.nameRequired\"));\n return false;\n }\n await onSubmit({ name: trimmed, description: description.trim() });\n return true;\n }}\n >\n <FieldStack>\n <Field label={t(\"automations.templateDialog.name\")} error={nameError ?? undefined}>\n <TextInput\n value={name}\n maxLength={AUTOMATION_TEMPLATE_NAME_MAX_LENGTH}\n autoComplete=\"off\"\n onChange={(event) => {\n setName(event.target.value);\n setNameError(null);\n }}\n />\n </Field>\n <Field\n label={t(\"automations.templateDialog.description\")}\n hint={t(\"automations.templateDialog.descriptionHint\")}\n >\n <TextArea\n value={description}\n rows={2}\n maxLength={AUTOMATION_TEMPLATE_DESCRIPTION_MAX_LENGTH}\n onChange={(event) => setDescription(event.target.value)}\n />\n </Field>\n </FieldStack>\n </FormDialog>\n );\n}\n","/**\n * Sources a person can pick before they have them: the ones the server lists\n * as ready (MCP servers they are signed in to that offer events, their Gmail\n * accounts and this workspace's own events), and the host's own MCP servers.\n * None needs setting up, so each stands in for the person's own source until\n * it is used, and that source is added the first time its events are read or\n * an automation is saved on it.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport {\n readyEventSourceKey,\n readyEventSourceRequest,\n type ReadyEventSourceKind,\n} from \"@opengeni/contracts/event-triggers\";\nimport type {\n EventSource,\n EventTypeDescriptor,\n OpenGeniClient,\n ReadyEventSource,\n} from \"@opengeni/sdk\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport type { EventTriggersDraft } from \"./event-trigger-model\";\n\n/** An MCP server whose events people can pick without adding a source first. */\nexport interface AutomationEventServer {\n /** The MCP server id as configured for the workspace. */\n serverId: string;\n /** Its name in the source picker. Default: the server id. */\n name?: string | undefined;\n}\n\nexport interface EventSourceStandInsOptions {\n /** Adds a stand-in's source and reads event types. */\n client: Pick<OpenGeniClient, \"createEventSource\" | \"listEventSourceTypes\">;\n workspaceId: string;\n /** The sources the person can use; undefined while they load. */\n sources: EventSource[] | undefined;\n /** What the server lists as ready to use (`listReadyEventSources`). */\n readySources?: readonly ReadyEventSource[] | undefined;\n /** MCP servers whose events people can pick right away, such as the host's own. */\n eventServers?: readonly AutomationEventServer[] | undefined;\n /** Offer this workspace's own events, such as a meeting's transcript being ready. */\n workspaceEvents?: boolean | undefined;\n}\n\nexport interface EventSourceStandIns {\n /** The person's sources, then a stand-in for each one they don't have yet. */\n sources: EventSource[] | undefined;\n /** Reads a source's event types; a stand-in's source is added first. */\n loadEventTypes: (sourceId: string) => Promise<EventTypeDescriptor[]>;\n /** The triggers on the person's own sources, adding the source behind any stand-in. */\n realEvents: (events: EventTriggersDraft) => Promise<EventTriggersDraft>;\n /** True when a trigger is on a stand-in, so the host reads its sources again after saving. */\n usesStandIn: (events: EventTriggersDraft) => boolean;\n}\n\n/** A stand-in's id is the ready source's key, which never looks like a source id. */\nfunction isStandIn(sourceId: string): boolean {\n return readyEventSourceRequest(sourceId) !== null;\n}\n\nfunction standIn(\n workspaceId: string,\n ready: { key: string; kind: ReadyEventSourceKind; name: string },\n): EventSource {\n const request = readyEventSourceRequest(ready.key);\n return {\n id: ready.key,\n workspaceId,\n kind: ready.kind,\n adapter: null,\n format: null,\n name: ready.name,\n ownerSubjectId: null,\n visibility: \"private\",\n status: \"active\",\n statusReason: null,\n statusReasonCode: null,\n statusReasonDetail: null,\n webhookUrl: null,\n awaitingSigningSecret: false,\n mcp: request?.kind === \"mcp\" ? { serverId: request.serverId, connectionId: null } : null,\n lastDeliveryAt: null,\n createdAt: \"\",\n updatedAt: \"\",\n };\n}\n\n/** The sources a trigger can point at, with stand-ins for the ones added on first use. */\nexport function useEventSourceStandIns({\n client,\n workspaceId,\n sources,\n readySources,\n eventServers,\n workspaceEvents = false,\n}: EventSourceStandInsOptions): EventSourceStandIns {\n const t = useOpenGeniText();\n const workspaceName = t(\"automations.source.workspace.name\");\n // The source each used stand-in became: once the person has it, it shows instead.\n const [added, setAdded] = useState<ReadonlyMap<string, string>>(() => new Map());\n const withStandIns = useMemo(() => {\n if (!sources) return undefined;\n const ready = new Map<string, { key: string; kind: ReadyEventSourceKind; name: string }>();\n for (const entry of readySources ?? []) {\n if (entry.kind === \"workspace\" && !workspaceEvents) continue;\n ready.set(entry.key, entry);\n }\n for (const server of eventServers ?? []) {\n const key = readyEventSourceKey({ kind: \"mcp\", serverId: server.serverId });\n ready.set(key, {\n key,\n kind: \"mcp\",\n name: server.name ?? ready.get(key)?.name ?? server.serverId,\n });\n }\n if (workspaceEvents) {\n const key = readyEventSourceKey({ kind: \"workspace\" });\n ready.set(key, { key, kind: \"workspace\", name: workspaceName });\n }\n const has = (key: string, kind: ReadyEventSourceKind): boolean => {\n const id = added.get(key);\n if (id !== undefined && sources.some((source) => source.id === id)) return true;\n const request = readyEventSourceRequest(key);\n if (request?.kind === \"mcp\") {\n return sources.some(\n (source) => source.kind === \"mcp\" && source.mcp?.serverId === request.serverId,\n );\n }\n // A person has one This workspace source.\n return kind === \"workspace\" && sources.some((source) => source.kind === \"workspace\");\n };\n const extra = [...ready.values()]\n .filter((entry) => !has(entry.key, entry.kind))\n .map((entry) => standIn(workspaceId, entry));\n return extra.length > 0 ? [...sources, ...extra] : sources;\n }, [added, eventServers, readySources, sources, workspaceEvents, workspaceId, workspaceName]);\n\n // One creation per stand-in, shared by every read and save that needs it.\n const adding = useRef(new Map<string, Promise<string>>());\n const realSourceId = useCallback(\n (sourceId: string): Promise<string> => {\n const request = readyEventSourceRequest(sourceId);\n if (!request) return Promise.resolve(sourceId);\n let pending = adding.current.get(sourceId);\n if (!pending) {\n const name =\n request.kind === \"mcp\"\n ? eventServers?.find((server) => server.serverId === request.serverId)?.name\n : undefined;\n pending = client\n .createEventSource(workspaceId, { ...request, ...(name ? { name } : {}) })\n .then((created) => {\n setAdded((current) => new Map(current).set(sourceId, created.source.id));\n return created.source.id;\n });\n adding.current.set(sourceId, pending);\n pending.catch(() => adding.current.delete(sourceId));\n }\n return pending;\n },\n [client, eventServers, workspaceId],\n );\n const loadEventTypes = useCallback(\n async (sourceId: string) =>\n client.listEventSourceTypes(workspaceId, await realSourceId(sourceId)),\n [client, realSourceId, workspaceId],\n );\n const realEvents = useCallback(\n async (events: EventTriggersDraft): Promise<EventTriggersDraft> => ({\n ...events,\n triggers: await Promise.all(\n events.triggers.map(async (trigger) => ({\n ...trigger,\n sourceId: await realSourceId(trigger.sourceId),\n })),\n ),\n }),\n [realSourceId],\n );\n const usesStandIn = useCallback(\n (events: EventTriggersDraft) => events.triggers.some((trigger) => isStandIn(trigger.sourceId)),\n [],\n );\n return { sources: withStandIns, loadEventTypes, realEvents, usesStandIn };\n}\n","/**\n * What an automation listens for, read-only: one line per trigger with its\n * source's logo, the events, where they come from and only-when conditions,\n * and why a trigger is held back when it is.\n */\nimport type { MouseEvent } from \"react\";\n\nimport type { EventSource, EventTrigger } from \"@opengeni/sdk\";\n\nimport { useOpenGeniText } from \"../../messages/runtime\";\nimport { StatusBadge } from \"../../ui/status-badge\";\nimport { eventSourceStatusBadge } from \"./event-source-model\";\nimport { EventSourceTile, type EventSourceLogoResolver } from \"./event-source-tile\";\nimport { eventTriggerWords } from \"./event-trigger-model\";\n\nexport interface EventTriggerSummaryProps {\n triggers: readonly EventTrigger[];\n /** The sources the viewer can see; a trigger on any other reads as hidden. */\n sources: readonly EventSource[] | undefined;\n sourceLogo?: EventSourceLogoResolver | undefined;\n /** A link to a source's page, when the host has one. */\n sourceHref?: ((sourceId: string) => string) | undefined;\n /** In-app navigation for that link; a plain link without it. */\n onOpenSource?: ((sourceId: string, event: MouseEvent<HTMLAnchorElement>) => void) | undefined;\n}\n\nexport function EventTriggerSummary({\n triggers,\n sources,\n sourceLogo,\n sourceHref,\n onOpenSource,\n}: EventTriggerSummaryProps) {\n const t = useOpenGeniText();\n return (\n <ul className=\"m-0 flex min-w-0 list-none flex-col gap-3 p-0\">\n {triggers.map((trigger) => {\n const source = sources?.find((candidate) => candidate.id === trigger.sourceId);\n const words = eventTriggerWords(t, trigger, sources ?? []);\n const held = eventSourceStatusBadge(t, trigger, source?.name ?? words.source);\n return (\n <li key={trigger.id} className=\"flex min-w-0 items-start gap-3\">\n <EventSourceTile\n source={\n source ?? { kind: trigger.sourceKind, adapter: null, name: words.source, mcp: null }\n }\n logo={sourceLogo}\n size=\"sm\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"m-0 text-sm leading-5 break-words text-fg\">{words.events}</p>\n <p className=\"m-0 text-xs leading-4.5 break-words text-fg-muted\">\n {t(\"automations.summary.from\")}{\" \"}\n {!source ? (\n t(\"automations.trigger.hiddenSourceInline\")\n ) : sourceHref ? (\n <a\n className=\"og-link\"\n href={sourceHref(source.id)}\n onClick={onOpenSource ? (event) => onOpenSource(source.id, event) : undefined}\n >\n {source.name}\n </a>\n ) : (\n source.name\n )}\n {words.conditions ? `, ${words.conditions}` : null}\n </p>\n </div>\n {held ? (\n <StatusBadge\n variant=\"dot\"\n status={held.status}\n reason={held.reason ?? undefined}\n className=\"shrink-0\"\n >\n {held.label}\n </StatusBadge>\n ) : null}\n </li>\n );\n })}\n </ul>\n );\n}\n","// @opengeni/react/automations: automations for any host. `AutomationsPanel`\n// is the drop-in: a workspace's or a chat's automations, with create (from\n// scratch or a template), edit, on and off, Run now and recent runs, read and\n// written through the host's client. The parts it is built from stay\n// available for a host's own pages: the form and its \"When\" (schedule and\n// event triggers), the trigger editor, templates, the event source tile and\n// words, the delivery log and event rows, and the pure models behind them.\n// Apart from the panel and `useEventSourceStandIns` nothing here fetches on\n// its own or assumes a router.\nimport type { EventDelivery } from \"@opengeni/sdk\";\nimport { createOpenGeniText } from \"./messages/runtime\";\nimport type { RowListColumn } from \"./ui/list-row\";\nimport type { ProductStatus } from \"./ui/status-badge\";\nimport { eventRowColumns as rowColumns } from \"./components/automations/event-rows\";\nimport {\n eventDeliveryStatusBadge as deliveryStatusBadge,\n eventSourceChoices as sourceChoices,\n type EventSourceChoiceMeta as ChoiceMeta,\n} from \"./components/automations/event-source-model\";\nimport { eventCommonFields as commonFields } from \"./components/automations/event-trigger-model\";\n\nexport {\n AutomationsPanel,\n type AutomationsPanelProps,\n} from \"./components/automations/automations-panel\";\nexport {\n useEventSourceStandIns,\n type AutomationEventServer,\n type EventSourceStandIns,\n type EventSourceStandInsOptions,\n} from \"./components/automations/event-source-stand-ins\";\nexport {\n automationDraftFromTemplate,\n automationTemplateCadence,\n automationTemplateFromTask,\n automationTemplateOfSaved,\n automationTemplateSchedule,\n automationTemplateSourceChoice,\n automationTemplateSourceId,\n automationTemplatesFor,\n automationTemplateWhenWords,\n builtinAutomationTemplates,\n eventSourceFitsTemplate,\n withTemplateSources,\n type AutomationTemplate,\n} from \"./components/automations/automation-template-model\";\nexport {\n AutomationTemplateDialog,\n AutomationTemplateList,\n AutomationTemplateTile,\n type AutomationTemplateDialogProps,\n type AutomationTemplateListProps,\n type AutomationTemplateTileProps,\n} from \"./components/automations/automation-template-parts\";\nexport { AutomationForm, type AutomationFormProps } from \"./components/automations/automation-form\";\nexport {\n AUTOMATION_FREQUENCIES,\n AutomationWhenField,\n type AutomationWhenFieldProps,\n} from \"./components/automations/automation-when-field\";\nexport {\n AUTOMATION_NAME_MAX_LENGTH,\n automationCadence,\n automationCadenceIssue,\n automationCadenceRepeats,\n automationCadenceWords,\n automationCreateRequest,\n automationDraftFrom,\n automationListensForEvents,\n automationName,\n automationNextRun,\n automationRunErrorText,\n automationRunEventsLabel,\n automationRunStatusLabel,\n automationRunTriggerLabel,\n automationScheduleSpec,\n automationScheduleWords,\n automationUpdateRequest,\n automationWhenSentence,\n automationWhenWords,\n defaultAutomationCadence,\n deriveAutomationName,\n hasAutomationDraftIssues,\n hasEventTriggers,\n isAgentAutomation,\n isFinishedOnce,\n newAutomationDraft,\n sessionAutomationWaitWords,\n sortAutomations,\n validateAutomationDraft,\n viewerTimeZone,\n} from \"./components/automations/automation-model\";\nexport type {\n AutomationDestination,\n AutomationDraft,\n AutomationDraftIssues,\n AutomationScheduleWords,\n SessionAutomationWaitWords,\n} from \"./components/automations/automation-model\";\nexport {\n EventArgumentsField,\n type EventArgumentsFieldProps,\n} from \"./components/automations/event-arguments-field\";\nexport {\n eventArgumentFields,\n eventArgumentLabel,\n eventArgumentsForEvent,\n eventArgumentsValue,\n withEventArgument,\n} from \"./components/automations/event-arguments-model\";\nexport type {\n EventArgumentField,\n EventArgumentOption,\n} from \"./components/automations/event-arguments-model\";\nexport {\n DEFAULT_EVENT_RUNS_PER_HOUR,\n EVENT_CONDITION_OPERATORS,\n eventCommonFields,\n EVENT_TRIGGER_CONDITIONS_MAX,\n EVENT_TRIGGER_TYPES_MAX,\n EVENT_TRIGGERS_PER_AUTOMATION_MAX,\n MAX_EVENT_RUNS_PER_HOUR,\n emptyEventTriggersDraft,\n eventConditionDraftFrom,\n eventConditionFieldSuggestions,\n eventConditionFromDraft,\n eventConditionOperator,\n eventConditionOperatorLabel,\n eventConditionsLabel,\n eventTriggerDraftFrom,\n eventTriggersDraftFrom,\n eventTriggersInputFrom,\n eventTriggersShortLabel,\n eventTriggerWords,\n eventTypeDescriptor,\n eventTypeIssue,\n eventTypeLabel,\n eventTypesLabel,\n hasEventTriggerIssues,\n newEventConditionDraft,\n newEventTriggerDraft,\n sameEventTriggers,\n validateEventTriggers,\n} from \"./components/automations/event-trigger-model\";\nexport type {\n EventConditionDraft,\n EventConditionOperatorOption,\n EventTriggerDraft,\n EventTriggerIssues,\n EventTriggersDraft,\n EventTriggersIssues,\n EventTriggerWords,\n} from \"./components/automations/event-trigger-model\";\nexport {\n WEBHOOK_ADAPTER_OF,\n byteSizeLabel,\n createEventSourceRequest,\n deliveryEventsLabel,\n deliveryTitle,\n eventActorLabel,\n eventDeliveryStatusBadge,\n eventSourceAddLabel,\n eventSourceChoiceMeta,\n eventSourceChoiceName,\n eventSourceChoiceOf,\n eventSourceChoices,\n eventSourceKindLabel,\n eventSourceProviderDomain,\n eventSourceStatusBadge,\n eventSourceSubjectOfChoice,\n eventStatusReasonText,\n isEventSourceChoice,\n pastedWebhookSetup,\n} from \"./components/automations/event-source-model\";\nexport type {\n EventSourceChoice,\n EventSourceChoiceMeta,\n EventStatusReasonParts,\n PastedWebhookSetup,\n} from \"./components/automations/event-source-model\";\nexport {\n EventSourceTile,\n eventSourceLogoResolver,\n} from \"./components/automations/event-source-tile\";\nexport type {\n EventSourceLogoResolver,\n EventSourceLogoSubject,\n} from \"./components/automations/event-source-tile\";\nexport {\n EventConditionsEditor,\n EventTriggerEditor,\n EventTriggersField,\n EventTypePicker,\n useEventTypes,\n} from \"./components/automations/event-trigger-editor\";\nexport type {\n EventTriggerEditorProps,\n EventTriggersFieldProps,\n EventTypesState,\n} from \"./components/automations/event-trigger-editor\";\nexport {\n EventTriggerSummary,\n type EventTriggerSummaryProps,\n} from \"./components/automations/event-trigger-summary\";\nexport {\n EventDeliveryRow,\n InboundEventDetail,\n InboundEventRow,\n eventRowColumns,\n inboundEventMeta,\n} from \"./components/automations/event-rows\";\nexport {\n SESSION_AUTOMATION_WAIT_LABEL,\n sessionAutomationWait,\n sessionAutomationWaitLabel,\n type SessionAutomationWait,\n} from \"./session-list-model\";\n\n// English-only constants from before the automation parts took the host's text.\n// They stay until the next major; new code calls the functions above with `t`.\nconst english = createOpenGeniText();\n\n/** @deprecated English only. Use `eventSourceChoices(t)`. */\nexport const EVENT_SOURCE_CHOICES: readonly ChoiceMeta[] = sourceChoices(english);\n\n/** @deprecated English only. Use `eventDeliveryStatusBadge(t, status)`. */\nexport const EVENT_DELIVERY_STATUS: Record<\n EventDelivery[\"status\"],\n { status: ProductStatus; label: string }\n> = {\n accepted: deliveryStatusBadge(english, \"accepted\"),\n ignored: deliveryStatusBadge(english, \"ignored\"),\n rejected: deliveryStatusBadge(english, \"rejected\"),\n failed: deliveryStatusBadge(english, \"failed\"),\n};\n\n/** @deprecated English only. Use `eventCommonFields(t)`. */\nexport const EVENT_COMMON_FIELDS: ReadonlyArray<{ field: string; description: string }> =\n commonFields(english);\n\n/** @deprecated English only. Use `eventRowColumns(t)`. */\nexport const INBOUND_EVENT_COLUMNS: RowListColumn[] = rowColumns(english);\n\n/** @deprecated English only. Use `eventRowColumns(t)`. */\nexport const EVENT_DELIVERY_COLUMNS: RowListColumn[] = rowColumns(english);\n"],"mappings":"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","names":["useCallback","useEffect","useRef","useState","CalendarClockIcon","PlusIcon","useMemo","useState","CircleAlertIcon","useId","useMemo","PlusIcon","Trash2Icon","useMemo","jsx","jsxs","jsx","webhookPresetOf","webhookPresetOf","Fragment","jsx","jsxs","useMemo","jsx","jsxs","viewerTimeZone","useId","useMemo","PlusIcon","Trash2Icon","jsx","jsxs","useState","useMemo","CircleAlertIcon","useState","AUTOMATION_TEMPLATE_NAME_MAX_LENGTH","jsx","jsxs","useState","AUTOMATION_TEMPLATE_NAME_MAX_LENGTH","useMemo","useRef","useState","useState","useMemo","useRef","jsx","jsxs","Fragment","jsx","jsxs","useState","useCallback","useEffect","PlusIcon","CalendarClockIcon","useRef"]}
|