@kortix/ui 0.14.4 → 0.14.6
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/README.md +8 -4
- package/dist/access/access/access-dialog.js +8 -5
- package/dist/access/access/copy-row.js +2 -2
- package/dist/access/sharing-picker.js +2 -1
- package/dist/browser/app-in-browser.js +5 -3
- package/dist/browser/browser-panel.js +6 -6
- package/dist/browser/sandbox-browser-chrome.d.ts +4 -1
- package/dist/browser/sandbox-browser-chrome.js +4 -3
- package/dist/customize/agents/agent-access.d.ts +20 -0
- package/dist/customize/agents/agent-access.js +17 -0
- package/dist/customize/agents/agent-grant-pages.js +5 -6
- package/dist/customize/agents/agent-page.js +2 -1
- package/dist/customize/agents/agents-page.js +18 -1
- package/dist/customize/connectors/add-mcp/add-mcp-server.js +4 -2
- package/dist/customize/connectors/connector-routes.d.ts +3 -1
- package/dist/customize/connectors/connector-routes.js +18 -0
- package/dist/customize/connectors/connectors-page.js +23 -4
- package/dist/customize/connectors/detail/connector-advanced-tools.js +4 -6
- package/dist/customize/providers/provider-accordion.js +2 -1
- package/dist/customize/providers/provider-connect.js +2 -1
- package/dist/customize/sections/component/telegram-channel-row.js +1 -1
- package/dist/customize/sections/connector-connection-modal.js +11 -9
- package/dist/customize/sections/connectors-view.js +11 -13
- package/dist/customize/sections/llm-provider/constants.d.ts +0 -1
- package/dist/customize/sections/llm-provider/constants.js +0 -2
- package/dist/customize/sections/llm-provider/models-tab-group.d.ts +1 -1
- package/dist/customize/sections/llm-provider/models-tab-group.js +7 -4
- package/dist/customize/sections/llm-provider/models-tab-row.d.ts +2 -18
- package/dist/customize/sections/llm-provider/models-tab-row.js +6 -30
- package/dist/customize/sections/llm-provider/models-tab.d.ts +0 -1
- package/dist/customize/sections/llm-provider/models-tab.js +1 -10
- package/dist/customize/sections/llm-provider/use-connected-providers.js +2 -2
- package/dist/customize/sections/llm-provider/utils.d.ts +1 -1
- package/dist/customize/sections/llm-provider/utils.js +7 -14
- package/dist/customize/sections/view/gateway/_shared.js +1 -2
- package/dist/customize/sections/view/gateway/gateway-routing.js +18 -20
- package/dist/customize/sections/view/sandbox-provider-coverage.d.ts +3 -18
- package/dist/customize/sections/view/sandbox-provider-coverage.js +7 -27
- package/dist/customize/settings/rail-copy-context.js +5 -3
- package/dist/customize/settings/tabs/sandbox-tab.d.ts +2 -27
- package/dist/customize/settings/tabs/sandbox-tab.js +13 -112
- package/dist/customize/settings/tabs/sandbox-template-form.js +9 -12
- package/dist/customize/shared/capability-tabs.js +2 -1
- package/dist/customize/shared/entity/entity-modal.d.ts +5 -1
- package/dist/customize/shared/entity/entity-modal.js +7 -4
- package/dist/customize/skills/remove-skill-button.d.ts +16 -0
- package/dist/customize/skills/remove-skill-button.js +42 -0
- package/dist/customize/skills/skills-page.js +4 -6
- package/dist/customize/triggers/schedule/event-trigger-copy.js +3 -2
- package/dist/customize/triggers/schedule/schedule-builder.js +7 -4
- package/dist/customize/triggers/schedule/trigger-composer.js +5 -2
- package/dist/customize/triggers/schedule/trigger-list.d.ts +0 -2
- package/dist/customize/triggers/schedule/trigger-list.js +1 -18
- package/dist/customize/triggers/schedule/trigger-tile.d.ts +1 -32
- package/dist/customize/triggers/schedule/trigger-tile.js +1 -16
- package/dist/customize/triggers/schedule/when-event.js +1 -1
- package/dist/diff/diff-view.js +9 -10
- package/dist/files/editor/code-editor.js +2 -3
- package/dist/files/project/components/change-request-detail-dialog.d.ts +3 -1
- package/dist/files/project/components/change-request-detail-dialog.js +3 -5
- package/dist/files/project/components/change-request-status-badge.d.ts +12 -0
- package/dist/files/project/components/change-request-status-badge.js +27 -0
- package/dist/files/project/components/change-requests-panel.js +1 -1
- package/dist/files/project/components/drive-explorer.js +2 -1
- package/dist/files/project/components/drive-grid-view.js +11 -7
- package/dist/files/project/components/drive-list-view.js +4 -4
- package/dist/files/project/components/file-breadcrumbs.js +1 -1
- package/dist/files/project/components/file-explorer-page.js +1 -1
- package/dist/files/project/components/file-history-popover.js +1 -6
- package/dist/files/project/components/file-search.js +6 -1
- package/dist/files/project/components/open-change-request-dialog.js +2 -1
- package/dist/files/project/components/version-selector-logic.d.ts +11 -0
- package/dist/files/project/components/version-selector-logic.js +26 -0
- package/dist/files/project/components/version-selector.js +11 -20
- package/dist/files/project/hooks/use-change-requests.d.ts +14 -1
- package/dist/files/project/hooks/use-change-requests.js +44 -25
- package/dist/files/project/hooks/use-server-health.js +17 -15
- package/dist/files/renderers/docx/docx-viewer.js +4 -6
- package/dist/files/renderers/image-renderer.js +6 -24
- package/dist/files/renderers/pdf/pdf-renderer.d.ts +3 -1
- package/dist/files/renderers/pdf/pdf-renderer.js +2 -2
- package/dist/files/renderers/pdf/pdf-viewer.d.ts +3 -0
- package/dist/files/renderers/pdf/pdf-viewer.js +16 -7
- package/dist/files/renderers/presentation/FullScreenPresentationViewer.js +2 -11
- package/dist/files/renderers/show-content-renderer.js +1 -1
- package/dist/files/renderers/sqlite-renderer.js +8 -3
- package/dist/files/renderers/xlsx/xlsx-viewer.js +15 -16
- package/dist/files/tree/components/file-tree-item.js +1 -1
- package/dist/files/viewer/file-content-renderer.d.ts +4 -1
- package/dist/files/viewer/file-content-renderer.js +2 -2
- package/dist/files/viewer/file-preview-modal.js +1 -1
- package/dist/files/viewer/use-file-content-state.js +1 -1
- package/dist/i18n/en.d.ts +36 -35
- package/dist/i18n/en.js +45 -44
- package/dist/index.d.ts +1 -1
- package/dist/internal/desktop/desktop-back-button.js +5 -3
- package/dist/internal/hooks/use-auto-scroll.js +5 -3
- package/dist/internal/hooks/use-notification-center.js +21 -15
- package/dist/internal/hooks/use-review-session-summary.d.ts +6 -0
- package/dist/internal/hooks/use-review-session-summary.js +11 -0
- package/dist/internal/lib/browser-error-noise.d.ts +1 -1
- package/dist/internal/lib/browser-error-noise.js +1 -1
- package/dist/internal/lib/browser-noise/rules/rejections.d.ts +10 -0
- package/dist/internal/lib/browser-noise/rules/rejections.js +27 -1
- package/dist/internal/lib/provider-branding.js +14 -3
- package/dist/internal/lib/trigger-clock.d.ts +42 -0
- package/dist/internal/lib/trigger-clock.js +34 -0
- package/dist/internal/lib/web-notifications.d.ts +6 -0
- package/dist/internal/lib/web-notifications.js +57 -7
- package/dist/internal/notifications/notification-bell.d.ts +13 -0
- package/dist/internal/notifications/notification-bell.js +1 -1
- package/dist/internal/notifications/notification-rows.js +2 -1
- package/dist/internal/outcomes/outcome-types.d.ts +5 -0
- package/dist/internal/reminders/reminder-filter.d.ts +12 -0
- package/dist/internal/reminders/reminder-filter.js +34 -0
- package/dist/internal/reminders/reminder-format.d.ts +6 -0
- package/dist/internal/reminders/reminder-format.js +20 -2
- package/dist/internal/stores/kortix-computer-store.d.ts +1 -1
- package/dist/internal/stores/session-hover-store.d.ts +20 -5
- package/dist/internal/stores/session-hover-store.js +31 -13
- package/dist/internal/stores/session-panel-memory-store.js +2 -0
- package/dist/markdown/code/inline-code.js +8 -0
- package/dist/markdown/code/output-paths-context.d.ts +18 -0
- package/dist/markdown/code/output-paths-context.js +35 -0
- package/dist/markdown/genui/components/charts.js +6 -5
- package/dist/primitives/count-badge.d.ts +3 -1
- package/dist/primitives/count-badge.js +3 -3
- package/dist/primitives/glyph-paths-source.js +1 -1
- package/dist/primitives/glyph-paths.generated.js +1 -1
- package/dist/primitives/map.js +2 -1
- package/dist/primitives/preview-image.js +4 -2
- package/dist/primitives/textarea.js +1 -1
- package/dist/primitives/typed-title.js +12 -14
- package/dist/primitives/typing-animation.js +4 -2
- package/dist/providers/ui-provider.d.ts +57 -0
- package/dist/providers/ui-provider.js +4 -0
- package/dist/session/composer/ComposerCard.d.ts +2 -0
- package/dist/session/composer/ComposerCard.js +5 -1
- package/dist/session/composer/agent-selector.js +17 -5
- package/dist/session/composer/composer-chat-input.js +5 -3
- package/dist/session/composer/composer-logic.js +8 -7
- package/dist/session/composer/composer-toolbar.js +4 -2
- package/dist/session/composer/composer-underbar.js +3 -1
- package/dist/session/composer/composer.js +34 -5
- package/dist/session/composer/draft/composer-draft.js +4 -4
- package/dist/session/composer/menus/slash-actions.d.ts +22 -2
- package/dist/session/composer/menus/slash-actions.js +20 -0
- package/dist/session/composer/menus/slash-items.js +19 -3
- package/dist/session/composer/pasted-text.js +3 -2
- package/dist/session/composer/stores/queued-draft-store.js +3 -2
- package/dist/session/header/reminder-parts.d.ts +294 -0
- package/dist/session/header/reminder-parts.js +120 -0
- package/dist/session/header/session-reminders-indicator.d.ts +13 -0
- package/dist/session/header/session-reminders-indicator.js +142 -35
- package/dist/session/media/sandbox-url-detector.js +0 -7
- package/dist/session/models/model-availability.d.ts +23 -0
- package/dist/session/models/model-availability.js +20 -0
- package/dist/session/models/model-grouping.js +1 -4
- package/dist/session/models/model-selector.js +23 -14
- package/dist/session/models/use-model-connection-gate.js +4 -1
- package/dist/session/outcomes/change-request-outcomes.js +24 -3
- package/dist/session/outcomes/session-outcomes-provider.d.ts +3 -1
- package/dist/session/outcomes/session-outcomes-provider.js +31 -3
- package/dist/session/overrides/provider-secret-pool-editor.js +2 -1
- package/dist/session/overrides/session-overrides-composer.d.ts +1 -1
- package/dist/session/overrides/session-overrides-composer.js +5 -1
- package/dist/session/panel/advanced/advanced-panel.js +3 -7
- package/dist/session/panel/easy/app-preview.js +12 -2
- package/dist/session/panel/easy/easy-panel-logic.d.ts +1 -1
- package/dist/session/panel/easy/easy-panel-logic.js +1 -1
- package/dist/session/panel/easy/outputs-card.js +2 -1
- package/dist/session/panel/easy/panel-card.js +5 -3
- package/dist/session/panel/easy/preview-load.d.ts +14 -0
- package/dist/session/panel/easy/preview-load.js +15 -0
- package/dist/session/panel/easy/step-detail-body.js +2 -7
- package/dist/session/panel/mobile-tool-drawer.js +4 -2
- package/dist/session/panel/open-session-quick-view.js +2 -1
- package/dist/session/panel/panel-fallback.js +8 -4
- package/dist/session/panel/session-panel-provider.d.ts +1 -0
- package/dist/session/panel/session-panel-provider.js +19 -3
- package/dist/session/panel/session-reminders-panel.d.ts +4 -0
- package/dist/session/panel/session-reminders-panel.js +109 -0
- package/dist/session/panel/shared/use-panel-derivations.js +6 -4
- package/dist/session/panel/shared/use-panel-handoffs.d.ts +2 -2
- package/dist/session/panel/shared/use-panel-handoffs.js +5 -1
- package/dist/session/panel/use-session-panel-layout.js +7 -5
- package/dist/session/print/session-print-header.d.ts +0 -10
- package/dist/session/print/session-print-header.js +25 -9
- package/dist/session/status/session-surface.js +1 -1
- package/dist/session/thread/optimistic-turn.d.ts +5 -1
- package/dist/session/thread/optimistic-turn.js +8 -6
- package/dist/session/thread/session-chat.d.ts +6 -1
- package/dist/session/thread/session-chat.js +34 -12
- package/dist/session/thread/session-history.js +3 -1
- package/dist/session/thread/session-thread.d.ts +10 -1
- package/dist/session/thread/session-thread.js +2 -2
- package/dist/session/thread/transcript.js +13 -7
- package/dist/session/tool/shared/file-list.js +19 -2
- package/dist/session/tool/shared/infrastructure-contexts.d.ts +7 -0
- package/dist/session/tool/shared/infrastructure-contexts.js +7 -0
- package/dist/session/tool/shared/infrastructure-output.js +9 -5
- package/dist/session/tool/shared/infrastructure-row-header.js +9 -1
- package/dist/session/tool/shared/infrastructure-rows.js +7 -5
- package/dist/session/tool/tools/bash-tool.js +10 -6
- package/dist/session/tool/tools/web-search-tool.js +25 -3
- package/dist/session/turn/burst-step-body.js +4 -0
- package/dist/session/turn/recovered-failures.d.ts +8 -0
- package/dist/session/turn/recovered-failures.js +32 -0
- package/dist/session/turn/streaming-cadence.js +5 -8
- package/dist/styles.css +1 -1
- package/dist/terminal/session-terminal-panel.js +3 -5
- package/dist/theme/theme.js +2 -1
- package/dist/workspace/projects/modal/github-import-pickers.js +7 -6
- package/dist/workspace/review/review-center.js +13 -10
- package/dist/workspace/session-workspace.js +5 -9
- package/dist/workspace/sessions/deleted-session-row.js +5 -2
- package/dist/workspace/sidebar/footer/project-computer-nav.js +6 -4
- package/dist/workspace/sidebar/footer/project-mcp-nav.js +6 -2
- package/dist/workspace/sidebar/modal/rename-session-modal.js +8 -3
- package/dist/workspace/sidebar/project-session-list.js +52 -55
- package/dist/workspace/sidebar/session-brief-hover-card.d.ts +35 -18
- package/dist/workspace/sidebar/session-brief-hover-card.js +114 -37
- package/dist/workspace/sidebar/session-status-mark.d.ts +15 -1
- package/dist/workspace/sidebar/session-status-mark.js +63 -17
- package/package.json +7 -3
- package/skills/kortix-ui/SKILL.md +1 -1
- package/dist/customize/sections/view/sandbox-provider-result.d.ts +0 -47
- package/dist/customize/sections/view/sandbox-provider-result.js +0 -79
package/dist/i18n/en.js
CHANGED
|
@@ -424,12 +424,6 @@ const catalog = {
|
|
|
424
424
|
"kortixDefault": "Kortix default",
|
|
425
425
|
"definedIn": "Defined in"
|
|
426
426
|
},
|
|
427
|
-
"routing": {
|
|
428
|
-
"title": "Routing",
|
|
429
|
-
"automatic": "Automatic",
|
|
430
|
-
"pinned": "Pinned",
|
|
431
|
-
"pinnedWithProvider": "Pinned · {provider}"
|
|
432
|
-
},
|
|
433
427
|
"toasts": {
|
|
434
428
|
"rebuildStarted": "Rebuild started for “{name}”",
|
|
435
429
|
"buildFailed": "Failed to start build",
|
|
@@ -447,9 +441,7 @@ const catalog = {
|
|
|
447
441
|
"building": "Building",
|
|
448
442
|
"failed": "Failed",
|
|
449
443
|
"notReady": "Not ready",
|
|
450
|
-
"unavailable": "Unavailable"
|
|
451
|
-
"selected": "Selected",
|
|
452
|
-
"selectedAria": "selected"
|
|
444
|
+
"unavailable": "Unavailable"
|
|
453
445
|
},
|
|
454
446
|
"defaultBadge": "Default",
|
|
455
447
|
"runtime": "Session runtime",
|
|
@@ -460,14 +452,6 @@ const catalog = {
|
|
|
460
452
|
"confirm": "Delete"
|
|
461
453
|
},
|
|
462
454
|
"provider": {
|
|
463
|
-
"label": "Sandbox provider",
|
|
464
|
-
"experimental": "Experimental",
|
|
465
|
-
"description": "Pin this project to a specific sandbox provider, overriding the platform default. New sessions here run on the chosen provider — “Automatic” follows the platform default.",
|
|
466
|
-
"preparing": "Preparing {provider}… this can take a few minutes",
|
|
467
|
-
"fallback": "the sandbox provider",
|
|
468
|
-
"switched": "Switched to {provider}",
|
|
469
|
-
"switchFailed": "Sandbox provider switch failed",
|
|
470
|
-
"updateFailed": "Failed to update sandbox provider",
|
|
471
455
|
"legacy": "Legacy",
|
|
472
456
|
"legacyNote": "Daytona is a legacy fallback provider. Its removal is scheduled. Existing Daytona sessions keep working for now, but Daytona gets no new features and no support guarantee. Use Platinum."
|
|
473
457
|
},
|
|
@@ -680,6 +664,7 @@ const catalog = {
|
|
|
680
664
|
},
|
|
681
665
|
"credits": {
|
|
682
666
|
"loadFailed": "Could not load this account.",
|
|
667
|
+
"resetAt": "Plan credits reset on",
|
|
683
668
|
"availableBalance": "Available balance",
|
|
684
669
|
"creditCount": "{count, plural, one {{formatted} credit} other {{formatted} credits}}",
|
|
685
670
|
"owed": "owed",
|
|
@@ -928,6 +913,10 @@ const catalog = {
|
|
|
928
913
|
"showMore": "Show more",
|
|
929
914
|
"brief": {
|
|
930
915
|
"status": "Status",
|
|
916
|
+
"subAgent": "Sub-agent",
|
|
917
|
+
"spawned": "Spawned session",
|
|
918
|
+
"subAgentCount": "{count, plural, one {# sub-agent} other {# sub-agents}}",
|
|
919
|
+
"spawnedCount": "{count, plural, one {# spawned session} other {# spawned sessions}}",
|
|
931
920
|
"created": "Created",
|
|
932
921
|
"source": "Source",
|
|
933
922
|
"changeRequests": "Change requests",
|
|
@@ -941,11 +930,12 @@ const catalog = {
|
|
|
941
930
|
}
|
|
942
931
|
},
|
|
943
932
|
"status": {
|
|
944
|
-
"needsYou": "Needs
|
|
945
|
-
"
|
|
946
|
-
"
|
|
947
|
-
"
|
|
948
|
-
"
|
|
933
|
+
"needsYou": "Needs review",
|
|
934
|
+
"needsInput": "Needs input",
|
|
935
|
+
"starting": "Waking",
|
|
936
|
+
"running": "Working",
|
|
937
|
+
"done": "Ready",
|
|
938
|
+
"stopped": "Asleep",
|
|
949
939
|
"failed": "Failed",
|
|
950
940
|
"legacy": "Legacy"
|
|
951
941
|
}
|
|
@@ -2443,7 +2433,6 @@ const catalog = {
|
|
|
2443
2433
|
"text1bbab8923e0a": "/path/to/folder",
|
|
2444
2434
|
"text1bc7a47dada1": "Dockerfile.ml",
|
|
2445
2435
|
"text1bfa15228ca8": "Slack connected",
|
|
2446
|
-
"text1c145081eddd": "Switched to {provider}",
|
|
2447
2436
|
"text1c57f31d6315": "Hidden credential",
|
|
2448
2437
|
"text1c6225ec7092": "Budget",
|
|
2449
2438
|
"text1c791e8c04de": "Audit logs are an Enterprise feature",
|
|
@@ -2520,7 +2509,6 @@ const catalog = {
|
|
|
2520
2509
|
"text221ff19c904c": "Schedules",
|
|
2521
2510
|
"text22206bc67806": "Exit selection",
|
|
2522
2511
|
"text222b8d57e366": "Failed to save overrides",
|
|
2523
|
-
"text22412aa281cb": "the sandbox provider",
|
|
2524
2512
|
"text226f2b1f08a3": "An open runtime today, pluggable by design. The sandbox is yours to read and replace.",
|
|
2525
2513
|
"text2283269ca150": "Channel connection",
|
|
2526
2514
|
"text22965568d22a": "Connected",
|
|
@@ -2716,7 +2704,6 @@ const catalog = {
|
|
|
2716
2704
|
"text32ae9b80f832": "No skills yet",
|
|
2717
2705
|
"text32c6817c8380": "Review the exact parameters. Your decision applies to this call only.",
|
|
2718
2706
|
"text32d61a2331fe": "Product deck",
|
|
2719
|
-
"text32f14aa9ea33": "Preparing {provider}… this can take a few minutes",
|
|
2720
2707
|
"text330010f40240": "Not ready",
|
|
2721
2708
|
"text331551b0de41": "Pending",
|
|
2722
2709
|
"text3329a9bb48b9": "Applying…",
|
|
@@ -2808,7 +2795,6 @@ const catalog = {
|
|
|
2808
2795
|
"text3af0e55ccc96": "OpenCode",
|
|
2809
2796
|
"text3af4d559fa0a": "Loading schema…",
|
|
2810
2797
|
"text3b13192b9d88": "Discard your changes?",
|
|
2811
|
-
"text3b3c31642567": "Pinned provider",
|
|
2812
2798
|
"text3b4153c0d3c8": "Pick a date and time",
|
|
2813
2799
|
"text3b41ba9c7cb8": "No data",
|
|
2814
2800
|
"text3b61c181f516": "Add a separate AgentMail inbox connection for support, sales, founders, or any mailbox the agent should run.",
|
|
@@ -3841,7 +3827,6 @@ const catalog = {
|
|
|
3841
3827
|
"text910ab2c6e011": "Per provider",
|
|
3842
3828
|
"text911a1cde90bc": "OAuth 2.0 device connection failed",
|
|
3843
3829
|
"text91273d498d36": "These",
|
|
3844
|
-
"text914be6d9bb89": "Failed to update sandbox provider",
|
|
3845
3830
|
"text914d43beac26": "Remove access?",
|
|
3846
3831
|
"text91721aa63069": "Service errors",
|
|
3847
3832
|
"text9173e2705c5b": "You need the manage-keys permission to view gateway keys.",
|
|
@@ -4084,6 +4069,8 @@ const catalog = {
|
|
|
4084
4069
|
"texta4cf35d7f3ca": "Provision a few sandboxes — their timing and outcome show up here.",
|
|
4085
4070
|
"texta4f264c3ab5f": "Admin Grant",
|
|
4086
4071
|
"texta4fc39798651": "Change request #{number}",
|
|
4072
|
+
"textddcd87c21894": "Superseded by #{number}",
|
|
4073
|
+
"texta8ef31fa7d25": "View #{number}",
|
|
4087
4074
|
"texta514a684676a": "Edit access",
|
|
4088
4075
|
"texta52ace420f21": "All",
|
|
4089
4076
|
"texta54220c82b33": "Optional at session start. Click to require this connector.",
|
|
@@ -4302,6 +4289,11 @@ const catalog = {
|
|
|
4302
4289
|
"textb6b7a0065808": "Repeat",
|
|
4303
4290
|
"textb6bb289a7a2c": "accounts teams organizations switch manage",
|
|
4304
4291
|
"textb6c70926c1aa": "Admins only",
|
|
4292
|
+
"textf19611c61ca5": "Full access",
|
|
4293
|
+
"text15589a542412": "{count, plural, =0 {No connectors} one {# connector} other {# connectors}}",
|
|
4294
|
+
"texte96d99ad9896": "{count, plural, =0 {No secrets} one {# secret} other {# secrets}}",
|
|
4295
|
+
"text70b8d7e10749": "All Kortix actions",
|
|
4296
|
+
"text2d3f4433505a": "{count, plural, =0 {No Kortix actions} one {# Kortix action} other {# Kortix actions}}",
|
|
4305
4297
|
"textb6cde9030cef": "Create key",
|
|
4306
4298
|
"textb6d85433a7ee": "Sessions could not be loaded",
|
|
4307
4299
|
"textb70354a1faae": "Foo 7B",
|
|
@@ -4391,6 +4383,7 @@ const catalog = {
|
|
|
4391
4383
|
"textbdb86505f806": "Archived",
|
|
4392
4384
|
"textbdbd7706de64": "How this works",
|
|
4393
4385
|
"textbdc0857b99a9": "Only me",
|
|
4386
|
+
"textbdc090ec61e3": "Reload",
|
|
4394
4387
|
"textbdc7d54433e6": "Failed to add connector",
|
|
4395
4388
|
"textbde05a7b8929": "Checking session",
|
|
4396
4389
|
"textbe379a30f1aa": "credits",
|
|
@@ -4650,7 +4643,6 @@ const catalog = {
|
|
|
4650
4643
|
"textd432610668ee": "The identifier selects this credential. Access decides whether agent code can read the value, and who else may spend it.",
|
|
4651
4644
|
"textd440cfc72edc": "branding logo icon favicon product name app name white label whitelabel theme identity",
|
|
4652
4645
|
"textd45336ed23b4": "We couldn't reach the runtime to ask whether a turn is running. Reloading restarts it, and if one is in flight it will be lost.",
|
|
4653
|
-
"textd461a493a375": "Automatic",
|
|
4654
4646
|
"textd4673300c1d2": "Notifications are working correctly!",
|
|
4655
4647
|
"textd46dc6f5e3e3": "Copied \"{value0}\" to clipboard",
|
|
4656
4648
|
"textd4707c58c4a4": "The sandbox is starting. This file will load automatically.",
|
|
@@ -4964,7 +4956,6 @@ const catalog = {
|
|
|
4964
4956
|
"texte99baf469ca8": "to this project. You connect an account right after.",
|
|
4965
4957
|
"texte9b7cf835375": "In your words",
|
|
4966
4958
|
"texte9bef0b0f3c2": "Keyboard shortcuts",
|
|
4967
|
-
"texte9ca8360a34d": "Sandbox provider switch failed",
|
|
4968
4959
|
"texte9d6212ef873": "Setting up...",
|
|
4969
4960
|
"texte9ec6c0ad396": "Managed by Kortix",
|
|
4970
4961
|
"textea13cd34d9e0": "billed as Kortix credits",
|
|
@@ -5586,7 +5577,11 @@ const catalog = {
|
|
|
5586
5577
|
"text815464994ec4": "Telegram connected",
|
|
5587
5578
|
"textdfea5351a743": "Telegram disconnected",
|
|
5588
5579
|
"text2f95b1c9ee2b": "Allowed users saved",
|
|
5589
|
-
"text7971dd752669": "Reminders"
|
|
5580
|
+
"text7971dd752669": "Reminders",
|
|
5581
|
+
"text57f57edb6f16": "Change request #{number} is ready to review.",
|
|
5582
|
+
"texta8597db6f24b": "Remove skill",
|
|
5583
|
+
"text5f6ba69d66d1": "Skill removed",
|
|
5584
|
+
"textcb8d6b0c94c9": " and every file in it, edits included, and removes the skill from every agent that lists it. One commit on the default branch."
|
|
5590
5585
|
},
|
|
5591
5586
|
"publicShareConfirm": {
|
|
5592
5587
|
"title": "Create a public link?",
|
|
@@ -5788,7 +5783,7 @@ const catalog = {
|
|
|
5788
5783
|
"metaKey": "API key",
|
|
5789
5784
|
"metaSignIn": "Sign in",
|
|
5790
5785
|
"metaSignInOrKey": "Sign in or API key",
|
|
5791
|
-
"metaIncluded": "Paid from credits",
|
|
5786
|
+
"metaIncluded": "Paid from credits · Platinum Inference",
|
|
5792
5787
|
"apiKey": "API key",
|
|
5793
5788
|
"savedKey": "Saved key",
|
|
5794
5789
|
"replace": "Replace",
|
|
@@ -5856,14 +5851,7 @@ const catalog = {
|
|
|
5856
5851
|
},
|
|
5857
5852
|
"modelsList": {
|
|
5858
5853
|
"onCount": "{on} of {total} on",
|
|
5859
|
-
"perMillion": "{model} · per 1M",
|
|
5860
|
-
"estimate": "estimate",
|
|
5861
|
-
"route": "Route",
|
|
5862
|
-
"input": "In",
|
|
5863
|
-
"cached": "Cached",
|
|
5864
|
-
"output": "Out",
|
|
5865
5854
|
"context": "{value} context",
|
|
5866
|
-
"fromPrice": "from {input} / {output} per 1M",
|
|
5867
5855
|
"price": "{input} / {output} per 1M",
|
|
5868
5856
|
"hiddenLine": "Not in the model picker · direct requests still work",
|
|
5869
5857
|
"blockedLine": "Requests to this model are blocked",
|
|
@@ -5942,17 +5930,12 @@ const catalog = {
|
|
|
5942
5930
|
"credentialsHint": "Disable inference without removing credentials.",
|
|
5943
5931
|
"providerError": "Could not update provider access.",
|
|
5944
5932
|
"managedTitle": "Kortix Managed Models",
|
|
5945
|
-
"managedDescription": "
|
|
5933
|
+
"managedDescription": "Models from Platinum Inference, at its price plus a {fee}% platform fee, paid from credits. No API key needed.",
|
|
5946
5934
|
"managedUpgradeHint": "Upgrade to use Kortix's managed models, or connect your own provider.",
|
|
5947
|
-
"pricingEstimate": "Provider base price, before the platform fee. The serving route determines the charge.",
|
|
5948
|
-
"pricingRoute": "{route}: {input} input / {cacheRead} cached / {output} output per 1M tokens",
|
|
5949
|
-
"pricingPreferred": "Preferred",
|
|
5950
5935
|
"textImage": "Text + image",
|
|
5951
5936
|
"textOnly": "Text only",
|
|
5952
5937
|
"zdrTitle": "Zero data retention",
|
|
5953
5938
|
"zdrDescription": "Zero data retention (ZDR) means the model provider processes your text and images, then does not keep the input or reply after the request. Kortix stores your project and conversation history separately.",
|
|
5954
|
-
"usProvidersTitle": "Hosted in the US",
|
|
5955
|
-
"usProvidersDescription": "Kortix models run in US data centers. We only partner with American inference providers.",
|
|
5956
5939
|
"hiddenHint": "Hidden from the picker. Direct requests are still allowed; use the model menu to disable them.",
|
|
5957
5940
|
"hidden": "Hidden from picker",
|
|
5958
5941
|
"disableModel": "Disable model",
|
|
@@ -6285,6 +6268,24 @@ const catalog = {
|
|
|
6285
6268
|
"chipLabel": "{count, plural, one {# active reminder} other {# active reminders}}",
|
|
6286
6269
|
"chipTitle": "Reminders on this session",
|
|
6287
6270
|
"manage": "Manage reminders",
|
|
6271
|
+
"openInReminders": "Open in Reminders",
|
|
6272
|
+
"nextRun": "Next run {time}",
|
|
6273
|
+
"repeats": "Repeats",
|
|
6274
|
+
"timeZone": "Time zone",
|
|
6275
|
+
"lastRun": "Last run",
|
|
6276
|
+
"lastRunFailed": "Last run failed",
|
|
6277
|
+
"runQueued": "Reminder sent to the session",
|
|
6278
|
+
"runFailed": "Could not run the reminder",
|
|
6279
|
+
"neverRun": "Not run yet",
|
|
6280
|
+
"searchPlaceholder": "Search reminders",
|
|
6281
|
+
"statusAll": "All",
|
|
6282
|
+
"timeFilterLabel": "Next run",
|
|
6283
|
+
"timeAny": "Any time",
|
|
6284
|
+
"timeHour": "Next hour",
|
|
6285
|
+
"timeDay": "Next 24 hours",
|
|
6286
|
+
"timeWeek": "Next 7 days",
|
|
6287
|
+
"timeLater": "Later",
|
|
6288
|
+
"noMatch": "No reminders match",
|
|
6288
6289
|
"cardLabel": "Reminder",
|
|
6289
6290
|
"cardOneTime": "One-time",
|
|
6290
6291
|
"cardRecurring": "Recurring",
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { cn } from './lib/utils.js';
|
|
2
|
-
export { UiProvider, defaultUiHostConfig, defaultUiNavigation, defaultUiStrings, useUiBrand, useUiHostConfig, useUiImage, useUiLink, useUiParams, useUiPathname, useUiRouter, useUiShallowNavigate, useUiSearchParams, useUiStrings, useUiViewerId, type UiBrand, type UiHostConfig, type UiImageComponent, type UiImageProps, type UiLinkComponent, type UiLinkProps, type UiNavigation, type UiRouteParams, type UiRouter, type UiSearchParams, type UiShallowNavigate, type UiStrings, type UiStringsInput, type UseUiBrand, } from './providers/ui-provider.js';
|
|
2
|
+
export { UiProvider, defaultUiHostConfig, defaultUiNavigation, defaultUiStrings, useUiBrand, useUiHostConfig, useUiImage, useUiLink, useUiParams, useUiPathname, useUiRouter, useUiShallowNavigate, useUiSearchParams, useUiStrings, useUiViewerId, type UiBrand, type UiHostConfig, type UiImageComponent, type UiImageProps, type UiLinkComponent, type UiLinkProps, type UiNavigation, type UiRouteParams, type UiRouter, type UiSearchParams, type UiShallowNavigate, type UiSlashAction, type UiStrings, type UiStringsInput, type UseUiBrand, } from './providers/ui-provider.js';
|
|
3
3
|
export { SessionIdsProvider, useSessionIds, type UiSessionIds } from './providers/session-ids.js';
|
|
4
4
|
export { useIsDark } from './hooks/use-is-dark.js';
|
|
5
5
|
export { Button, buttonVariants, type ButtonProps, } from './primitives/button.js';
|
|
@@ -87,6 +87,8 @@ export function useDesktopBackTarget(href) {
|
|
|
87
87
|
};
|
|
88
88
|
}, [href]);
|
|
89
89
|
}
|
|
90
|
+
const subscribeNoop = () => () => { };
|
|
91
|
+
const readCanGoBack = () => Boolean(window.navigation?.canGoBack);
|
|
90
92
|
/** Pathname of an app href, for comparing against `useUiPathname()`. */
|
|
91
93
|
function hrefPath(href) {
|
|
92
94
|
return href.split(/[?#]/)[0] || '/';
|
|
@@ -119,10 +121,10 @@ export function DesktopBackButton() {
|
|
|
119
121
|
const pathname = useUiPathname() ?? '/';
|
|
120
122
|
const home = useAppHome();
|
|
121
123
|
const to = useSyncExternalStore(subscribeBackTarget, () => backTarget, () => undefined);
|
|
124
|
+
const canGoBack = useSyncExternalStore(subscribeNoop, readCanGoBack, () => false);
|
|
122
125
|
if (!viewerId)
|
|
123
126
|
return null;
|
|
124
|
-
|
|
125
|
-
if (!hasBackDestination(win, { to, home, pathname }))
|
|
127
|
+
if (!hasBackDestination({ navigation: { canGoBack } }, { to, home, pathname }))
|
|
126
128
|
return null;
|
|
127
|
-
return _jsx(DesktopBackControl, { onBack: () => void goBack(router,
|
|
129
|
+
return _jsx(DesktopBackControl, { onBack: () => void goBack(router, window, { to, home }) });
|
|
128
130
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
3
3
|
import { OWN_SCROLL_MS, chevronVisible, isAtEnd, keyScrollIntentFor, pickAnchorIndex, prefersReducedMotion, roomUnderNewestTurn, settleMotion, shouldReleaseFollow, } from './use-auto-scroll-physics.js';
|
|
4
4
|
export { AT_END_PX, BOTTOM_GAP_PX, CHEVRON_PX, GLIDE_MIN_PX, OWN_SCROLL_MS, TURN_TOP_OFFSET, chevronVisible, classifyScrollKey, isAtEnd, isEditableTarget, isSpaceActivatedTarget, keyScrollIntentFor, pickAnchorIndex, roomUnderNewestTurn, settleMotion, shouldReleaseFollow, } from './use-auto-scroll-physics.js';
|
|
5
5
|
/**
|
|
@@ -234,7 +234,9 @@ export function useAutoScroll({ hasContent = false, } = {}) {
|
|
|
234
234
|
markOwnScroll(OWN_SCROLL_MS);
|
|
235
235
|
el.scrollTop = end;
|
|
236
236
|
}, [sizeRoom, glideTo, markOwnScroll]);
|
|
237
|
-
|
|
237
|
+
useLayoutEffect(() => {
|
|
238
|
+
settleRef.current = settle;
|
|
239
|
+
}, [settle]);
|
|
238
240
|
const goToEnd = useCallback((behavior) => {
|
|
239
241
|
const el = scrollRef.current;
|
|
240
242
|
if (!el)
|
|
@@ -455,7 +457,7 @@ export function useAutoScroll({ hasContent = false, } = {}) {
|
|
|
455
457
|
document.removeEventListener('keydown', onKeyDown, { capture: true });
|
|
456
458
|
el.removeEventListener('scroll', onScroll);
|
|
457
459
|
};
|
|
458
|
-
}, [goToEnd, endGlide, hasContent, setFollow
|
|
460
|
+
}, [goToEnd, endGlide, hasContent, setFollow]);
|
|
459
461
|
return {
|
|
460
462
|
scrollRef,
|
|
461
463
|
contentRef,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { qk, useFeatureFlag } from '@kortix/sdk/react';
|
|
3
|
-
import {
|
|
3
|
+
import { useQueryClient } from '@tanstack/react-query';
|
|
4
4
|
import { useCallback, useState, useSyncExternalStore } from 'react';
|
|
5
5
|
export const NOTIFICATION_CENTER_FLAG = 'notification_center';
|
|
6
6
|
/** The predicate of `useFeatureFlag`: the server said exactly `true`. */
|
|
@@ -50,14 +50,14 @@ export function anyCachedNotificationCenter(client) {
|
|
|
50
50
|
return client.getQueryCache().getAll().some(holdsFlagOn);
|
|
51
51
|
}
|
|
52
52
|
/**
|
|
53
|
-
* `
|
|
54
|
-
* `
|
|
53
|
+
* A `useSyncExternalStore` subscription to the query cache, live only while
|
|
54
|
+
* `active`. The cache reports synchronously, also when another component's
|
|
55
55
|
* `useQuery` builds its query during render; the re-check waits for a
|
|
56
56
|
* microtask so this component never updates in the middle of that render.
|
|
57
57
|
*/
|
|
58
|
-
function
|
|
59
|
-
|
|
60
|
-
if (!
|
|
58
|
+
function useCacheSubscription(client, active) {
|
|
59
|
+
return useCallback((onChange) => {
|
|
60
|
+
if (!active)
|
|
61
61
|
return () => { };
|
|
62
62
|
let live = true;
|
|
63
63
|
const unsubscribe = client.getQueryCache().subscribe(() => {
|
|
@@ -70,8 +70,11 @@ function useAnyCachedNotificationCenter(client, scan) {
|
|
|
70
70
|
live = false;
|
|
71
71
|
unsubscribe();
|
|
72
72
|
};
|
|
73
|
-
}, [client,
|
|
74
|
-
|
|
73
|
+
}, [client, active]);
|
|
74
|
+
}
|
|
75
|
+
/** `anyCachedNotificationCenter`, reactive. Subscribes to the cache only while `scan`. */
|
|
76
|
+
function useAnyCachedNotificationCenter(client, scan) {
|
|
77
|
+
return useSyncExternalStore(useCacheSubscription(client, scan), () => scan && anyCachedNotificationCenter(client), () => false);
|
|
75
78
|
}
|
|
76
79
|
/** Is the notification center on for `projectId`, or, without one, for any cached project. */
|
|
77
80
|
export function useNotificationCenter(projectId) {
|
|
@@ -88,14 +91,17 @@ export function useNotificationCenter(projectId) {
|
|
|
88
91
|
* load of a project page starts off.
|
|
89
92
|
*/
|
|
90
93
|
export function useNotificationHostGate(projectId) {
|
|
91
|
-
// The global host sits outside the access boundary. Observe the shell's
|
|
92
|
-
// detail entry without starting a request for a potentially revoked project.
|
|
93
|
-
const detail = useQuery({
|
|
94
|
-
queryKey: qk.project.detail(projectId ?? ''),
|
|
95
|
-
enabled: false,
|
|
96
|
-
});
|
|
97
|
-
const flag = { isLoading: detail.isPending, enabled: notificationCenterOn(detail.data?.project) };
|
|
98
94
|
const client = useQueryClient();
|
|
95
|
+
// The global host sits outside the access boundary. Read the shell's detail
|
|
96
|
+
// entry from the cache: no request for a potentially revoked project, and no
|
|
97
|
+
// observer. An observer added a detail query without a queryFn (also for the
|
|
98
|
+
// empty id of a page outside any project), and every refetch of it logged
|
|
99
|
+
// "No queryFn was passed".
|
|
100
|
+
const detail = useSyncExternalStore(useCacheSubscription(client, !!projectId), () => (projectId ? client.getQueryState(qk.project.detail(projectId)) : undefined), () => undefined);
|
|
101
|
+
const flag = {
|
|
102
|
+
isLoading: !detail || detail.status === 'pending',
|
|
103
|
+
enabled: notificationCenterOn(detail?.data?.project),
|
|
104
|
+
};
|
|
99
105
|
const anyProject = useAnyCachedNotificationCenter(client, !projectId);
|
|
100
106
|
const [previous, setPrevious] = useState(false);
|
|
101
107
|
let answer = anyProject;
|
|
@@ -51,3 +51,9 @@ export declare function useIsNeedsInputPoller(projectId: string): boolean;
|
|
|
51
51
|
* `ProjectSessionList` alone still sees open questions.
|
|
52
52
|
*/
|
|
53
53
|
export declare function useSessionNeedsYouCounts(projectId: string): Record<string, number>;
|
|
54
|
+
/**
|
|
55
|
+
* Sessions with an open agent question or a pending connector approval: the
|
|
56
|
+
* `needs-you` rows that wait on an answer rather than a change request. Reads
|
|
57
|
+
* the cache `useSessionNeedsYouCounts` already polls, so it adds no request.
|
|
58
|
+
*/
|
|
59
|
+
export declare function useSessionsAwaitingAnswer(projectId: string): ReadonlySet<string>;
|
|
@@ -82,3 +82,14 @@ export function useSessionNeedsYouCounts(projectId) {
|
|
|
82
82
|
const { data: needsInput } = useSessionsNeedingInput(projectId, { enabled: poller });
|
|
83
83
|
return useMemo(() => withNeedsInput(needsYouBySession, needsInput), [needsYouBySession, needsInput]);
|
|
84
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Sessions with an open agent question or a pending connector approval: the
|
|
87
|
+
* `needs-you` rows that wait on an answer rather than a change request. Reads
|
|
88
|
+
* the cache `useSessionNeedsYouCounts` already polls, so it adds no request.
|
|
89
|
+
*/
|
|
90
|
+
export function useSessionsAwaitingAnswer(projectId) {
|
|
91
|
+
const { data } = useSessionsNeedingInput(projectId, { enabled: false });
|
|
92
|
+
return useMemo(() => new Set(Object.entries(data?.sessions ?? {})
|
|
93
|
+
.filter(([, count]) => count > 0)
|
|
94
|
+
.map(([sessionId]) => sessionId)), [data]);
|
|
95
|
+
}
|
|
@@ -10,7 +10,7 @@ export { isConnectionClosedNoise, isFailedToSendMessageNoise, isFramelessNetwork
|
|
|
10
10
|
export { isIosWebViewInjectedStackOverflowNoise, isOldBrowserDomNullDerefNoise, isFirefoxDeadObjectUnattributableNoise, isOldBrowserSyntaxParseError, isOldWebkitRegexNoiseMessage, isUndefinedVariableThirdPartyNoise, isUnresolvableStackOverflowNoise, } from './browser-noise/rules/old-browsers.js';
|
|
11
11
|
export { isEmbedPdfTilingReactUpdateDepthNoise, isEmbedPdfTilingTileDestructureNoise, } from './browser-noise/rules/pdf.js';
|
|
12
12
|
export { isDocumentStateNotFoundNoise, isExpectedNextRecoveryBailoutNoise, isFirefoxReactSchedulerReentryNoise, isLikelyDomMutationNoise, isServerSuspenseBailoutNoise, isThirdPartyReactUpdateDepthNoise, } from './browser-noise/rules/react.js';
|
|
13
|
-
export { isAnonymousAuthRefreshRace, isAutoplayNotAllowedRejectionNoise, isNonErrorObjectNotFoundRejectionNoise, isNonErrorUndefinedRejectionNoise, isOperationErrorPopErrorScopeNoise, isSupabaseTokenExpiredNoise, } from './browser-noise/rules/rejections.js';
|
|
13
|
+
export { isAnonymousAuthRefreshRace, isAutoplayNotAllowedRejectionNoise, isNonErrorObjectNotFoundRejectionNoise, isNonErrorUndefinedRejectionNoise, isOperationErrorPopErrorScopeNoise, isPlayNotSupportedRejectionNoise, isSupabaseTokenExpiredNoise, } from './browser-noise/rules/rejections.js';
|
|
14
14
|
export { isSafariGenericSecurityErrorNoise, isStorageDisabledWebViewNoiseMessage, isStorageSecurityErrorNoise, } from './browser-noise/rules/storage.js';
|
|
15
15
|
export { isAndroidWebViewNativeBridgePostEventNoise, isAndroidWebViewNativeBridgePostMessageNoise, isIOSWebViewWebKitBridgeNoise, } from './browser-noise/rules/webview.js';
|
|
16
16
|
export declare const NOISE_RULES: readonly NoiseRule[];
|
|
@@ -35,7 +35,7 @@ export { isConnectionClosedNoise, isFailedToSendMessageNoise, isFramelessNetwork
|
|
|
35
35
|
export { isIosWebViewInjectedStackOverflowNoise, isOldBrowserDomNullDerefNoise, isFirefoxDeadObjectUnattributableNoise, isOldBrowserSyntaxParseError, isOldWebkitRegexNoiseMessage, isUndefinedVariableThirdPartyNoise, isUnresolvableStackOverflowNoise, } from './browser-noise/rules/old-browsers.js';
|
|
36
36
|
export { isEmbedPdfTilingReactUpdateDepthNoise, isEmbedPdfTilingTileDestructureNoise, } from './browser-noise/rules/pdf.js';
|
|
37
37
|
export { isDocumentStateNotFoundNoise, isExpectedNextRecoveryBailoutNoise, isFirefoxReactSchedulerReentryNoise, isLikelyDomMutationNoise, isServerSuspenseBailoutNoise, isThirdPartyReactUpdateDepthNoise, } from './browser-noise/rules/react.js';
|
|
38
|
-
export { isAnonymousAuthRefreshRace, isAutoplayNotAllowedRejectionNoise, isNonErrorObjectNotFoundRejectionNoise, isNonErrorUndefinedRejectionNoise, isOperationErrorPopErrorScopeNoise, isSupabaseTokenExpiredNoise, } from './browser-noise/rules/rejections.js';
|
|
38
|
+
export { isAnonymousAuthRefreshRace, isAutoplayNotAllowedRejectionNoise, isNonErrorObjectNotFoundRejectionNoise, isNonErrorUndefinedRejectionNoise, isOperationErrorPopErrorScopeNoise, isPlayNotSupportedRejectionNoise, isSupabaseTokenExpiredNoise, } from './browser-noise/rules/rejections.js';
|
|
39
39
|
export { isSafariGenericSecurityErrorNoise, isStorageDisabledWebViewNoiseMessage, isStorageSecurityErrorNoise, } from './browser-noise/rules/storage.js';
|
|
40
40
|
export { isAndroidWebViewNativeBridgePostEventNoise, isAndroidWebViewNativeBridgePostMessageNoise, isIOSWebViewWebKitBridgeNoise, } from './browser-noise/rules/webview.js';
|
|
41
41
|
export const NOISE_RULES = [
|
|
@@ -127,4 +127,14 @@ export declare function isAutoplayNotAllowedRejectionNoise(input: {
|
|
|
127
127
|
filename?: unknown;
|
|
128
128
|
} | undefined>;
|
|
129
129
|
}): boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Whether a Sentry event is the frameless `HTMLMediaElement.play()`
|
|
132
|
+
* `NotSupportedError` rejection. See `PLAY_NOT_SUPPORTED_PATTERN`.
|
|
133
|
+
*/
|
|
134
|
+
export declare function isPlayNotSupportedRejectionNoise(input: {
|
|
135
|
+
message?: unknown;
|
|
136
|
+
frames?: Array<{
|
|
137
|
+
filename?: unknown;
|
|
138
|
+
} | undefined>;
|
|
139
|
+
}): boolean;
|
|
130
140
|
export declare const REJECTION_RULES: readonly NoiseRule[];
|
|
@@ -479,7 +479,28 @@ export function isAutoplayNotAllowedRejectionNoise(input) {
|
|
|
479
479
|
if (!PLAY_NOT_ALLOWED_PATTERN.test(message)) {
|
|
480
480
|
return false;
|
|
481
481
|
}
|
|
482
|
-
|
|
482
|
+
return isUnattributablePlayRejection(input.frames);
|
|
483
|
+
}
|
|
484
|
+
// Firefox's `NotSupportedError` for a play() promise whose element has no
|
|
485
|
+
// playable source. Better Stack pattern
|
|
486
|
+
// 1b3195a99afc344886a33243b1b73942b94e74c6bf5ca6b561d3bddc3e3289c6
|
|
487
|
+
// (Kortix Frontend prod, application_id 2346967, KRTX-2998): 1 occurrence, 0
|
|
488
|
+
// identified users, first=last 2026-10-21T09:54:06Z, call site unknown. Every
|
|
489
|
+
// first-party play() promise attaches a `.catch` (`film.tsx`, `sounds.ts`,
|
|
490
|
+
// `video-renderer.tsx`), so the frameless capture is not ours. The guards of
|
|
491
|
+
// `isAutoplayNotAllowedRejectionNoise` keep an attributable one reporting.
|
|
492
|
+
const PLAY_NOT_SUPPORTED_PATTERN = /^The media resource indicated by the src attribute or assigned media provider object was not suitable\.$/;
|
|
493
|
+
/**
|
|
494
|
+
* Whether a Sentry event is the frameless `HTMLMediaElement.play()`
|
|
495
|
+
* `NotSupportedError` rejection. See `PLAY_NOT_SUPPORTED_PATTERN`.
|
|
496
|
+
*/
|
|
497
|
+
export function isPlayNotSupportedRejectionNoise(input) {
|
|
498
|
+
if (!PLAY_NOT_SUPPORTED_PATTERN.test(normalizeString(input.message))) {
|
|
499
|
+
return false;
|
|
500
|
+
}
|
|
501
|
+
return isUnattributablePlayRejection(input.frames);
|
|
502
|
+
}
|
|
503
|
+
function isUnattributablePlayRejection(frames = []) {
|
|
483
504
|
// Negative guard #1: a resolved first-party `apps/web/src/…` frame means
|
|
484
505
|
// our own code left a play promise unhandled → actionable; keep reporting
|
|
485
506
|
// so the call site can be found + given its `.catch`.
|
|
@@ -501,6 +522,11 @@ export const REJECTION_RULES = [
|
|
|
501
522
|
appliesTo: 'sentry',
|
|
502
523
|
match: isAutoplayNotAllowedRejectionNoise,
|
|
503
524
|
},
|
|
525
|
+
{
|
|
526
|
+
id: 'play-not-supported',
|
|
527
|
+
appliesTo: 'sentry',
|
|
528
|
+
match: isPlayNotSupportedRejectionNoise,
|
|
529
|
+
},
|
|
504
530
|
{
|
|
505
531
|
id: 'non-error-undefined-rejection',
|
|
506
532
|
appliesTo: 'sentry',
|
|
@@ -100,6 +100,10 @@ const CATALOG_PROVIDER_IDS = new Set(CATALOG_PROVIDER_ENV.map((provider) => prov
|
|
|
100
100
|
* (a custom provider) keeps initials.
|
|
101
101
|
*/
|
|
102
102
|
export function providerIconSrc(providerID, baseUrl) {
|
|
103
|
+
// Drawn in code (ProviderLogo), never fetched: models.dev has no Platinum logo
|
|
104
|
+
// and answers with its generic sparkles mark.
|
|
105
|
+
if (providerID === 'platinum')
|
|
106
|
+
return undefined;
|
|
103
107
|
const icon = PROVIDER_ICON_MAP[providerID]?.icon;
|
|
104
108
|
if (icon)
|
|
105
109
|
return baseUrl === undefined ? `https://models.dev/logos/${icon}.svg` : `${baseUrl}/${icon}.svg`;
|
|
@@ -144,7 +148,8 @@ export function ProviderLogo({ providerID, name, className, size = 'default', to
|
|
|
144
148
|
// An unreachable models.dev logo (offline self-host) falls back to initials.
|
|
145
149
|
const [failedSrc, setFailedSrc] = useState();
|
|
146
150
|
const kortix = providerID === 'kortix';
|
|
147
|
-
const
|
|
151
|
+
const platinum = providerID === 'platinum';
|
|
152
|
+
const iconSrc = kortix || platinum ? undefined : providerIconSrc(providerID, providerIconBaseUrl);
|
|
148
153
|
const src = iconSrc === failedSrc ? undefined : iconSrc;
|
|
149
154
|
const sizeClasses = {
|
|
150
155
|
xs: 'size-4',
|
|
@@ -166,10 +171,16 @@ export function ProviderLogo({ providerID, name, className, size = 'default', to
|
|
|
166
171
|
// the other sizes read as an avatar, and at 16px a tile around a 12px
|
|
167
172
|
// mark is all frame and no logo. The initials fallback keeps its tile
|
|
168
173
|
// at every size: two bare letters at 9px read as debris, not a logo.
|
|
169
|
-
(src || kortix) && size === 'xs' ? 'bg-transparent' : light ? LOGO_TILE_LIGHT : 'bg-muted rounded-md', sizeClasses[size], className), "aria-hidden": "true", children: kortix ? (
|
|
174
|
+
(src || kortix || platinum) && size === 'xs' ? 'bg-transparent' : light ? LOGO_TILE_LIGHT : 'bg-muted rounded-md', sizeClasses[size], className), "aria-hidden": "true", children: kortix ? (
|
|
170
175
|
// The host's brand mark (`useBrand` icon), else the Kortix symbol in currentColor.
|
|
171
176
|
_jsx(KortixLogo, { variant: "icon", style: {
|
|
172
177
|
width: `calc(var(--spacing) * ${KORTIX_MARK_STEPS[size]})`,
|
|
173
178
|
height: `calc(var(--spacing) * ${KORTIX_MARK_STEPS[size]})`,
|
|
174
|
-
}, className: light ? LOGO_TILE_LIGHT_TEXT : 'text-foreground' })) :
|
|
179
|
+
}, className: light ? LOGO_TILE_LIGHT_TEXT : 'text-foreground' })) : platinum ? (
|
|
180
|
+
// The Platinum mark (platinum.dev/brand): a flat square in currentColor,
|
|
181
|
+
// the favicon geometry — 14 of 24, inset 5.
|
|
182
|
+
_jsx("svg", { viewBox: "0 0 24 24", style: {
|
|
183
|
+
width: `calc(var(--spacing) * ${KORTIX_MARK_STEPS[size] + 2})`,
|
|
184
|
+
height: `calc(var(--spacing) * ${KORTIX_MARK_STEPS[size] + 2})`,
|
|
185
|
+
}, className: light ? LOGO_TILE_LIGHT_TEXT : 'text-foreground', children: _jsx("rect", { x: "5", y: "5", width: "14", height: "14", fill: "currentColor" }) })) : src ? (_jsx(Image, { src: src, alt: "", width: iconSizes[size], height: iconSizes[size], unoptimized: src.startsWith('https:'), onError: () => setFailedSrc(src), className: cn('object-contain', !light && 'dark:invert') })) : (_jsx("span", { className: cn('font-semibold tracking-wide uppercase', light ? LOGO_TILE_LIGHT_TEXT : 'text-muted-foreground', size === 'xs' ? 'text-[9px]' : 'text-xs'), children: initialsFor(providerID, name) })) }));
|
|
175
186
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** @internal Kortix apps only. No semver: it may change in any release. */
|
|
2
|
+
import type { UiTranslator } from '../../i18n/index.js';
|
|
3
|
+
import type { ProjectTrigger } from '@kortix/sdk';
|
|
4
|
+
/**
|
|
5
|
+
* The trigger clock's health tones and its "last run" label. The Triggers list
|
|
6
|
+
* (`customize/triggers/schedule`) and the session reminders panel
|
|
7
|
+
* (`session/panel`) both draw them, so they sit below both layers.
|
|
8
|
+
*/
|
|
9
|
+
export type ClockState = 'ok' | 'failed' | 'needs_connection' | 'pending' | 'paused' | 'never';
|
|
10
|
+
/**
|
|
11
|
+
* ONE tone per state drives both the reflection and the dot, so they cannot
|
|
12
|
+
* disagree. Three colours, always full strength: green = live (running, ran,
|
|
13
|
+
* or not run yet), red = failed, yellow = paused or waiting on setup.
|
|
14
|
+
*/
|
|
15
|
+
export declare const CLOCK_TONE: {
|
|
16
|
+
readonly ok: {
|
|
17
|
+
readonly reflection: "text-kortix-green";
|
|
18
|
+
readonly dot: "bg-kortix-green";
|
|
19
|
+
};
|
|
20
|
+
readonly never: {
|
|
21
|
+
readonly reflection: "text-kortix-green";
|
|
22
|
+
readonly dot: "bg-kortix-green";
|
|
23
|
+
};
|
|
24
|
+
readonly failed: {
|
|
25
|
+
readonly reflection: "text-kortix-red";
|
|
26
|
+
readonly dot: "bg-kortix-red";
|
|
27
|
+
};
|
|
28
|
+
readonly needs_connection: {
|
|
29
|
+
readonly reflection: "text-kortix-yellow";
|
|
30
|
+
readonly dot: "bg-kortix-yellow";
|
|
31
|
+
};
|
|
32
|
+
readonly pending: {
|
|
33
|
+
readonly reflection: "text-kortix-yellow";
|
|
34
|
+
readonly dot: "bg-kortix-yellow";
|
|
35
|
+
};
|
|
36
|
+
readonly paused: {
|
|
37
|
+
readonly reflection: "text-kortix-yellow";
|
|
38
|
+
readonly dot: "bg-kortix-yellow";
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
/** "2d ago", "9h ago", "3w ago" in the viewer's locale, or "Never run". */
|
|
42
|
+
export declare function lastRunLabel(trigger: Pick<ProjectTrigger, 'last_fired_at' | 'event'>, t: UiTranslator, locale: string, now?: number): string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const GREEN = { reflection: 'text-kortix-green', dot: 'bg-kortix-green' };
|
|
2
|
+
const RED = { reflection: 'text-kortix-red', dot: 'bg-kortix-red' };
|
|
3
|
+
const YELLOW = { reflection: 'text-kortix-yellow', dot: 'bg-kortix-yellow' };
|
|
4
|
+
/**
|
|
5
|
+
* ONE tone per state drives both the reflection and the dot, so they cannot
|
|
6
|
+
* disagree. Three colours, always full strength: green = live (running, ran,
|
|
7
|
+
* or not run yet), red = failed, yellow = paused or waiting on setup.
|
|
8
|
+
*/
|
|
9
|
+
export const CLOCK_TONE = {
|
|
10
|
+
ok: GREEN,
|
|
11
|
+
never: GREEN,
|
|
12
|
+
failed: RED,
|
|
13
|
+
needs_connection: YELLOW,
|
|
14
|
+
pending: YELLOW,
|
|
15
|
+
paused: YELLOW,
|
|
16
|
+
};
|
|
17
|
+
/** "2d ago", "9h ago", "3w ago" in the viewer's locale, or "Never run". */
|
|
18
|
+
export function lastRunLabel(trigger, t, locale, now = Date.now()) {
|
|
19
|
+
const iso = trigger.last_fired_at ?? trigger.event?.last_event_at ?? null;
|
|
20
|
+
const at = iso ? Date.parse(iso) : Number.NaN;
|
|
21
|
+
if (!Number.isFinite(at))
|
|
22
|
+
return t.raw('text3d40a69d3160');
|
|
23
|
+
const rtf = new Intl.RelativeTimeFormat(locale, { style: 'narrow', numeric: 'auto' });
|
|
24
|
+
const min = Math.floor(Math.max(0, now - at) / 60_000);
|
|
25
|
+
if (min < 1)
|
|
26
|
+
return rtf.format(0, 'second');
|
|
27
|
+
if (min < 60)
|
|
28
|
+
return rtf.format(-min, 'minute');
|
|
29
|
+
if (min < 24 * 60)
|
|
30
|
+
return rtf.format(-Math.floor(min / 60), 'hour');
|
|
31
|
+
if (min < 7 * 24 * 60)
|
|
32
|
+
return rtf.format(-Math.floor(min / (24 * 60)), 'day');
|
|
33
|
+
return rtf.format(-Math.floor(min / (7 * 24 * 60)), 'week');
|
|
34
|
+
}
|
|
@@ -36,6 +36,12 @@ export interface WebNotificationPayload {
|
|
|
36
36
|
preview?: string;
|
|
37
37
|
/** Localized "Open session" for the finished-turn toast. */
|
|
38
38
|
openSessionLabel?: string;
|
|
39
|
+
/** The open change request the finished turn produced: the toast offers Review. */
|
|
40
|
+
changeRequest?: {
|
|
41
|
+
crId: string;
|
|
42
|
+
detail: string;
|
|
43
|
+
reviewLabel: string;
|
|
44
|
+
};
|
|
39
45
|
/** Localized "{count} tasks finished" for the stack several turns collapse into. */
|
|
40
46
|
stackTitle?: (count: number) => string;
|
|
41
47
|
/** A row of the notification inbox. Inbox rows exist only for projects with `notification_center` on. */
|