@opengeni/react 3.0.2-canary.38894290271001 → 3.1.2
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/{browser-viewer-M7BIVFTW.js → browser-viewer-ZWR6MWJ7.js} +3 -3
- package/dist/{chunk-PWCBMEV2.js → chunk-2I6R3GCZ.js} +4 -4
- package/dist/{chunk-QTSWNANQ.js → chunk-2SFFYIH3.js} +2 -2
- package/dist/{chunk-S5ZT4TBR.js → chunk-ADWCLI4G.js} +2 -2
- package/dist/{chunk-6SNDCUPB.js → chunk-B7TC2A33.js} +2 -2
- package/dist/{chunk-KZENYIA2.js → chunk-BLL56F7R.js} +4 -1
- package/dist/chunk-BLL56F7R.js.map +1 -0
- package/dist/{chunk-ISN726VG.js → chunk-KZC6QRNR.js} +2 -2
- package/dist/chunk-MK2TQO4Y.js +24 -0
- package/dist/chunk-MK2TQO4Y.js.map +1 -0
- package/dist/{chunk-TIHSXNBC.js → chunk-NKMYZFHA.js} +2 -2
- package/dist/{chunk-TL7M2WWQ.js → chunk-OVB5WIG5.js} +17 -11
- package/dist/{chunk-TL7M2WWQ.js.map → chunk-OVB5WIG5.js.map} +1 -1
- package/dist/{chunk-Q26UAIXI.js → chunk-V5ZUJT2T.js} +2 -2
- package/dist/{chunk-5XEXTWEM.js → chunk-WIUKB3LD.js} +2 -2
- package/dist/{chunk-UXI7L7DL.js → chunk-X5UVUIMF.js} +4 -4
- package/dist/composer-messages.js +2 -2
- package/dist/composer.js +4 -4
- package/dist/connect.js +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +30 -26
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +2 -2
- package/dist/{latest-question-W4DNEH4Q.js → latest-question-R77KWSUP.js} +3 -3
- package/dist/lib/scrollbars.d.ts +11 -0
- package/dist/machines.js +2 -2
- package/dist/sandbox-files-O27IPOZW.js +1 -1
- package/dist/scrollbars.d.ts +1 -0
- package/dist/scrollbars.js +10 -0
- package/dist/scrollbars.js.map +1 -0
- package/dist/session-ui.js +13 -12
- package/dist/session-ui.js.map +1 -1
- package/dist/session.js +4 -4
- package/dist/timeline-model.js +2 -2
- package/package.json +7 -3
- package/src/index.ts +1 -0
- package/src/lib/host-theme.ts +5 -0
- package/src/lib/provider-recovery.ts +3 -0
- package/src/lib/scrollbars.ts +30 -0
- package/src/scrollbars.ts +3 -0
- package/styles/compiled.css +23 -0
- package/styles/index.css +31 -0
- package/dist/chunk-KZENYIA2.js.map +0 -1
- /package/dist/{browser-viewer-M7BIVFTW.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
- /package/dist/{chunk-PWCBMEV2.js.map → chunk-2I6R3GCZ.js.map} +0 -0
- /package/dist/{chunk-QTSWNANQ.js.map → chunk-2SFFYIH3.js.map} +0 -0
- /package/dist/{chunk-S5ZT4TBR.js.map → chunk-ADWCLI4G.js.map} +0 -0
- /package/dist/{chunk-6SNDCUPB.js.map → chunk-B7TC2A33.js.map} +0 -0
- /package/dist/{chunk-ISN726VG.js.map → chunk-KZC6QRNR.js.map} +0 -0
- /package/dist/{chunk-TIHSXNBC.js.map → chunk-NKMYZFHA.js.map} +0 -0
- /package/dist/{chunk-Q26UAIXI.js.map → chunk-V5ZUJT2T.js.map} +0 -0
- /package/dist/{chunk-5XEXTWEM.js.map → chunk-WIUKB3LD.js.map} +0 -0
- /package/dist/{chunk-UXI7L7DL.js.map → chunk-X5UVUIMF.js.map} +0 -0
- /package/dist/{latest-question-W4DNEH4Q.js.map → latest-question-R77KWSUP.js.map} +0 -0
package/dist/interaction.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
useBrowserSession,
|
|
9
9
|
useBrowserSessions,
|
|
10
10
|
useSiteAuthConnections
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-KZC6QRNR.js";
|
|
12
12
|
import {
|
|
13
13
|
ComputerViewer,
|
|
14
14
|
useComputerFrameStream,
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
useEmbeddedInteraction,
|
|
31
31
|
useEmbeddedInterventions
|
|
32
32
|
} from "./chunk-G76LSA76.js";
|
|
33
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-BLL56F7R.js";
|
|
34
34
|
import "./chunk-TNEZNMSN.js";
|
|
35
35
|
import "./chunk-5I4VRWBB.js";
|
|
36
36
|
import "./chunk-TXS65BB2.js";
|
|
@@ -3,9 +3,9 @@ import {
|
|
|
3
3
|
isTimelineUserQuestion,
|
|
4
4
|
isTurnExecutionEvidence,
|
|
5
5
|
timelineQuestionPlacement
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-2SFFYIH3.js";
|
|
7
7
|
import "./chunk-3PVDYTTB.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-BLL56F7R.js";
|
|
9
9
|
|
|
10
10
|
// src/hooks/latest-question.ts
|
|
11
11
|
import { SESSION_EVENT_TYPES } from "@opengeni/sdk";
|
|
@@ -115,4 +115,4 @@ export {
|
|
|
115
115
|
TIMELINE_TURN_ANCHOR_EVENT_TYPES,
|
|
116
116
|
resolveLatestQuestion
|
|
117
117
|
};
|
|
118
|
-
//# sourceMappingURL=latest-question-
|
|
118
|
+
//# sourceMappingURL=latest-question-R77KWSUP.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a platform draws classic, always-visible scrollbars (Windows, and Linux
|
|
3
|
+
* or macOS when set to always show them), Chromium paints arrow buttons on the
|
|
4
|
+
* thin, colored scrollbars the stylesheet asks for with `scrollbar-width` and
|
|
5
|
+
* `scrollbar-color`. This marks such documents with
|
|
6
|
+
* `data-og-scrollbars="classic"` on <html> so the stylesheet can use a slim
|
|
7
|
+
* rounded thumb there instead. Overlay-scrollbar platforms keep their native
|
|
8
|
+
* scrollbars.
|
|
9
|
+
*/
|
|
10
|
+
export declare const CLASSIC_SCROLLBARS_ATTRIBUTE = "data-og-scrollbars";
|
|
11
|
+
export declare function markClassicScrollbars(doc?: Document | undefined): void;
|
package/dist/machines.js
CHANGED
|
@@ -29,13 +29,13 @@ import {
|
|
|
29
29
|
healthPulses,
|
|
30
30
|
pointsFor,
|
|
31
31
|
useMachines
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-NKMYZFHA.js";
|
|
33
33
|
import "./chunk-CSX5FFKZ.js";
|
|
34
34
|
import "./chunk-R5SBNG7S.js";
|
|
35
35
|
import "./chunk-QHUE7E4N.js";
|
|
36
36
|
import "./chunk-CM7LVUKC.js";
|
|
37
37
|
import "./chunk-G76LSA76.js";
|
|
38
|
-
import "./chunk-
|
|
38
|
+
import "./chunk-BLL56F7R.js";
|
|
39
39
|
import "./chunk-TXS65BB2.js";
|
|
40
40
|
export {
|
|
41
41
|
CONNECTION_STATUS_META,
|
|
@@ -4,8 +4,8 @@ import {
|
|
|
4
4
|
} from "./chunk-EGVHJKGJ.js";
|
|
5
5
|
import "./chunk-LSW2OJVV.js";
|
|
6
6
|
import "./chunk-B27E3V37.js";
|
|
7
|
-
import "./chunk-YSRBFJMQ.js";
|
|
8
7
|
import "./chunk-R5SBNG7S.js";
|
|
8
|
+
import "./chunk-YSRBFJMQ.js";
|
|
9
9
|
import "./chunk-OYQQJL3J.js";
|
|
10
10
|
import "./chunk-PMV53IMM.js";
|
|
11
11
|
import "./chunk-XEA5BCMA.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CLASSIC_SCROLLBARS_ATTRIBUTE, markClassicScrollbars } from "./lib/scrollbars.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/session-ui.js
CHANGED
|
@@ -29,11 +29,15 @@ import {
|
|
|
29
29
|
setStartupDetails,
|
|
30
30
|
useStartupDetails,
|
|
31
31
|
userMessageLikelyNeedsDisclosure
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-OVB5WIG5.js";
|
|
33
33
|
import "./chunk-B27E3V37.js";
|
|
34
34
|
import "./chunk-SHLZMAJN.js";
|
|
35
35
|
import "./chunk-2HVLQ26H.js";
|
|
36
36
|
import "./chunk-LJUMYUBO.js";
|
|
37
|
+
import {
|
|
38
|
+
OpenGeniProvider
|
|
39
|
+
} from "./chunk-R5SBNG7S.js";
|
|
40
|
+
import "./chunk-MK2TQO4Y.js";
|
|
37
41
|
import "./chunk-YSRBFJMQ.js";
|
|
38
42
|
import "./chunk-BOFEQC6K.js";
|
|
39
43
|
import {
|
|
@@ -44,17 +48,14 @@ import {
|
|
|
44
48
|
createOlderHistoryLoadReceipt,
|
|
45
49
|
useNewConversation,
|
|
46
50
|
useSessionConversation
|
|
47
|
-
} from "./chunk-
|
|
48
|
-
import "./chunk-
|
|
49
|
-
import {
|
|
50
|
-
OpenGeniProvider
|
|
51
|
-
} from "./chunk-R5SBNG7S.js";
|
|
51
|
+
} from "./chunk-X5UVUIMF.js";
|
|
52
|
+
import "./chunk-2SFFYIH3.js";
|
|
52
53
|
import {
|
|
53
54
|
SecretAnswerChip,
|
|
54
55
|
SecretRefChip,
|
|
55
56
|
SecretRefText,
|
|
56
57
|
SecretsUiProvider
|
|
57
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-WIUKB3LD.js";
|
|
58
59
|
import "./chunk-OYQQJL3J.js";
|
|
59
60
|
import "./chunk-S2QH6EZ5.js";
|
|
60
61
|
import {
|
|
@@ -69,7 +70,7 @@ import "./chunk-5WOR7UCL.js";
|
|
|
69
70
|
import {
|
|
70
71
|
BUILT_IN_TURN_SUMMARY_FACET_IDS,
|
|
71
72
|
createToolRegistry
|
|
72
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-ADWCLI4G.js";
|
|
73
74
|
import "./chunk-CORUP6JB.js";
|
|
74
75
|
import "./chunk-5YJLGOM5.js";
|
|
75
76
|
import "./chunk-IZV5FTJC.js";
|
|
@@ -80,12 +81,12 @@ import {
|
|
|
80
81
|
import "./chunk-O7F6UJO4.js";
|
|
81
82
|
import "./chunk-UNJPZGNK.js";
|
|
82
83
|
import "./chunk-PEHTX3V7.js";
|
|
83
|
-
import "./chunk-
|
|
84
|
-
import "./chunk-
|
|
84
|
+
import "./chunk-2I6R3GCZ.js";
|
|
85
|
+
import "./chunk-B7TC2A33.js";
|
|
85
86
|
import "./chunk-NX4ADH73.js";
|
|
86
87
|
import "./chunk-XDA5QJE7.js";
|
|
87
88
|
import "./chunk-PMV53IMM.js";
|
|
88
|
-
import "./chunk-
|
|
89
|
+
import "./chunk-V5ZUJT2T.js";
|
|
89
90
|
import "./chunk-KSGQ5ODA.js";
|
|
90
91
|
import "./chunk-XEA5BCMA.js";
|
|
91
92
|
import "./chunk-N7S72EXK.js";
|
|
@@ -94,7 +95,7 @@ import "./chunk-KF33GTWN.js";
|
|
|
94
95
|
import "./chunk-QHUE7E4N.js";
|
|
95
96
|
import "./chunk-CM7LVUKC.js";
|
|
96
97
|
import "./chunk-G76LSA76.js";
|
|
97
|
-
import "./chunk-
|
|
98
|
+
import "./chunk-BLL56F7R.js";
|
|
98
99
|
import "./chunk-TXS65BB2.js";
|
|
99
100
|
|
|
100
101
|
// src/session-ui.ts
|
package/dist/session-ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/session-ui.ts"],"sourcesContent":["// @opengeni/react/session-ui — styled surfaces used by the session route.\n// Keep these separate from the hook-only session entry and the broad root barrel\n// so session hosts do not pay for unrelated React surfaces.\nexport { HumanInputForm } from \"./components/human-input-form\";\nexport type {\n HumanInputAnswerDraft,\n HumanInputFormMessages,\n HumanInputFormProps,\n} from \"./components/human-input-form\";\nexport { HumanInputSurface } from \"./components/human-input-surface\";\nexport {\n SecretAnswerChip,\n SecretRefChip,\n SecretRefText,\n secretReferenceLabel,\n} from \"./components/secret-ref-chip\";\nexport type {\n SecretAnswerChipProps,\n SecretRefChipProps,\n SecretRefTextProps,\n SecretReferenceLabel,\n} from \"./components/secret-ref-chip\";\nexport { SecretsUiProvider } from \"./secrets-ui\";\nexport { ApprovalSurface } from \"./components/approval-surface\";\nexport { ToolActionReviewCard, ToolActionReviewDetails } from \"./components/tool-action-review\";\nexport type { ToolReviewDetailsLoader } from \"./components/tool-action-review\";\nexport type { ApprovalSurfaceProps, ApprovalSurfaceMessages } from \"./components/approval-surface\";\nexport type { HumanInputSurfaceProps } from \"./components/human-input-surface\";\nexport { MessageTimeline, TimelineRow } from \"./components/message-timeline\";\nexport type { MessageTimelineProps } from \"./components/message-timeline\";\nexport type { RenderAllowanceExhausted } from \"./timeline/allowance-exhausted-row\";\nexport type { AllowanceLabels, AllowanceScope } from \"./usage/allowance-copy\";\nexport {\n OpenGeniLinkProvider,\n chainLinkResolvers,\n sessionLinkResolver,\n useOpenGeniLinkResolver,\n viewerLinkResolver,\n} from \"./components/open-geni-links\";\nexport type {\n OpenGeniLinkResolution,\n OpenGeniLinkResolver,\n OpenGeniLinkTarget,\n OpenGeniViewerTarget,\n} from \"./components/open-geni-links\";\nexport { parseOpenGeniLink } from \"@opengeni/sdk\";\nexport {\n ArtifactLabelsProvider,\n DEFAULT_ARTIFACT_LABELS,\n type ArtifactLabels,\n} from \"./components/artifacts/artifact-chrome\";\nexport type { TimelineSearchTarget } from \"./components/timeline-search\";\nexport { createOlderHistoryLoadReceipt } from \"./older-history\";\nexport type { OlderHistoryLoader, OlderHistoryLoadReceipt } from \"./older-history\";\nexport { UserMessageBody, userMessageLikelyNeedsDisclosure } from \"./components/user-message-body\";\nexport type {\n UserMessageBodyProps,\n UserMessageDisclosureLabels,\n} from \"./components/user-message-body\";\nexport { BUILT_IN_TURN_SUMMARY_FACET_IDS } from \"./timeline/turn-summary\";\nexport type {\n BuiltInTurnSummaryFacetId,\n TurnSummaryContext,\n TurnSummaryFacet,\n TurnSummaryFacetConfiguration,\n TurnSummaryFacetResult,\n TurnSummaryOptions,\n} from \"./timeline/turn-summary\";\nexport { QueueSurface } from \"./components/queue-surface\";\n// The provider too, so a host needs only this entry (the root also exports the\n// workbench, whose editors, terminal and desktop are optional peers).\nexport { OpenGeniProvider } from \"./provider\";\nexport type { OpenGeniProviderProps, ErrorMessageFormatter } from \"./provider\";\n// The tool-renderer registry, so custom tool renderers need no root import.\nexport { createDefaultToolRegistry, createToolRegistry, defaultToolRegistry } from \"./timeline\";\nexport type {\n CreateToolRegistryOptions,\n ToolRegistry,\n ToolRegistryEntry,\n ToolRenderer,\n ToolRendererProps,\n} from \"./timeline\";\nexport { SessionConversation, SessionConversationView } from \"./components/session-conversation\";\nexport { useSessionConversation } from \"./hooks/use-session-conversation\";\nexport { useNewConversation } from \"./hooks/use-new-conversation\";\nexport type {\n NewConversationController,\n UseNewConversationOptions,\n NewConversationCreateOptions,\n CreatedConversation,\n} from \"./hooks/use-new-conversation\";\nexport { NewConversation, NewConversationView } from \"./components/new-conversation\";\nexport type {\n NewConversationProps,\n NewConversationViewProps,\n NewConversationLabels,\n} from \"./components/new-conversation\";\nexport type {\n SessionConversationController,\n UseSessionConversationOptions,\n} from \"./hooks/use-session-conversation\";\nexport { SessionList } from \"./components/session-list\";\nexport type { SessionListLabels, SessionListProps } from \"./components/session-list\";\nexport { OpenGeniChat } from \"./components/open-geni-chat\";\nexport type {\n OpenGeniChatCreateOptions,\n OpenGeniChatLabels,\n OpenGeniChatProps,\n} from \"./components/open-geni-chat\";\nexport type {\n SessionConversationLabels,\n SessionConversationProps,\n SessionConversationViewProps,\n} from \"./components/session-conversation\";\nexport type { QueueSurfaceProps } from \"./components/queue-surface\";\nexport {\n SessionChrome,\n sessionChromeGoalPillExplanation,\n sessionChromeGoalPillLabel,\n sessionChromeGoalPillState,\n} from \"./components/session-chrome\";\nexport type {\n SessionChromeAgentsSignal,\n SessionChromeProps,\n SessionChromeSignalId,\n SessionChromeSignalTone,\n} from \"./components/session-chrome\";\nexport { SessionCommandsPanel } from \"./components/session-commands-panel\";\nexport { SessionCommands } from \"./components/session-commands\";\n\nexport { KnowledgeActivityProvider } from \"./timeline/knowledge-receipt\";\nexport type { KnowledgeActivityActions } from \"./timeline/knowledge-receipt\";\nexport { StartupTimings } from \"./timeline/startup-timings\";\nexport { useStartupDetails, setStartupDetails } from \"./timeline/startup-preference\";\nexport type { GenieLoadingOptions } from \"./timeline/genie-loading\";\n\nexport { ToolReviewHistoryProvider } from \"./components/tool-review-history\";\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/session-ui.ts"],"sourcesContent":["// @opengeni/react/session-ui — styled surfaces used by the session route.\n// Keep these separate from the hook-only session entry and the broad root barrel\n// so session hosts do not pay for unrelated React surfaces.\nexport { HumanInputForm } from \"./components/human-input-form\";\nexport type {\n HumanInputAnswerDraft,\n HumanInputFormMessages,\n HumanInputFormProps,\n} from \"./components/human-input-form\";\nexport { HumanInputSurface } from \"./components/human-input-surface\";\nexport {\n SecretAnswerChip,\n SecretRefChip,\n SecretRefText,\n secretReferenceLabel,\n} from \"./components/secret-ref-chip\";\nexport type {\n SecretAnswerChipProps,\n SecretRefChipProps,\n SecretRefTextProps,\n SecretReferenceLabel,\n} from \"./components/secret-ref-chip\";\nexport { SecretsUiProvider } from \"./secrets-ui\";\nexport { ApprovalSurface } from \"./components/approval-surface\";\nexport { ToolActionReviewCard, ToolActionReviewDetails } from \"./components/tool-action-review\";\nexport type { ToolReviewDetailsLoader } from \"./components/tool-action-review\";\nexport type { ApprovalSurfaceProps, ApprovalSurfaceMessages } from \"./components/approval-surface\";\nexport type { HumanInputSurfaceProps } from \"./components/human-input-surface\";\nexport { MessageTimeline, TimelineRow } from \"./components/message-timeline\";\nexport type { MessageTimelineProps } from \"./components/message-timeline\";\nexport type { RenderAllowanceExhausted } from \"./timeline/allowance-exhausted-row\";\nexport type { AllowanceLabels, AllowanceScope } from \"./usage/allowance-copy\";\nexport {\n OpenGeniLinkProvider,\n chainLinkResolvers,\n sessionLinkResolver,\n useOpenGeniLinkResolver,\n viewerLinkResolver,\n} from \"./components/open-geni-links\";\nexport type {\n OpenGeniLinkResolution,\n OpenGeniLinkResolver,\n OpenGeniLinkTarget,\n OpenGeniViewerTarget,\n} from \"./components/open-geni-links\";\nexport { parseOpenGeniLink } from \"@opengeni/sdk\";\nexport {\n ArtifactLabelsProvider,\n DEFAULT_ARTIFACT_LABELS,\n type ArtifactLabels,\n} from \"./components/artifacts/artifact-chrome\";\nexport type { TimelineSearchTarget } from \"./components/timeline-search\";\nexport { createOlderHistoryLoadReceipt } from \"./older-history\";\nexport type { OlderHistoryLoader, OlderHistoryLoadReceipt } from \"./older-history\";\nexport { UserMessageBody, userMessageLikelyNeedsDisclosure } from \"./components/user-message-body\";\nexport type {\n UserMessageBodyProps,\n UserMessageDisclosureLabels,\n} from \"./components/user-message-body\";\nexport { BUILT_IN_TURN_SUMMARY_FACET_IDS } from \"./timeline/turn-summary\";\nexport type {\n BuiltInTurnSummaryFacetId,\n TurnSummaryContext,\n TurnSummaryFacet,\n TurnSummaryFacetConfiguration,\n TurnSummaryFacetResult,\n TurnSummaryOptions,\n} from \"./timeline/turn-summary\";\nexport { QueueSurface } from \"./components/queue-surface\";\n// The provider too, so a host needs only this entry (the root also exports the\n// workbench, whose editors, terminal and desktop are optional peers).\nexport { OpenGeniProvider } from \"./provider\";\nexport type { OpenGeniProviderProps, ErrorMessageFormatter } from \"./provider\";\n// The tool-renderer registry, so custom tool renderers need no root import.\nexport { createDefaultToolRegistry, createToolRegistry, defaultToolRegistry } from \"./timeline\";\nexport type {\n CreateToolRegistryOptions,\n ToolRegistry,\n ToolRegistryEntry,\n ToolRenderer,\n ToolRendererProps,\n} from \"./timeline\";\nexport { SessionConversation, SessionConversationView } from \"./components/session-conversation\";\nexport { useSessionConversation } from \"./hooks/use-session-conversation\";\nexport { useNewConversation } from \"./hooks/use-new-conversation\";\nexport type {\n NewConversationController,\n UseNewConversationOptions,\n NewConversationCreateOptions,\n CreatedConversation,\n} from \"./hooks/use-new-conversation\";\nexport { NewConversation, NewConversationView } from \"./components/new-conversation\";\nexport type {\n NewConversationProps,\n NewConversationViewProps,\n NewConversationLabels,\n} from \"./components/new-conversation\";\nexport type {\n SessionConversationController,\n UseSessionConversationOptions,\n} from \"./hooks/use-session-conversation\";\nexport { SessionList } from \"./components/session-list\";\nexport type { SessionListLabels, SessionListProps } from \"./components/session-list\";\nexport { OpenGeniChat } from \"./components/open-geni-chat\";\nexport type {\n OpenGeniChatCreateOptions,\n OpenGeniChatLabels,\n OpenGeniChatProps,\n} from \"./components/open-geni-chat\";\nexport type {\n SessionConversationLabels,\n SessionConversationProps,\n SessionConversationViewProps,\n} from \"./components/session-conversation\";\nexport type { QueueSurfaceProps } from \"./components/queue-surface\";\nexport {\n SessionChrome,\n sessionChromeGoalPillExplanation,\n sessionChromeGoalPillLabel,\n sessionChromeGoalPillState,\n} from \"./components/session-chrome\";\nexport type {\n SessionChromeAgentsSignal,\n SessionChromeProps,\n SessionChromeSignalId,\n SessionChromeSignalTone,\n} from \"./components/session-chrome\";\nexport { SessionCommandsPanel } from \"./components/session-commands-panel\";\nexport { SessionCommands } from \"./components/session-commands\";\n\nexport { KnowledgeActivityProvider } from \"./timeline/knowledge-receipt\";\nexport type { KnowledgeActivityActions } from \"./timeline/knowledge-receipt\";\nexport { StartupTimings } from \"./timeline/startup-timings\";\nexport { useStartupDetails, setStartupDetails } from \"./timeline/startup-preference\";\nexport type { GenieLoadingOptions } from \"./timeline/genie-loading\";\n\nexport { ToolReviewHistoryProvider } from \"./components/tool-review-history\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,SAAS,yBAAyB;","names":[]}
|
package/dist/session.js
CHANGED
|
@@ -24,14 +24,14 @@ import {
|
|
|
24
24
|
useSessionConversation,
|
|
25
25
|
useSessionEvents,
|
|
26
26
|
useTurnQueue
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-X5UVUIMF.js";
|
|
28
28
|
import {
|
|
29
29
|
buildTimeline,
|
|
30
30
|
creditExhaustedFromEvents,
|
|
31
31
|
extractSessionRef,
|
|
32
32
|
groupTimeline,
|
|
33
33
|
sessionStatusFromEvents
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-2SFFYIH3.js";
|
|
35
35
|
import {
|
|
36
36
|
humanInputRequestFromEvent,
|
|
37
37
|
projectPendingHumanInputRequests
|
|
@@ -45,12 +45,12 @@ import {
|
|
|
45
45
|
shouldSteerOnKey,
|
|
46
46
|
shouldSubmitOnKey,
|
|
47
47
|
useComposer
|
|
48
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-V5ZUJT2T.js";
|
|
49
49
|
import "./chunk-KF33GTWN.js";
|
|
50
50
|
import "./chunk-QHUE7E4N.js";
|
|
51
51
|
import "./chunk-CM7LVUKC.js";
|
|
52
52
|
import "./chunk-G76LSA76.js";
|
|
53
|
-
import "./chunk-
|
|
53
|
+
import "./chunk-BLL56F7R.js";
|
|
54
54
|
export {
|
|
55
55
|
FILE_ONLY_MESSAGE_TEXT,
|
|
56
56
|
approvalsFromRequiresAction,
|
package/dist/timeline-model.js
CHANGED
|
@@ -66,7 +66,7 @@ import {
|
|
|
66
66
|
webSearchPresentation,
|
|
67
67
|
withComputePreview,
|
|
68
68
|
writeStdinPresentation
|
|
69
|
-
} from "./chunk-
|
|
69
|
+
} from "./chunk-ADWCLI4G.js";
|
|
70
70
|
import {
|
|
71
71
|
STARTUP_WAIT_TITLES,
|
|
72
72
|
namedAgentTitle,
|
|
@@ -102,7 +102,7 @@ import {
|
|
|
102
102
|
formatRelativeTime,
|
|
103
103
|
stringifyPayload,
|
|
104
104
|
tryParseJson
|
|
105
|
-
} from "./chunk-
|
|
105
|
+
} from "./chunk-BLL56F7R.js";
|
|
106
106
|
|
|
107
107
|
// src/notification-text.ts
|
|
108
108
|
var INLINE = /\*\*(.+?)\*\*|__(.+?)__|`([^`]+)`|\[([^\]]+)\]\((https:\/\/[^\s)]+)\)/gu;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opengeni/react",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.2",
|
|
4
4
|
"description": "React hooks and styled components for Opengeni: live session streaming, chat composer, message timeline, session status, and fleet views — token-themed (CSS variables), dark-first, built on Tailwind v4 + Radix + Motion.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -175,6 +175,10 @@
|
|
|
175
175
|
"types": "./dist/session-agents-model.d.ts",
|
|
176
176
|
"import": "./dist/session-agents-model.js"
|
|
177
177
|
},
|
|
178
|
+
"./scrollbars": {
|
|
179
|
+
"types": "./dist/scrollbars.d.ts",
|
|
180
|
+
"import": "./dist/scrollbars.js"
|
|
181
|
+
},
|
|
178
182
|
"./session-list-model": {
|
|
179
183
|
"types": "./dist/session-list-model.d.ts",
|
|
180
184
|
"import": "./dist/session-list-model.js"
|
|
@@ -213,8 +217,8 @@
|
|
|
213
217
|
"@dnd-kit/utilities": "3.2.2",
|
|
214
218
|
"@fontsource-variable/noto-sans-arabic": "5.2.10",
|
|
215
219
|
"@fontsource-variable/noto-sans-jp": "5.2.10",
|
|
216
|
-
"@opengeni/connect": "3.
|
|
217
|
-
"@opengeni/sdk": "3.
|
|
220
|
+
"@opengeni/connect": "3.1.2",
|
|
221
|
+
"@opengeni/sdk": "3.1.2",
|
|
218
222
|
"clsx": "^2.1.1",
|
|
219
223
|
"dequal": "2.0.3",
|
|
220
224
|
"lucide-react": "^1.8.0",
|
package/src/index.ts
CHANGED
package/src/lib/host-theme.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CSSProperties, type RefObject, useLayoutEffect, useEffect, useState } from "react";
|
|
2
|
+
import { markClassicScrollbars } from "./scrollbars";
|
|
2
3
|
|
|
3
4
|
/* ----------------------------------------------------------------------------
|
|
4
5
|
Host theme
|
|
@@ -457,6 +458,10 @@ export function useHostTheme(
|
|
|
457
458
|
style: Record<string, string> | null;
|
|
458
459
|
}>({ theme: preference === "auto" ? undefined : preference, inherited: false, style: null });
|
|
459
460
|
|
|
461
|
+
useIsomorphicLayoutEffect(() => {
|
|
462
|
+
markClassicScrollbars(ref.current?.ownerDocument);
|
|
463
|
+
}, [ref]);
|
|
464
|
+
|
|
460
465
|
useIsomorphicLayoutEffect(() => {
|
|
461
466
|
const element = ref.current;
|
|
462
467
|
if (!element || typeof window === "undefined") return;
|
|
@@ -58,6 +58,7 @@ const RECOVERY_CODES: ReadonlySet<string> = new Set([
|
|
|
58
58
|
"mcp_transport_timeout",
|
|
59
59
|
"mcp_transport_unavailable",
|
|
60
60
|
"sandbox_command_start_unavailable",
|
|
61
|
+
"retained_attachment_unavailable",
|
|
61
62
|
"turn_execution_policy_definition_mismatch",
|
|
62
63
|
]);
|
|
63
64
|
|
|
@@ -154,6 +155,8 @@ export function providerRecoverySubject(facts: ProviderRecoveryFacts): string {
|
|
|
154
155
|
return "A required MCP server is unreachable";
|
|
155
156
|
case "sandbox_command_start_unavailable":
|
|
156
157
|
return "The sandbox isn't ready yet";
|
|
158
|
+
case "retained_attachment_unavailable":
|
|
159
|
+
return "An image from earlier in this conversation can't be read from storage";
|
|
157
160
|
case "turn_execution_policy_definition_mismatch":
|
|
158
161
|
return "Opengeni is applying a configuration update";
|
|
159
162
|
case "sandbox_deadline_rotation":
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a platform draws classic, always-visible scrollbars (Windows, and Linux
|
|
3
|
+
* or macOS when set to always show them), Chromium paints arrow buttons on the
|
|
4
|
+
* thin, colored scrollbars the stylesheet asks for with `scrollbar-width` and
|
|
5
|
+
* `scrollbar-color`. This marks such documents with
|
|
6
|
+
* `data-og-scrollbars="classic"` on <html> so the stylesheet can use a slim
|
|
7
|
+
* rounded thumb there instead. Overlay-scrollbar platforms keep their native
|
|
8
|
+
* scrollbars.
|
|
9
|
+
*/
|
|
10
|
+
export const CLASSIC_SCROLLBARS_ATTRIBUTE = "data-og-scrollbars";
|
|
11
|
+
|
|
12
|
+
const marked = new WeakSet<Document>();
|
|
13
|
+
|
|
14
|
+
export function markClassicScrollbars(doc: Document | undefined = globalThis.document): void {
|
|
15
|
+
if (!doc?.documentElement || marked.has(doc)) return;
|
|
16
|
+
marked.add(doc);
|
|
17
|
+
const root = doc.documentElement;
|
|
18
|
+
// Probe with the platform default: the page's own scrollbar styles must not
|
|
19
|
+
// decide what the platform draws.
|
|
20
|
+
root.removeAttribute(CLASSIC_SCROLLBARS_ATTRIBUTE);
|
|
21
|
+
const probe = doc.createElement("div");
|
|
22
|
+
probe.setAttribute("aria-hidden", "true");
|
|
23
|
+
probe.style.cssText =
|
|
24
|
+
"position:absolute;top:-9999px;left:-9999px;width:100px;height:100px;" +
|
|
25
|
+
"overflow:scroll;visibility:hidden;scrollbar-width:auto;scrollbar-color:auto";
|
|
26
|
+
root.append(probe);
|
|
27
|
+
const classic = probe.offsetWidth - probe.clientWidth > 0;
|
|
28
|
+
probe.remove();
|
|
29
|
+
if (classic) root.setAttribute(CLASSIC_SCROLLBARS_ATTRIBUTE, "classic");
|
|
30
|
+
}
|
package/styles/compiled.css
CHANGED
|
@@ -1205,6 +1205,29 @@
|
|
|
1205
1205
|
scrollbar-width: thin;
|
|
1206
1206
|
scrollbar-color: var(--og-color-border-strong) transparent;
|
|
1207
1207
|
}
|
|
1208
|
+
@supports selector(::-webkit-scrollbar) {
|
|
1209
|
+
:where(:root[data-og-scrollbars="classic"]) :where(.og-root) :where(*) {
|
|
1210
|
+
scrollbar-width: auto;
|
|
1211
|
+
scrollbar-color: auto;
|
|
1212
|
+
}
|
|
1213
|
+
:where(:root[data-og-scrollbars="classic"]) :where(.og-root) :where(*)::-webkit-scrollbar {
|
|
1214
|
+
width: 10px;
|
|
1215
|
+
height: 10px;
|
|
1216
|
+
background: transparent;
|
|
1217
|
+
}
|
|
1218
|
+
:where(:root[data-og-scrollbars="classic"]) :where(.og-root) :where(*)::-webkit-scrollbar-thumb {
|
|
1219
|
+
border: 3px solid transparent;
|
|
1220
|
+
border-radius: 999px;
|
|
1221
|
+
background: var(--og-color-border-strong) padding-box;
|
|
1222
|
+
}
|
|
1223
|
+
:where(:root[data-og-scrollbars="classic"]) :where(.og-root) :where(*)::-webkit-scrollbar-thumb:hover {
|
|
1224
|
+
border-width: 2px;
|
|
1225
|
+
background-color: var(--og-color-fg-subtle);
|
|
1226
|
+
}
|
|
1227
|
+
:where(:root[data-og-scrollbars="classic"]) :where(.og-root) :where(*)::-webkit-scrollbar-corner {
|
|
1228
|
+
background: transparent;
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1208
1231
|
:where(.og-root)[data-radix-popper-content-wrapper]:has( > [data-machine-state-popover][data-state="closed"] ),:where(.og-root) [data-radix-popper-content-wrapper]:has( > [data-machine-state-popover][data-state="closed"] ) {
|
|
1209
1232
|
visibility: hidden;
|
|
1210
1233
|
pointer-events: none;
|
package/styles/index.css
CHANGED
|
@@ -589,6 +589,37 @@
|
|
|
589
589
|
scrollbar-color: var(--og-color-border-strong) transparent;
|
|
590
590
|
}
|
|
591
591
|
|
|
592
|
+
/* Classic-scrollbar platforms (see markClassicScrollbars): Chromium would draw
|
|
593
|
+
arrow buttons on the thin, colored scrollbar above, so use a slim rounded
|
|
594
|
+
thumb that widens on hover instead. */
|
|
595
|
+
@supports selector(::-webkit-scrollbar) {
|
|
596
|
+
:where(:root[data-og-scrollbars="classic"]) .og-root :where(*) {
|
|
597
|
+
scrollbar-width: auto;
|
|
598
|
+
scrollbar-color: auto;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
:where(:root[data-og-scrollbars="classic"]) .og-root :where(*)::-webkit-scrollbar {
|
|
602
|
+
width: 10px;
|
|
603
|
+
height: 10px;
|
|
604
|
+
background: transparent;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
:where(:root[data-og-scrollbars="classic"]) .og-root :where(*)::-webkit-scrollbar-thumb {
|
|
608
|
+
border: 3px solid transparent;
|
|
609
|
+
border-radius: 999px;
|
|
610
|
+
background: var(--og-color-border-strong) padding-box;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
:where(:root[data-og-scrollbars="classic"]) .og-root :where(*)::-webkit-scrollbar-thumb:hover {
|
|
614
|
+
border-width: 2px;
|
|
615
|
+
background-color: var(--og-color-fg-subtle);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
:where(:root[data-og-scrollbars="classic"]) .og-root :where(*)::-webkit-scrollbar-corner {
|
|
619
|
+
background: transparent;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
592
623
|
/* The machine popover stays mounted so its trigger's `aria-controls` always
|
|
593
624
|
resolves. Keep Radix's positioning wrapper measurable while closed, but
|
|
594
625
|
remove the entire fixed layer from painting, hit testing, and the a11y tree.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/provider-recovery.ts","../src/lib/format.ts"],"sourcesContent":["import type { SessionEvent, SessionStatus } from \"@opengeni/sdk\";\n\n/**\n * Finite same-turn provider recovery, projected for people. Presentation only:\n * the worker owns retry authority, pacing and the recovery budget. The worker\n * (`apps/worker/src/activities/agent-turn/provider-recovery-copy.ts`) writes\n * the same exhausted sentence into `turn.failed.error`; keep the two in step.\n */\nexport type ProviderRecoveryCondition =\n | \"overloaded\"\n | \"unavailable\"\n | \"unresponsive\"\n | \"rate_limited\";\n\nexport type ProviderRecoveryFacts = {\n /** Recorded worker failure code (`provider_unavailable`, `mcp_transport_timeout`, ...). */\n code: string;\n condition: ProviderRecoveryCondition | null;\n /** Display label of the affected model, when the route was recorded. */\n modelLabel: string | null;\n /** Display label of the serving provider, when the route was recorded. */\n providerLabel: string | null;\n /** Automatic retries scheduled (live) or spent (exhausted). */\n attempt: number | null;\n /** Finite automatic retry budget. */\n maxAttempts: number | null;\n /** True when the model route itself is affected, so another model may help. */\n modelRoute: boolean;\n /** True while the turn waits for its sandbox to be saved and replaced. It\n * has no retry budget: it resumes as soon as the successor box is ready. */\n sandboxWait?: boolean;\n /** Recorded lifecycle fence of a sandbox wait (`capture_in_progress`,\n * `rotation_in_progress`, `provider_recovery_in_progress`), when known. */\n sandboxTransition?: string | null;\n};\n\nconst MODEL_CODES: ReadonlySet<string> = new Set([\n \"provider_unavailable\",\n \"provider_rate_limited\",\n \"provider_unknown_finish_reason\",\n \"post_compaction_continuation_empty\",\n]);\n\n/** A recovering turn parked behind a sandbox lifecycle transition (worker\n * `failure-settlement.ts`). Before, this showed only \"Recovering\" with no\n * reason. A superseded lease\n * counts only when the worker recorded the pending transition it waits for. */\nconst SANDBOX_WAIT_CODES: ReadonlySet<string> = new Set([\n \"sandbox_deadline_rotation\",\n \"sandbox_lifecycle_transition\",\n \"sandbox_lease_superseded\",\n]);\n\nconst RECOVERY_CODES: ReadonlySet<string> = new Set([\n ...MODEL_CODES,\n ...SANDBOX_WAIT_CODES,\n \"upstream_connectivity_unavailable\",\n \"mcp_transport_timeout\",\n \"mcp_transport_unavailable\",\n \"sandbox_command_start_unavailable\",\n \"turn_execution_policy_definition_mismatch\",\n]);\n\n/** Matches the worker's default budget for legacy events that omit it. */\nconst DEFAULT_MAX_ATTEMPTS = 5;\n\nfunction text(value: unknown, max = 120): string | null {\n if (typeof value !== \"string\") return null;\n const normalized = value.replace(/\\s+/g, \" \").trim();\n return normalized ? normalized.slice(0, max) : null;\n}\n\nfunction count(value: unknown): number | null {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0 ? value : null;\n}\n\nfunction condition(\n payload: Record<string, unknown>,\n code: string,\n): ProviderRecoveryCondition | null {\n const recorded = payload.providerCondition;\n if (\n recorded === \"overloaded\" ||\n recorded === \"unavailable\" ||\n recorded === \"unresponsive\" ||\n recorded === \"rate_limited\"\n )\n return recorded;\n if (code === \"provider_rate_limited\") return \"rate_limited\";\n if (code !== \"provider_unavailable\") return null;\n // Older events predate the typed condition; their provider text still says so.\n return [payload.lastRetryableError, payload.detail, payload.error].some(\n (value) => typeof value === \"string\" && /\\boverload(?:ed)?(?:_error)?\\b/i.test(value),\n )\n ? \"overloaded\"\n : null;\n}\n\n/**\n * Read a retryable `turn.recovery.requested` payload or an exhausted\n * `turn.failed` payload. Returns null for every other recovery reason (human\n * Retry, worker shutdown, credential rotation, capacity waits, ...).\n */\nexport function parseProviderRecovery(payload: unknown): ProviderRecoveryFacts | null {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) return null;\n const record = payload as Record<string, unknown>;\n const code = text(record.code) ?? text(record.reason);\n if (!code || !RECOVERY_CODES.has(code)) return null;\n const rotation = text(record.rotationReason);\n const transition = text(record.transitionReason);\n if (code === \"sandbox_lease_superseded\" && !rotation && !transition) return null;\n // A live recovery request is retryable; a spent budget is explicitly marked.\n if (record.recoveryExhausted !== true && record.retryable === false) return null;\n const attempt = count(record.providerRecoveryCount);\n return {\n code,\n condition: condition(record, code),\n modelLabel: text(record.modelLabel),\n providerLabel: text(record.providerLabel),\n attempt,\n maxAttempts: count(record.maxProviderRecoveryCount) ?? DEFAULT_MAX_ATTEMPTS,\n modelRoute: MODEL_CODES.has(code),\n ...(SANDBOX_WAIT_CODES.has(code)\n ? {\n sandboxWait: true,\n sandboxTransition: transition ?? (rotation ? \"rotation_in_progress\" : null),\n }\n : {}),\n };\n}\n\n/** One present-tense clause naming what is unavailable, without a trailing period. */\nexport function providerRecoverySubject(facts: ProviderRecoveryFacts): string {\n const model = facts.modelLabel ?? \"The model\";\n const at = facts.providerLabel ? ` at the provider (${facts.providerLabel})` : \" at the provider\";\n switch (facts.code) {\n case \"provider_rate_limited\":\n return `${model} is rate limited${at}`;\n case \"provider_unavailable\":\n return facts.condition === \"overloaded\"\n ? `${model} is overloaded${at}`\n : facts.condition === \"unresponsive\"\n ? `${model} stopped responding${at}`\n : `${model} is temporarily unavailable${at}`;\n case \"provider_unknown_finish_reason\":\n return `${model} ended its response unexpectedly`;\n case \"post_compaction_continuation_empty\":\n return `${model} stopped right after compacting the conversation`;\n case \"upstream_connectivity_unavailable\":\n return \"Opengeni can't reach an upstream service\";\n case \"mcp_transport_timeout\":\n return \"A required MCP server isn't responding\";\n case \"mcp_transport_unavailable\":\n return \"A required MCP server is unreachable\";\n case \"sandbox_command_start_unavailable\":\n return \"The sandbox isn't ready yet\";\n case \"turn_execution_policy_definition_mismatch\":\n return \"Opengeni is applying a configuration update\";\n case \"sandbox_deadline_rotation\":\n return \"The sandbox reached its maximum lifetime, so Opengeni is moving the workspace to a fresh sandbox\";\n case \"sandbox_lifecycle_transition\":\n case \"sandbox_lease_superseded\":\n return facts.sandboxTransition === \"capture_in_progress\"\n ? \"Opengeni is saving the sandbox workspace\"\n : facts.sandboxTransition === \"provider_recovery_in_progress\"\n ? \"Opengeni is recovering the sandbox\"\n : facts.sandboxTransition === \"rotation_in_progress\"\n ? \"Opengeni is moving the workspace to a fresh sandbox\"\n : \"Opengeni is preparing the sandbox\";\n default:\n return \"A service this turn depends on is temporarily unavailable\";\n }\n}\n\n/** Live status while the same turn waits for its next automatic retry. */\nexport function providerRecoveryRetryingText(facts: ProviderRecoveryFacts): string {\n if (facts.sandboxWait) return `${providerRecoverySubject(facts)}…`;\n const progress =\n facts.attempt !== null && facts.maxAttempts !== null\n ? ` (attempt ${Math.min(facts.attempt, facts.maxAttempts)} of ${facts.maxAttempts})`\n : \" automatically\";\n return `${providerRecoverySubject(facts)} — retrying${progress}…`;\n}\n\n/** Terminal sentence once the automatic budget is spent. */\nexport function providerRecoveryExhaustedText(facts: ProviderRecoveryFacts): string {\n const spent = facts.attempt ?? facts.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n const retried = `Opengeni retried ${spent} ${spent === 1 ? \"time\" : \"times\"} without success.`;\n const remedy = facts.modelRoute\n ? \"Try again in a few minutes, or switch to another model.\"\n : \"Try again in a few minutes.\";\n return `${providerRecoverySubject(facts)}. ${retried} ${remedy}`;\n}\n\nconst BOUNDARY_TYPES: ReadonlySet<string> = new Set([\n \"turn.recovery.requested\",\n \"turn.started\",\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"turn.superseded\",\n]);\n\n/**\n * The active turn's current automatic provider retry, or null. Only a\n * `recovering`, unpaused session qualifies, and only the newest boundary of its\n * exact active turn counts, so merged or replayed pages never borrow another\n * turn's diagnosis.\n */\nexport function currentProviderRecovery(\n session: {\n id: string;\n status: SessionStatus | null | undefined;\n activeTurnId: string | null | undefined;\n effectiveControl?: { state: string } | null | undefined;\n },\n events: readonly SessionEvent[],\n): ProviderRecoveryFacts | null {\n if (\n session.status !== \"recovering\" ||\n (session.effectiveControl && session.effectiveControl.state !== \"active\") ||\n !session.activeTurnId\n )\n return null;\n let latest: SessionEvent | undefined;\n for (const event of events) {\n if (\n event.sessionId !== session.id ||\n event.turnId !== session.activeTurnId ||\n event.duplicateOfEventId ||\n (event.turnAssociation && event.turnAssociation !== \"current\") ||\n !BOUNDARY_TYPES.has(event.type)\n )\n continue;\n if (!latest || event.sequence > latest.sequence) latest = event;\n }\n if (latest?.type !== \"turn.recovery.requested\") return null;\n const payload = latest.payload as Record<string, unknown> | null | undefined;\n return payload?.recoveryExhausted === true ? null : parseProviderRecovery(payload);\n}\n","import { formatErrorMessage, OpenGeniApiError } from \"@opengeni/sdk\";\nimport { parseProviderRecovery, providerRecoveryExhaustedText } from \"./provider-recovery\";\n\nconst clockTimeFormatter = new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n});\n\n/** Local finished-at stamp for message footers: \"Aug 2, 3:42 PM\" / locale-equivalent. */\nexport function formatClockTime(iso: string): string {\n const then = new Date(iso);\n if (Number.isNaN(then.getTime())) {\n return \"\";\n }\n return clockTimeFormatter.format(then);\n}\n\n/** Compact relative time: \"now\", \"42s\", \"7m\", \"3h\", \"2d\", then a date. */\nexport function formatRelativeTime(iso: string, now: Date = new Date()): string {\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) {\n return \"\";\n }\n const seconds = Math.max(0, Math.floor((now.getTime() - then) / 1000));\n if (seconds < 10) {\n return \"now\";\n }\n if (seconds < 60) {\n return `${seconds}s`;\n }\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes}m`;\n }\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return `${hours}h`;\n }\n const days = Math.floor(hours / 24);\n if (days < 14) {\n return `${days}d`;\n }\n return new Date(iso).toLocaleDateString();\n}\n\n/** Human-readable byte size: \"512 B\", \"8.0 KB\", \"1.4 MB\", \"3 GB\". */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\"] as const;\n let value = bytes / 1024;\n for (const unit of units) {\n if (value < 1024 || unit === \"GB\") {\n return `${value.toFixed(value < 10 ? 1 : 0)} ${unit}`;\n }\n value /= 1024;\n }\n return `${bytes} B`;\n}\n\n/** Single-line preview of arbitrary text, for tiles and collapsed rows. */\nexport function truncate(text: string, maxLength: number): string {\n const collapsed = text.replace(/\\s+/g, \" \").trim();\n if (collapsed.length <= maxLength) {\n return collapsed;\n }\n return `${collapsed.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;\n}\n\n/** Render an unknown payload as readable text (pretty JSON when possible). */\nexport function stringifyPayload(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n const parsed = tryParseJson(value);\n if (parsed !== undefined && typeof parsed === \"object\") {\n return stringifyPayload(parsed);\n }\n return value;\n }\n try {\n return JSON.stringify(value, null, 2) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/** JSON.parse that returns `undefined` instead of throwing. */\nexport function tryParseJson(text: string): unknown {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\") && !trimmed.startsWith('\"')) {\n return undefined;\n }\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return undefined;\n }\n}\n\n/**\n * The canonical credit-death sentence. Credit exhaustion is the one failure a\n * user can fix themselves — the copy must say what happened (empty balance),\n * what to do (add credits), and what is safe (nothing was lost). Crucially it\n * must NOT say \"send a message to revive\": a revive turn burns credits the\n * workspace no longer has.\n */\nexport const CREDIT_EXHAUSTION_MESSAGE =\n \"Out of credits — this workspace's balance is empty. Add credits to continue; the conversation is preserved.\";\n\n/** A usage ceiling refused the send; the default allowance wording, plus what is safe. */\nexport const COMPOSER_MEMBER_ALLOWANCE_MESSAGE =\n \"Usage limit reached. A workspace admin can raise this limit. Your draft is preserved.\";\nexport const COMPOSER_WORKSPACE_ALLOWANCE_MESSAGE =\n \"Workspace usage limit reached. An organization admin can raise the workspace budget. Your draft is preserved.\";\n\n/**\n * Actionable composer copy for an edge rejection before a turn is accepted.\n * Unlike an in-flight credit exhaustion, this path has not consumed the\n * actor-private draft or any finalized attachment.\n */\nexport const COMPOSER_PAYMENT_REQUIRED_MESSAGE =\n \"Your organization doesn't have enough credits to send this message. Add credits or choose a model with another payment source. Your message and attachments are saved.\";\n\n/** Trusted, composer-owned guidance; unlike remote diagnostic prose, this is UI copy. */\nexport class ComposerStateError extends Error {}\n\n/** A restored request has omitted credentials and must be reconciled, not replayed. */\nexport class ComposerReconciliationRequiredError extends ComposerStateError {\n constructor() {\n super(\n \"Opengeni cannot safely retry this uncertain request after remount; reconcile the session before sending again.\",\n );\n }\n}\n\nexport class ComposerWorkspaceControlUnavailableError extends Error {\n constructor() {\n super(\"@opengeni/react: workspace-scoped resume requires setWorkspaceInferenceState.\");\n }\n}\n\n/**\n * The send named a model that is no longer in the live catalog (retired or\n * removed). Retrying the same send cannot succeed; the person must choose\n * another model, and the typed message stays recoverable via Edit message.\n */\nexport const COMPOSER_MODEL_UNAVAILABLE_MESSAGE =\n \"This chat's model is no longer available. Choose another model to continue. Your message is saved.\";\n\n/** `details.code` the API sets on a 422 for a model missing from the live catalog. */\nexport const MODEL_UNAVAILABLE_DETAIL_CODE = \"model_unavailable\";\n\n/**\n * A fresh Send or Steer refused because the task's own usage limit is reached.\n * The draft is kept and an unchanged retry is never offered. The one current\n * recovery action (raise or remove the limit, resume a goal) belongs to the\n * composer's `SessionUsageLimitNotice`, so this line only says what happened.\n */\nexport const COMPOSER_SESSION_USAGE_LIMIT_MESSAGE =\n \"This task's usage limit is reached. Your message is saved.\";\n\n/** The earlier wording, still recognized in refusals restored from storage. */\nconst LEGACY_COMPOSER_SESSION_USAGE_LIMIT_MESSAGE =\n \"This task's usage limit is reached. Raise or remove the limit to continue. Your message is saved.\";\n\n/**\n * Is this send refusal the task's usage limit? Reads the typed SDK error code\n * (`OpenGeniSessionUsageLimitReachedError`), and also the composer's own\n * sentence so a refusal restored from storage after a reload is recognized.\n */\nexport function isSessionUsageLimitSubmissionError(error: Error): boolean {\n return (\n (error instanceof OpenGeniApiError && error.code === \"session_usage_limit_reached\") ||\n error.message === COMPOSER_SESSION_USAGE_LIMIT_MESSAGE ||\n error.message === LEGACY_COMPOSER_SESSION_USAGE_LIMIT_MESSAGE\n );\n}\n\n/**\n * Is this send refusal \"the model is no longer available\"? Reads the typed\n * `details.code`, and also the historical message so a refusal persisted\n * before a reload (only its text survives) or from an older API is recognized.\n */\nexport function isModelUnavailableSubmissionError(error: Error): boolean {\n if (error instanceof OpenGeniApiError && error.details?.code === MODEL_UNAVAILABLE_DETAIL_CODE) {\n return true;\n }\n return (\n error.message === COMPOSER_MODEL_UNAVAILABLE_MESSAGE ||\n /^(?:Opengeni|OpenGeni) API 422: model is not available: /.test(error.message)\n );\n}\n\n/**\n * What a published Site's assistant tells a viewer it refused, by the\n * refusal's `details.code`. The draft is kept in every case.\n */\nexport const COMPOSER_SITE_REFUSAL_MESSAGES: Readonly<Record<string, string>> = Object.freeze({\n not_available_for_viewer: \"This Site's assistant can't do that for you. Your message is saved.\",\n site_budget_exhausted:\n \"This Site's assistant has reached its usage limit for now. Your message is saved.\",\n site_budget_busy: \"This Site's assistant is busy. Try again in a moment. Your message is saved.\",\n site_platform_brake_engaged:\n \"This Site's assistant is paused for visitors right now. Your message is saved.\",\n});\n\n/** The Site refusal code of a send refusal, if it is one. */\nexport function siteRefusalCode(error: Error): string | null {\n if (!(error instanceof OpenGeniApiError)) return null;\n const code = error.details?.code;\n return typeof code === \"string\" && code in COMPOSER_SITE_REFUSAL_MESSAGES ? code : null;\n}\n\nexport function composerSubmissionErrorMessage(error: Error): string {\n if (error instanceof ComposerReconciliationRequiredError) {\n return \"This client cannot safely retry this uncertain request after remount; reconcile the session before sending again.\";\n }\n if (error instanceof ComposerWorkspaceControlUnavailableError) {\n return \"This client cannot resume the workspace. Ask your administrator for a control-capable client.\";\n }\n if (error instanceof ComposerStateError) return error.message;\n if (error instanceof OpenGeniApiError && error.outcomeUnknown) return formatErrorMessage(error);\n if (isModelUnavailableSubmissionError(error)) return COMPOSER_MODEL_UNAVAILABLE_MESSAGE;\n if (isSessionUsageLimitSubmissionError(error)) return COMPOSER_SESSION_USAGE_LIMIT_MESSAGE;\n const siteRefusal = siteRefusalCode(error);\n if (siteRefusal) return COMPOSER_SITE_REFUSAL_MESSAGES[siteRefusal]!;\n if (error instanceof OpenGeniApiError && error.code === \"allowance_exhausted\") {\n // OpenGeniAllowanceExhaustedError carries the scope; read it structurally\n // so this startup-path helper adds no SDK or wording imports.\n const message =\n (error as { scope?: unknown }).scope === \"workspace\"\n ? COMPOSER_WORKSPACE_ALLOWANCE_MESSAGE\n : COMPOSER_MEMBER_ALLOWANCE_MESSAGE;\n return composerErrorReference(error, message);\n }\n return isComposerCreditRefusal(error)\n ? composerErrorReference(error, COMPOSER_PAYMENT_REQUIRED_MESSAGE)\n : formatErrorMessage(error);\n}\n\nfunction composerErrorReference(error: Error, message: string): string {\n return error instanceof OpenGeniApiError && error.correlationId\n ? `${message} Reference: ${error.correlationId}.`\n : message;\n}\n\n/** These definitive refusals need a payment, allowance or model change, not an unchanged retry. */\nexport function composerSubmissionCanRetry(error: Error): boolean {\n return !(\n isComposerCreditRefusal(error) ||\n isModelUnavailableSubmissionError(error) ||\n isSessionUsageLimitSubmissionError(error) ||\n (error instanceof OpenGeniApiError && error.code === \"allowance_exhausted\") ||\n // Only a busy Site assistant is worth an unchanged retry.\n (siteRefusalCode(error) !== null && siteRefusalCode(error) !== \"site_budget_busy\")\n );\n}\n\nfunction isComposerCreditRefusal(error: Error): boolean {\n // A 402 for the task's own usage limit is not a credit or payment problem.\n if (isSessionUsageLimitSubmissionError(error)) return false;\n return (\n (error instanceof OpenGeniApiError &&\n error.status === 402 &&\n (error.code === \"payment_required\" || error.code === \"insufficient_credits\")) ||\n isCreditExhaustion(error.message)\n );\n}\n\n/**\n * Does this failure/completion payload (or raw error string) mean the\n * workspace ran out of Opengeni credits? Matches the engine's\n * \"insufficient Opengeni credits\" text (case-insensitive, substring — it\n * arrives both bare and wrapped in \"Activity task failed: …\") and the\n * budget-exhausted segment limit the engine stamps on a turn it ended early.\n */\nexport function isCreditExhaustion(\n input: { error?: string | null; detail?: string | null; segmentLimit?: string | null } | string,\n): boolean {\n if (typeof input === \"string\") {\n return input.toLowerCase().includes(\"insufficient opengeni credits\");\n }\n if (input.segmentLimit === \"budget_exhausted\") {\n return true;\n }\n for (const text of [input.error, input.detail]) {\n if (typeof text === \"string\" && text.toLowerCase().includes(\"insufficient opengeni credits\")) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Humanize engine/provider failure text before it reaches the timeline or a\n * failure banner. Raw provider errors leak the wrong audience's instructions —\n * \"Incorrect API key … find your API key at platform.openai.com\" tells a\n * managed-deployment USER to fix credentials only an OPERATOR controls (and is\n * flatly wrong for Azure or subscription-backed engines). Auth, quota, and\n * credit-exhaustion failures collapse to one neutral, honest sentence; every\n * other reason passes through untouched. Raw payloads stay available in the\n * debug surfaces.\n */\nexport function humanizeFailureReason(reason: string | null): string | null {\n if (!reason) {\n return reason;\n }\n if (isCreditExhaustion(reason)) {\n return CREDIT_EXHAUSTION_MESSAGE;\n }\n const normalized = reason.toLowerCase();\n const authFailure =\n normalized.includes(\"incorrect api key\") ||\n normalized.includes(\"invalid api key\") ||\n normalized.includes(\"invalid_api_key\") ||\n normalized.includes(\"platform.openai.com/account/api-keys\") ||\n (normalized.includes(\"401\") &&\n (normalized.includes(\"api key\") || normalized.includes(\"unauthorized\")));\n if (authFailure) {\n return \"The model provider rejected this deployment's engine credentials. Sending messages won't help until the deployment's engine configuration is fixed.\";\n }\n const quotaFailure =\n normalized.includes(\"insufficient_quota\") || normalized.includes(\"exceeded your current quota\");\n if (quotaFailure) {\n return \"The model provider refused the request: this deployment's provider quota is exhausted.\";\n }\n return reason;\n}\n\n/** Project failure diagnostics without changing the stored event, including legacy retry wrappers. */\nexport function presentFailure(payload: Record<string, unknown>): {\n reason: string | null;\n safetyRefusal: boolean;\n} {\n const databaseFailure =\n payload.code === \"db_deadlock\" ||\n payload.code === \"db_serialization_failure\" ||\n payload.code === \"db_failure\" ||\n (typeof payload.sqlState === \"string\" &&\n /^[0-9A-Z]{5}$/.test(payload.sqlState) &&\n payload.database !== null &&\n typeof payload.database === \"object\" &&\n !Array.isArray(payload.database));\n if (databaseFailure) {\n return { reason: \"The service encountered a database error.\", safetyRefusal: false };\n }\n const text = (key: string): string | null => {\n const value = payload[key];\n return typeof value === \"string\" && value.trim() ? value : null;\n };\n const message = text(\"error\") ?? text(\"message\");\n const detail = text(\"lastRetryableError\") ?? text(\"detail\");\n const safetyRefusal =\n payload.code === \"provider_safety_refusal\" ||\n [message, detail].some(\n (value) =>\n value !== null && /\\bthis request was blocked by our safety systems\\b/i.test(value),\n );\n if (safetyRefusal) {\n return {\n reason: `The model provider blocked this request.${detail || message ? ` ${detail ?? message}` : \"\"}`,\n safetyRefusal: true,\n };\n }\n // Spent automatic retries: name the model and the remedy instead of the\n // recorded wrapper plus raw provider text (still in the stored event).\n const recovery = parseProviderRecovery(payload);\n if (recovery && payload.recoveryExhausted === true) {\n return { reason: providerRecoveryExhaustedText(recovery), safetyRefusal: false };\n }\n return {\n reason:\n detail && detail !== message\n ? [humanizeFailureReason(message), humanizeFailureReason(detail)].filter(Boolean).join(\" \")\n : humanizeFailureReason(message),\n safetyRefusal: false,\n };\n}\n"],"mappings":"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","names":["text"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|