@jini-ai/chat 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +109 -0
- package/dist/core/agentic/chat-capabilities.d.ts +19 -0
- package/dist/core/agentic/chat-capabilities.d.ts.map +1 -0
- package/dist/core/agentic/chat-capabilities.js +106 -0
- package/dist/core/agentic/chat-capabilities.js.map +1 -0
- package/dist/core/agentic/index.d.ts +22 -0
- package/dist/core/agentic/index.d.ts.map +1 -0
- package/dist/core/agentic/index.js +21 -0
- package/dist/core/agentic/index.js.map +1 -0
- package/dist/core/events.d.ts +84 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +14 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/index.d.ts +40 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +40 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/messages.d.ts +53 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +16 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/partial-json.d.ts +36 -0
- package/dist/core/partial-json.d.ts.map +1 -0
- package/dist/core/partial-json.js +119 -0
- package/dist/core/partial-json.js.map +1 -0
- package/dist/core/persistence/index.d.ts +11 -0
- package/dist/core/persistence/index.d.ts.map +1 -0
- package/dist/core/persistence/index.js +11 -0
- package/dist/core/persistence/index.js.map +1 -0
- package/dist/core/persistence/ports.d.ts +124 -0
- package/dist/core/persistence/ports.d.ts.map +1 -0
- package/dist/core/persistence/ports.js +2 -0
- package/dist/core/persistence/ports.js.map +1 -0
- package/dist/core/persistence/title.d.ts +35 -0
- package/dist/core/persistence/title.d.ts.map +1 -0
- package/dist/core/persistence/title.js +137 -0
- package/dist/core/persistence/title.js.map +1 -0
- package/dist/core/question-form/format.d.ts +27 -0
- package/dist/core/question-form/format.d.ts.map +1 -0
- package/dist/core/question-form/format.js +45 -0
- package/dist/core/question-form/format.js.map +1 -0
- package/dist/core/question-form/normalize.d.ts +30 -0
- package/dist/core/question-form/normalize.d.ts.map +1 -0
- package/dist/core/question-form/normalize.js +192 -0
- package/dist/core/question-form/normalize.js.map +1 -0
- package/dist/core/question-form/scan.d.ts +50 -0
- package/dist/core/question-form/scan.d.ts.map +1 -0
- package/dist/core/question-form/scan.js +404 -0
- package/dist/core/question-form/scan.js.map +1 -0
- package/dist/core/question-form/types.d.ts +83 -0
- package/dist/core/question-form/types.d.ts.map +1 -0
- package/dist/core/question-form/types.js +11 -0
- package/dist/core/question-form/types.js.map +1 -0
- package/dist/core/question-form.d.ts +39 -0
- package/dist/core/question-form.d.ts.map +1 -0
- package/dist/core/question-form.js +4 -0
- package/dist/core/question-form.js.map +1 -0
- package/dist/core/todos.d.ts +70 -0
- package/dist/core/todos.d.ts.map +1 -0
- package/dist/core/todos.js +175 -0
- package/dist/core/todos.js.map +1 -0
- package/dist/core/tool-events.d.ts +18 -0
- package/dist/core/tool-events.d.ts.map +1 -0
- package/dist/core/tool-events.js +36 -0
- package/dist/core/tool-events.js.map +1 -0
- package/dist/core/tools.d.ts +51 -0
- package/dist/core/tools.d.ts.map +1 -0
- package/dist/core/tools.js +41 -0
- package/dist/core/tools.js.map +1 -0
- package/dist/core/transcript.d.ts +81 -0
- package/dist/core/transcript.d.ts.map +1 -0
- package/dist/core/transcript.js +133 -0
- package/dist/core/transcript.js.map +1 -0
- package/dist/core/transport.d.ts +109 -0
- package/dist/core/transport.d.ts.map +1 -0
- package/dist/core/transport.js +2 -0
- package/dist/core/transport.js.map +1 -0
- package/dist/core/util/index.d.ts +16 -0
- package/dist/core/util/index.d.ts.map +1 -0
- package/dist/core/util/index.js +16 -0
- package/dist/core/util/index.js.map +1 -0
- package/dist/core/util/manifest.d.ts +39 -0
- package/dist/core/util/manifest.d.ts.map +1 -0
- package/dist/core/util/manifest.js +173 -0
- package/dist/core/util/manifest.js.map +1 -0
- package/dist/core/util/markdown-context.d.ts +47 -0
- package/dist/core/util/markdown-context.d.ts.map +1 -0
- package/dist/core/util/markdown-context.js +125 -0
- package/dist/core/util/markdown-context.js.map +1 -0
- package/dist/core/util/markup-attributes.d.ts +20 -0
- package/dist/core/util/markup-attributes.d.ts.map +1 -0
- package/dist/core/util/markup-attributes.js +33 -0
- package/dist/core/util/markup-attributes.js.map +1 -0
- package/dist/core/util/parser.d.ts +42 -0
- package/dist/core/util/parser.d.ts.map +1 -0
- package/dist/core/util/parser.js +238 -0
- package/dist/core/util/parser.js.map +1 -0
- package/dist/core/util/pointer.d.ts +28 -0
- package/dist/core/util/pointer.d.ts.map +1 -0
- package/dist/core/util/pointer.js +75 -0
- package/dist/core/util/pointer.js.map +1 -0
- package/dist/core/util/recover.d.ts +40 -0
- package/dist/core/util/recover.d.ts.map +1 -0
- package/dist/core/util/recover.js +117 -0
- package/dist/core/util/recover.js.map +1 -0
- package/dist/core/util/strip.d.ts +112 -0
- package/dist/core/util/strip.d.ts.map +1 -0
- package/dist/core/util/strip.js +333 -0
- package/dist/core/util/strip.js.map +1 -0
- package/dist/core/util/types.d.ts +31 -0
- package/dist/core/util/types.d.ts.map +1 -0
- package/dist/core/util/types.js +2 -0
- package/dist/core/util/types.js.map +1 -0
- package/dist/core/util/validate.d.ts +50 -0
- package/dist/core/util/validate.d.ts.map +1 -0
- package/dist/core/util/validate.js +202 -0
- package/dist/core/util/validate.js.map +1 -0
- package/dist/react/agent-bridge/frontend-session-bridge.d.ts +45 -0
- package/dist/react/agent-bridge/frontend-session-bridge.d.ts.map +1 -0
- package/dist/react/agent-bridge/frontend-session-bridge.js +214 -0
- package/dist/react/agent-bridge/frontend-session-bridge.js.map +1 -0
- package/dist/react/artifact-types.d.ts +61 -0
- package/dist/react/artifact-types.d.ts.map +1 -0
- package/dist/react/artifact-types.js +33 -0
- package/dist/react/artifact-types.js.map +1 -0
- package/dist/react/chat-pane.d.ts +21 -0
- package/dist/react/chat-pane.d.ts.map +1 -0
- package/dist/react/chat-pane.js +20 -0
- package/dist/react/chat-pane.js.map +1 -0
- package/dist/react/components/A2uiSurfaceCard.d.ts +35 -0
- package/dist/react/components/A2uiSurfaceCard.d.ts.map +1 -0
- package/dist/react/components/A2uiSurfaceCard.js +272 -0
- package/dist/react/components/A2uiSurfaceCard.js.map +1 -0
- package/dist/react/components/AttachmentTray.d.ts +6 -0
- package/dist/react/components/AttachmentTray.d.ts.map +1 -0
- package/dist/react/components/AttachmentTray.js +30 -0
- package/dist/react/components/AttachmentTray.js.map +1 -0
- package/dist/react/components/ChatFab.d.ts +8 -0
- package/dist/react/components/ChatFab.d.ts.map +1 -0
- package/dist/react/components/ChatFab.js +24 -0
- package/dist/react/components/ChatFab.js.map +1 -0
- package/dist/react/components/Composer.d.ts +34 -0
- package/dist/react/components/Composer.d.ts.map +1 -0
- package/dist/react/components/Composer.js +300 -0
- package/dist/react/components/Composer.js.map +1 -0
- package/dist/react/components/ComposerDiscovery.d.ts +46 -0
- package/dist/react/components/ComposerDiscovery.d.ts.map +1 -0
- package/dist/react/components/ComposerDiscovery.js +38 -0
- package/dist/react/components/ComposerDiscovery.js.map +1 -0
- package/dist/react/components/ConversationList.d.ts +31 -0
- package/dist/react/components/ConversationList.d.ts.map +1 -0
- package/dist/react/components/ConversationList.js +221 -0
- package/dist/react/components/ConversationList.js.map +1 -0
- package/dist/react/components/ExtEventErrorBoundary.d.ts +35 -0
- package/dist/react/components/ExtEventErrorBoundary.d.ts.map +1 -0
- package/dist/react/components/ExtEventErrorBoundary.js +38 -0
- package/dist/react/components/ExtEventErrorBoundary.js.map +1 -0
- package/dist/react/components/Icon.d.ts +17 -0
- package/dist/react/components/Icon.d.ts.map +1 -0
- package/dist/react/components/Icon.js +46 -0
- package/dist/react/components/Icon.js.map +1 -0
- package/dist/react/components/JiniChatProvider.d.ts +45 -0
- package/dist/react/components/JiniChatProvider.d.ts.map +1 -0
- package/dist/react/components/JiniChatProvider.js +44 -0
- package/dist/react/components/JiniChatProvider.js.map +1 -0
- package/dist/react/components/Markdown.d.ts +5 -0
- package/dist/react/components/Markdown.d.ts.map +1 -0
- package/dist/react/components/Markdown.js +390 -0
- package/dist/react/components/Markdown.js.map +1 -0
- package/dist/react/components/McpUiSurfaceCard.d.ts +51 -0
- package/dist/react/components/McpUiSurfaceCard.d.ts.map +1 -0
- package/dist/react/components/McpUiSurfaceCard.js +159 -0
- package/dist/react/components/McpUiSurfaceCard.js.map +1 -0
- package/dist/react/components/MessageList.d.ts +15 -0
- package/dist/react/components/MessageList.d.ts.map +1 -0
- package/dist/react/components/MessageList.js +81 -0
- package/dist/react/components/MessageList.js.map +1 -0
- package/dist/react/components/MessageRow.d.ts +60 -0
- package/dist/react/components/MessageRow.d.ts.map +1 -0
- package/dist/react/components/MessageRow.js +156 -0
- package/dist/react/components/MessageRow.js.map +1 -0
- package/dist/react/components/NextStepActions.d.ts +34 -0
- package/dist/react/components/NextStepActions.d.ts.map +1 -0
- package/dist/react/components/NextStepActions.js +9 -0
- package/dist/react/components/NextStepActions.js.map +1 -0
- package/dist/react/components/QuestionForm.d.ts +26 -0
- package/dist/react/components/QuestionForm.d.ts.map +1 -0
- package/dist/react/components/QuestionForm.js +238 -0
- package/dist/react/components/QuestionForm.js.map +1 -0
- package/dist/react/components/QuestionsPanel.d.ts +13 -0
- package/dist/react/components/QuestionsPanel.d.ts.map +1 -0
- package/dist/react/components/QuestionsPanel.js +33 -0
- package/dist/react/components/QuestionsPanel.js.map +1 -0
- package/dist/react/components/TodoCard.d.ts +8 -0
- package/dist/react/components/TodoCard.d.ts.map +1 -0
- package/dist/react/components/TodoCard.js +29 -0
- package/dist/react/components/TodoCard.js.map +1 -0
- package/dist/react/components/ToolCard.d.ts +22 -0
- package/dist/react/components/ToolCard.d.ts.map +1 -0
- package/dist/react/components/ToolCard.js +298 -0
- package/dist/react/components/ToolCard.js.map +1 -0
- package/dist/react/components/composer-discovery.d.ts +107 -0
- package/dist/react/components/composer-discovery.d.ts.map +1 -0
- package/dist/react/components/composer-discovery.js +176 -0
- package/dist/react/components/composer-discovery.js.map +1 -0
- package/dist/react/ext-event-renderer-registry.d.ts +51 -0
- package/dist/react/ext-event-renderer-registry.d.ts.map +1 -0
- package/dist/react/ext-event-renderer-registry.js +20 -0
- package/dist/react/ext-event-renderer-registry.js.map +1 -0
- package/dist/react/features/chat-pane/agent-tools.d.ts +14 -0
- package/dist/react/features/chat-pane/agent-tools.d.ts.map +1 -0
- package/dist/react/features/chat-pane/agent-tools.js +22 -0
- package/dist/react/features/chat-pane/agent-tools.js.map +1 -0
- package/dist/react/features/chat-pane/components/AgentRuntimePicker.d.ts +12 -0
- package/dist/react/features/chat-pane/components/AgentRuntimePicker.d.ts.map +1 -0
- package/dist/react/features/chat-pane/components/AgentRuntimePicker.js +106 -0
- package/dist/react/features/chat-pane/components/AgentRuntimePicker.js.map +1 -0
- package/dist/react/features/chat-pane/components/ChatPane.d.ts +10 -0
- package/dist/react/features/chat-pane/components/ChatPane.d.ts.map +1 -0
- package/dist/react/features/chat-pane/components/ChatPane.js +169 -0
- package/dist/react/features/chat-pane/components/ChatPane.js.map +1 -0
- package/dist/react/features/chat-pane/create-daemon-attachment-uploader.d.ts +21 -0
- package/dist/react/features/chat-pane/create-daemon-attachment-uploader.d.ts.map +1 -0
- package/dist/react/features/chat-pane/create-daemon-attachment-uploader.js +213 -0
- package/dist/react/features/chat-pane/create-daemon-attachment-uploader.js.map +1 -0
- package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.d.ts +70 -0
- package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.d.ts.map +1 -0
- package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.js +76 -0
- package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.d.ts +133 -0
- package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.js +258 -0
- package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPane.hooks.d.ts +66 -0
- package/dist/react/features/chat-pane/hooks/useChatPane.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPane.hooks.js +224 -0
- package/dist/react/features/chat-pane/hooks/useChatPane.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.d.ts +38 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.js +252 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.d.ts +16 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.js +59 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.d.ts +26 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.js +74 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.d.ts +25 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.js +88 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.d.ts +38 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.js +184 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/index.d.ts +12 -0
- package/dist/react/features/chat-pane/index.d.ts.map +1 -0
- package/dist/react/features/chat-pane/index.js +11 -0
- package/dist/react/features/chat-pane/index.js.map +1 -0
- package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.d.ts +12 -0
- package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.js +102 -0
- package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.js.map +1 -0
- package/dist/react/features/chat-pane/react/components/ChatPane.d.ts +10 -0
- package/dist/react/features/chat-pane/react/components/ChatPane.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/components/ChatPane.js +137 -0
- package/dist/react/features/chat-pane/react/components/ChatPane.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.d.ts +133 -0
- package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.js +258 -0
- package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.d.ts +66 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.js +223 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.d.ts +38 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.js +252 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.d.ts +26 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.js +60 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.d.ts +25 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.js +83 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.d.ts +38 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.js +184 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/styles.d.ts +2 -0
- package/dist/react/features/chat-pane/react/styles.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/styles.js +863 -0
- package/dist/react/features/chat-pane/react/styles.js.map +1 -0
- package/dist/react/features/chat-pane/rules.d.ts +31 -0
- package/dist/react/features/chat-pane/rules.d.ts.map +1 -0
- package/dist/react/features/chat-pane/rules.js +81 -0
- package/dist/react/features/chat-pane/rules.js.map +1 -0
- package/dist/react/features/chat-pane/styles.d.ts +2 -0
- package/dist/react/features/chat-pane/styles.d.ts.map +1 -0
- package/dist/react/features/chat-pane/styles.js +1327 -0
- package/dist/react/features/chat-pane/styles.js.map +1 -0
- package/dist/react/features/chat-pane/types.d.ts +248 -0
- package/dist/react/features/chat-pane/types.d.ts.map +1 -0
- package/dist/react/features/chat-pane/types.js +2 -0
- package/dist/react/features/chat-pane/types.js.map +1 -0
- package/dist/react/features/model-picker/components/CredentialStatusBadge.d.ts +7 -0
- package/dist/react/features/model-picker/components/CredentialStatusBadge.d.ts.map +1 -0
- package/dist/react/features/model-picker/components/CredentialStatusBadge.js +20 -0
- package/dist/react/features/model-picker/components/CredentialStatusBadge.js.map +1 -0
- package/dist/react/features/model-picker/components/ModelPicker.d.ts +9 -0
- package/dist/react/features/model-picker/components/ModelPicker.d.ts.map +1 -0
- package/dist/react/features/model-picker/components/ModelPicker.js +34 -0
- package/dist/react/features/model-picker/components/ModelPicker.js.map +1 -0
- package/dist/react/features/model-picker/constants.d.ts +6 -0
- package/dist/react/features/model-picker/constants.d.ts.map +1 -0
- package/dist/react/features/model-picker/constants.js +9 -0
- package/dist/react/features/model-picker/constants.js.map +1 -0
- package/dist/react/features/model-picker/dependencies.d.ts +11 -0
- package/dist/react/features/model-picker/dependencies.d.ts.map +1 -0
- package/dist/react/features/model-picker/dependencies.js +10 -0
- package/dist/react/features/model-picker/dependencies.js.map +1 -0
- package/dist/react/features/model-picker/hooks/useModelPicker.hooks.d.ts +27 -0
- package/dist/react/features/model-picker/hooks/useModelPicker.hooks.d.ts.map +1 -0
- package/dist/react/features/model-picker/hooks/useModelPicker.hooks.js +62 -0
- package/dist/react/features/model-picker/hooks/useModelPicker.hooks.js.map +1 -0
- package/dist/react/features/model-picker/index.d.ts +32 -0
- package/dist/react/features/model-picker/index.d.ts.map +1 -0
- package/dist/react/features/model-picker/index.js +29 -0
- package/dist/react/features/model-picker/index.js.map +1 -0
- package/dist/react/features/model-picker/ports.d.ts +11 -0
- package/dist/react/features/model-picker/ports.d.ts.map +1 -0
- package/dist/react/features/model-picker/ports.js +2 -0
- package/dist/react/features/model-picker/ports.js.map +1 -0
- package/dist/react/features/model-picker/react/components/CredentialStatusBadge.d.ts +7 -0
- package/dist/react/features/model-picker/react/components/CredentialStatusBadge.d.ts.map +1 -0
- package/dist/react/features/model-picker/react/components/CredentialStatusBadge.js +20 -0
- package/dist/react/features/model-picker/react/components/CredentialStatusBadge.js.map +1 -0
- package/dist/react/features/model-picker/react/components/ModelPicker.d.ts +9 -0
- package/dist/react/features/model-picker/react/components/ModelPicker.d.ts.map +1 -0
- package/dist/react/features/model-picker/react/components/ModelPicker.js +34 -0
- package/dist/react/features/model-picker/react/components/ModelPicker.js.map +1 -0
- package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.d.ts +27 -0
- package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.d.ts.map +1 -0
- package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.js +62 -0
- package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.js.map +1 -0
- package/dist/react/features/model-picker/rules.d.ts +26 -0
- package/dist/react/features/model-picker/rules.d.ts.map +1 -0
- package/dist/react/features/model-picker/rules.js +84 -0
- package/dist/react/features/model-picker/rules.js.map +1 -0
- package/dist/react/features/model-picker/types.d.ts +38 -0
- package/dist/react/features/model-picker/types.d.ts.map +1 -0
- package/dist/react/features/model-picker/types.js +2 -0
- package/dist/react/features/model-picker/types.js.map +1 -0
- package/dist/react/hooks/composer-draft-cache.d.ts +65 -0
- package/dist/react/hooks/composer-draft-cache.d.ts.map +1 -0
- package/dist/react/hooks/composer-draft-cache.js +89 -0
- package/dist/react/hooks/composer-draft-cache.js.map +1 -0
- package/dist/react/hooks/context.d.ts +18 -0
- package/dist/react/hooks/context.d.ts.map +1 -0
- package/dist/react/hooks/context.js +60 -0
- package/dist/react/hooks/context.js.map +1 -0
- package/dist/react/hooks/testing/fake-transport.d.ts +34 -0
- package/dist/react/hooks/testing/fake-transport.d.ts.map +1 -0
- package/dist/react/hooks/testing/fake-transport.js +46 -0
- package/dist/react/hooks/testing/fake-transport.js.map +1 -0
- package/dist/react/hooks/useArtifactStream.d.ts +18 -0
- package/dist/react/hooks/useArtifactStream.d.ts.map +1 -0
- package/dist/react/hooks/useArtifactStream.js +55 -0
- package/dist/react/hooks/useArtifactStream.js.map +1 -0
- package/dist/react/hooks/useChatFabDrag.d.ts +25 -0
- package/dist/react/hooks/useChatFabDrag.d.ts.map +1 -0
- package/dist/react/hooks/useChatFabDrag.js +88 -0
- package/dist/react/hooks/useChatFabDrag.js.map +1 -0
- package/dist/react/hooks/useComposer.d.ts +48 -0
- package/dist/react/hooks/useComposer.d.ts.map +1 -0
- package/dist/react/hooks/useComposer.js +121 -0
- package/dist/react/hooks/useComposer.js.map +1 -0
- package/dist/react/hooks/useConversation.d.ts +34 -0
- package/dist/react/hooks/useConversation.d.ts.map +1 -0
- package/dist/react/hooks/useConversation.js +163 -0
- package/dist/react/hooks/useConversation.js.map +1 -0
- package/dist/react/hooks/useCopyToClipboard.d.ts +14 -0
- package/dist/react/hooks/useCopyToClipboard.d.ts.map +1 -0
- package/dist/react/hooks/useCopyToClipboard.js +98 -0
- package/dist/react/hooks/useCopyToClipboard.js.map +1 -0
- package/dist/react/hooks/useExtEventGroups.d.ts +7 -0
- package/dist/react/hooks/useExtEventGroups.d.ts.map +1 -0
- package/dist/react/hooks/useExtEventGroups.js +32 -0
- package/dist/react/hooks/useExtEventGroups.js.map +1 -0
- package/dist/react/hooks/useLatestOperation.d.ts +31 -0
- package/dist/react/hooks/useLatestOperation.d.ts.map +1 -0
- package/dist/react/hooks/useLatestOperation.js +74 -0
- package/dist/react/hooks/useLatestOperation.js.map +1 -0
- package/dist/react/hooks/usePinnedTodos.d.ts +15 -0
- package/dist/react/hooks/usePinnedTodos.d.ts.map +1 -0
- package/dist/react/hooks/usePinnedTodos.js +43 -0
- package/dist/react/hooks/usePinnedTodos.js.map +1 -0
- package/dist/react/hooks/useQuestionForms.d.ts +28 -0
- package/dist/react/hooks/useQuestionForms.d.ts.map +1 -0
- package/dist/react/hooks/useQuestionForms.js +113 -0
- package/dist/react/hooks/useQuestionForms.js.map +1 -0
- package/dist/react/hooks/useRunStream.d.ts +27 -0
- package/dist/react/hooks/useRunStream.d.ts.map +1 -0
- package/dist/react/hooks/useRunStream.js +180 -0
- package/dist/react/hooks/useRunStream.js.map +1 -0
- package/dist/react/hooks/useToolTimeline.d.ts +33 -0
- package/dist/react/hooks/useToolTimeline.d.ts.map +1 -0
- package/dist/react/hooks/useToolTimeline.js +47 -0
- package/dist/react/hooks/useToolTimeline.js.map +1 -0
- package/dist/react/index.d.ts +158 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +118 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/message-blocks.d.ts +86 -0
- package/dist/react/message-blocks.d.ts.map +1 -0
- package/dist/react/message-blocks.js +78 -0
- package/dist/react/message-blocks.js.map +1 -0
- package/dist/react/poc-mcp-ui-official/PocMcpUiCard.d.ts +9 -0
- package/dist/react/poc-mcp-ui-official/PocMcpUiCard.d.ts.map +1 -0
- package/dist/react/poc-mcp-ui-official/PocMcpUiCard.js +29 -0
- package/dist/react/poc-mcp-ui-official/PocMcpUiCard.js.map +1 -0
- package/dist/react/poc-mcp-ui-official/create-poc-resource.d.ts +30 -0
- package/dist/react/poc-mcp-ui-official/create-poc-resource.d.ts.map +1 -0
- package/dist/react/poc-mcp-ui-official/create-poc-resource.js +44 -0
- package/dist/react/poc-mcp-ui-official/create-poc-resource.js.map +1 -0
- package/dist/react/slots.d.ts +215 -0
- package/dist/react/slots.d.ts.map +1 -0
- package/dist/react/slots.js +2 -0
- package/dist/react/slots.js.map +1 -0
- package/dist/react/styles/reference.css +298 -0
- package/dist/react/tool-renderer-registry.d.ts +41 -0
- package/dist/react/tool-renderer-registry.d.ts.map +1 -0
- package/dist/react/tool-renderer-registry.js +22 -0
- package/dist/react/tool-renderer-registry.js.map +1 -0
- package/dist/react/util/defined-props.d.ts +31 -0
- package/dist/react/util/defined-props.d.ts.map +1 -0
- package/dist/react/util/defined-props.js +28 -0
- package/dist/react/util/defined-props.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../../src/react/features/model-picker/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEtF;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,mBAAmB,CAAC,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAC3F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../../src/react/features/model-picker/ports.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CredentialStatus } from '../../types.js';
|
|
2
|
+
export interface CredentialStatusBadgeProps {
|
|
3
|
+
status: CredentialStatus;
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function CredentialStatusBadge({ status, className }: CredentialStatusBadgeProps): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=CredentialStatusBadge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CredentialStatusBadge.d.ts","sourceRoot":"","sources":["../../../../../../src/react/features/model-picker/react/components/CredentialStatusBadge.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,qBAAqB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,0BAA0B,+BAUtF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @module CredentialStatusBadge
|
|
4
|
+
*
|
|
5
|
+
* A provider's credential status as a small pill — ported from
|
|
6
|
+
* `NewProjectPanel.tsx`'s inline `newproj-provider-badge` span
|
|
7
|
+
* ("Configured"/"Integrated"/"Unsupported"), de-branded and relabeled to
|
|
8
|
+
* this feature's generic `CredentialStatus` union.
|
|
9
|
+
*/
|
|
10
|
+
import { useT } from '../../../../hooks/context.js';
|
|
11
|
+
const STATUS_LABEL = {
|
|
12
|
+
configured: 'Configured',
|
|
13
|
+
available: 'Available',
|
|
14
|
+
unconfigured: 'Not configured',
|
|
15
|
+
};
|
|
16
|
+
export function CredentialStatusBadge({ status, className }) {
|
|
17
|
+
const t = useT();
|
|
18
|
+
return (_jsx("span", { className: `model-picker-status-badge model-picker-status-badge--${status}${className ? ` ${className}` : ''}`, "data-status": status, children: t(STATUS_LABEL[status]) }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=CredentialStatusBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CredentialStatusBadge.js","sourceRoot":"","sources":["../../../../../../src/react/features/model-picker/react/components/CredentialStatusBadge.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAQpD,MAAM,YAAY,GAAqC;IACrD,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,gBAAgB;CAC/B,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,EAAE,MAAM,EAAE,SAAS,EAA8B;IACrF,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,OAAO,CACL,eACE,SAAS,EAAE,wDAAwD,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,iBACjG,MAAM,YAElB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GACnB,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { UseModelPickerOptions } from '../hooks/useModelPicker.hooks.js';
|
|
2
|
+
export interface ModelPickerProps extends UseModelPickerOptions {
|
|
3
|
+
label: string;
|
|
4
|
+
searchPlaceholder?: string;
|
|
5
|
+
className?: string;
|
|
6
|
+
'data-testid'?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function ModelPicker({ label, searchPlaceholder, className, 'data-testid': testId, ...pickerOptions }: ModelPickerProps): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=ModelPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelPicker.d.ts","sourceRoot":"","sources":["../../../../../../src/react/features/model-picker/react/components/ModelPicker.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAG9E,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,iBAAiB,EACjB,SAAS,EACT,aAAa,EAAE,MAAM,EACrB,GAAG,aAAa,EACjB,EAAE,gBAAgB,+BAgFlB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @module ModelPicker
|
|
4
|
+
*
|
|
5
|
+
* A generic, provider-grouped, credential-status-badged, searchable model
|
|
6
|
+
* picker: trigger button + inline popover. Consolidates two independently
|
|
7
|
+
* re-implemented OD shapes that R6 confirmed share this exact pattern —
|
|
8
|
+
* `NewProjectPanel.tsx`'s `MediaModelCards` (provider grouping + status
|
|
9
|
+
* badges + search) and `modelOptions.tsx`'s `SearchableModelSelect`
|
|
10
|
+
* (searchable trigger/popover with outside-click/Escape dismissal, folded
|
|
11
|
+
* into `useModelPicker`). Unlike `SearchableModelSelect`, the popover
|
|
12
|
+
* renders inline rather than via a `document.body` portal — this package
|
|
13
|
+
* has no fixed-positioning collision-avoidance primitive of its own, and an
|
|
14
|
+
* inline popover keeps the component trivially testable; a host embedding
|
|
15
|
+
* this inside a clipping/overflow container can override positioning with
|
|
16
|
+
* its own CSS. See `source-map.md`.
|
|
17
|
+
*/
|
|
18
|
+
import { useT } from '../../../../hooks/context.js';
|
|
19
|
+
import { Icon } from '../../../../components/Icon.js';
|
|
20
|
+
import { modelSubtitle } from '../../rules.js';
|
|
21
|
+
import { useModelPicker } from '../hooks/useModelPicker.hooks.js';
|
|
22
|
+
import { CredentialStatusBadge } from './CredentialStatusBadge.js';
|
|
23
|
+
export function ModelPicker({ label, searchPlaceholder, className, 'data-testid': testId, ...pickerOptions }) {
|
|
24
|
+
const t = useT();
|
|
25
|
+
const { open, query, filteredGroups, selection, shouldShowSearch, containerRef, setQuery, toggle, select } = useModelPicker(pickerOptions);
|
|
26
|
+
const triggerTitle = selection?.model.label ?? t('No model selected');
|
|
27
|
+
const triggerSubtitle = selection ? modelSubtitle(selection) : t('Choose a model');
|
|
28
|
+
const totalMatches = filteredGroups.reduce((count, group) => count + group.models.length, 0);
|
|
29
|
+
return (_jsxs("div", { className: `model-picker${className ? ` ${className}` : ''}`, ref: containerRef, "data-testid": testId, children: [_jsx("span", { className: "model-picker-label", children: t(label) }), _jsxs("button", { type: "button", className: `model-picker-trigger${open ? ' is-open' : ''}${selection ? '' : ' is-empty'}`, onClick: toggle, "aria-haspopup": "listbox", "aria-expanded": open, "data-testid": testId ? `${testId}-trigger` : undefined, children: [_jsxs("span", { className: "model-picker-trigger-meta", children: [_jsx("span", { className: "model-picker-trigger-title", children: triggerTitle }), _jsx("span", { className: "model-picker-trigger-subtitle", children: triggerSubtitle })] }), _jsx(Icon, { name: "chevron-down", size: 14, className: "model-picker-trigger-chevron" })] }), open ? (_jsxs("div", { className: "model-picker-popover", role: "listbox", "data-testid": testId ? `${testId}-popover` : undefined, children: [shouldShowSearch ? (_jsx("div", { className: "model-picker-search-row", children: _jsx("input", { type: "search", className: "model-picker-search", value: query, placeholder: t(searchPlaceholder ?? 'Search models'), "aria-label": t(searchPlaceholder ?? 'Search models'), "data-testid": testId ? `${testId}-search` : undefined, onChange: (event) => setQuery(event.target.value) }) })) : null, _jsx("div", { className: "model-picker-list", children: totalMatches === 0 ? (_jsx("div", { className: "model-picker-empty", children: t('No matching models') })) : (filteredGroups.map((group) => (_jsxs("div", { className: "model-picker-group", children: [_jsxs("div", { className: "model-picker-group-head", children: [_jsx("span", { children: t(group.provider.label) }), _jsx(CredentialStatusBadge, { status: group.status })] }), group.models.map((model) => {
|
|
30
|
+
const active = selection?.model.id === model.id;
|
|
31
|
+
return (_jsxs("button", { type: "button", role: "option", "aria-selected": active, className: `model-picker-option${active ? ' is-active' : ''}`, "data-testid": testId ? `${testId}-option-${model.id}` : undefined, onClick: () => select(model.id), children: [_jsxs("span", { className: "model-picker-option-title", children: [model.label, model.default ? _jsx("span", { className: "model-picker-option-badge", children: t('Recommended') }) : null] }), model.hint ? _jsx("span", { className: "model-picker-option-hint", children: model.hint }) : null] }, model.id));
|
|
32
|
+
})] }, group.provider.id)))) })] })) : null] }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=ModelPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelPicker.js","sourceRoot":"","sources":["../../../../../../src/react/features/model-picker/react/components/ModelPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { RefObject } from 'react';
|
|
2
|
+
import type { CredentialStatus, ModelOption, ModelPickerGroup, ModelPickerSelection, ModelProvider } from '../../types.js';
|
|
3
|
+
export interface UseModelPickerOptions {
|
|
4
|
+
models: readonly ModelOption[];
|
|
5
|
+
providers: readonly ModelProvider[];
|
|
6
|
+
statusByProviderId: Readonly<Record<string, CredentialStatus>>;
|
|
7
|
+
value: string;
|
|
8
|
+
onChange: (modelId: string) => void;
|
|
9
|
+
/** When true, auto-selects the first available model whenever `value` doesn't match any model. Defaults to false. */
|
|
10
|
+
autoSelectFirst?: boolean;
|
|
11
|
+
minSearchableOptions?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ModelPickerController {
|
|
14
|
+
open: boolean;
|
|
15
|
+
query: string;
|
|
16
|
+
groups: ModelPickerGroup[];
|
|
17
|
+
filteredGroups: ModelPickerGroup[];
|
|
18
|
+
selection: ModelPickerSelection | null;
|
|
19
|
+
shouldShowSearch: boolean;
|
|
20
|
+
containerRef: RefObject<HTMLDivElement | null>;
|
|
21
|
+
setQuery: (query: string) => void;
|
|
22
|
+
toggle: () => void;
|
|
23
|
+
close: () => void;
|
|
24
|
+
select: (modelId: string) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare function useModelPicker({ models, providers, statusByProviderId, value, onChange, autoSelectFirst, minSearchableOptions, }: UseModelPickerOptions): ModelPickerController;
|
|
27
|
+
//# sourceMappingURL=useModelPicker.hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useModelPicker.hooks.d.ts","sourceRoot":"","sources":["../../../../../../src/react/features/model-picker/react/hooks/useModelPicker.hooks.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE3H,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;IACpC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,qHAAqH;IACrH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACvC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,kBAAkB,EAClB,KAAK,EACL,QAAQ,EACR,eAAuB,EACvB,oBAAqD,GACtD,EAAE,qBAAqB,GAAG,qBAAqB,CAuD/C"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module useModelPicker
|
|
3
|
+
*
|
|
4
|
+
* Headless controller for the model-picker feature: open/query state,
|
|
5
|
+
* derived provider groups + current selection, and the outside-click/
|
|
6
|
+
* Escape dismissal that `InlineModelSwitcher.tsx`'s popover and
|
|
7
|
+
* `modelOptions.tsx`'s `SearchableModelSelect` both hand-roll. All grouping/
|
|
8
|
+
* filtering/selection logic is delegated to the pure `rules.ts` — this hook
|
|
9
|
+
* only owns React state and the DOM-subscription effect.
|
|
10
|
+
*/
|
|
11
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
12
|
+
import { DEFAULT_MIN_SEARCHABLE_OPTIONS } from '../../constants.js';
|
|
13
|
+
import { filterModelGroups, findSelectedModel, firstAvailableModelId, groupModelsByProvider } from '../../rules.js';
|
|
14
|
+
export function useModelPicker({ models, providers, statusByProviderId, value, onChange, autoSelectFirst = false, minSearchableOptions = DEFAULT_MIN_SEARCHABLE_OPTIONS, }) {
|
|
15
|
+
const [open, setOpen] = useState(false);
|
|
16
|
+
const [query, setQuery] = useState('');
|
|
17
|
+
const containerRef = useRef(null);
|
|
18
|
+
const groups = useMemo(() => groupModelsByProvider(models, providers, statusByProviderId), [models, providers, statusByProviderId]);
|
|
19
|
+
const filteredGroups = useMemo(() => filterModelGroups(groups, query), [groups, query]);
|
|
20
|
+
const selection = useMemo(() => findSelectedModel(groups, value), [groups, value]);
|
|
21
|
+
const totalOptionCount = useMemo(() => groups.reduce((count, group) => count + group.models.length, 0), [groups]);
|
|
22
|
+
const shouldShowSearch = totalOptionCount >= minSearchableOptions;
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!autoSelectFirst || selection)
|
|
25
|
+
return;
|
|
26
|
+
const fallbackId = firstAvailableModelId(groups);
|
|
27
|
+
if (fallbackId)
|
|
28
|
+
onChange(fallbackId);
|
|
29
|
+
}, [autoSelectFirst, groups, onChange, selection]);
|
|
30
|
+
const close = useCallback(() => {
|
|
31
|
+
setOpen(false);
|
|
32
|
+
setQuery('');
|
|
33
|
+
}, []);
|
|
34
|
+
const toggle = useCallback(() => {
|
|
35
|
+
setOpen((prev) => !prev);
|
|
36
|
+
}, []);
|
|
37
|
+
const select = useCallback((modelId) => {
|
|
38
|
+
onChange(modelId);
|
|
39
|
+
close();
|
|
40
|
+
}, [close, onChange]);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!open)
|
|
43
|
+
return;
|
|
44
|
+
const onPointerDown = (event) => {
|
|
45
|
+
if (containerRef.current?.contains(event.target))
|
|
46
|
+
return;
|
|
47
|
+
close();
|
|
48
|
+
};
|
|
49
|
+
const onKeyDown = (event) => {
|
|
50
|
+
if (event.key === 'Escape')
|
|
51
|
+
close();
|
|
52
|
+
};
|
|
53
|
+
document.addEventListener('mousedown', onPointerDown);
|
|
54
|
+
document.addEventListener('keydown', onKeyDown);
|
|
55
|
+
return () => {
|
|
56
|
+
document.removeEventListener('mousedown', onPointerDown);
|
|
57
|
+
document.removeEventListener('keydown', onKeyDown);
|
|
58
|
+
};
|
|
59
|
+
}, [open, close]);
|
|
60
|
+
return { open, query, groups, filteredGroups, selection, shouldShowSearch, containerRef, setQuery, toggle, close, select };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=useModelPicker.hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useModelPicker.hooks.js","sourceRoot":"","sources":["../../../../../../src/react/features/model-picker/react/hooks/useModelPicker.hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CredentialStatus, ModelOption, ModelPickerGroup, ModelPickerSelection, ModelProvider } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Groups models by `providerId`, attaching each group's resolved credential
|
|
4
|
+
* status and sorting configured providers first (stable — ties keep model
|
|
5
|
+
* order). A model whose `providerId` has no matching entry in `providers`
|
|
6
|
+
* gets a synthesized provider (`{ id, label: id }`) rather than being
|
|
7
|
+
* dropped, so an unrecognized provider id still renders instead of silently
|
|
8
|
+
* disappearing.
|
|
9
|
+
*/
|
|
10
|
+
export declare function groupModelsByProvider(models: readonly ModelOption[], providers: readonly ModelProvider[], statusByProviderId: Readonly<Record<string, CredentialStatus>>): ModelPickerGroup[];
|
|
11
|
+
export declare function matchesModelQuery(model: ModelOption, provider: ModelProvider, normalizedQuery: string): boolean;
|
|
12
|
+
/** Filters each group's models by `query`; drops groups left with zero matches. Returns a shallow copy of every group when `query` is blank. */
|
|
13
|
+
export declare function filterModelGroups(groups: readonly ModelPickerGroup[], query: string): ModelPickerGroup[];
|
|
14
|
+
/** Finds which group (and therefore provider) `modelId` belongs to, or `null` if it isn't in any group. */
|
|
15
|
+
export declare function findSelectedModel(groups: readonly ModelPickerGroup[], modelId: string | null | undefined): ModelPickerSelection | null;
|
|
16
|
+
/** True when `modelId` is set but not present in any group — a free-text/custom value. */
|
|
17
|
+
export declare function isCustomModelId(modelId: string | null | undefined, groups: readonly ModelPickerGroup[]): boolean;
|
|
18
|
+
/** The first model in the first (highest-priority) group, or `null` if every group is empty. */
|
|
19
|
+
export declare function firstAvailableModelId(groups: readonly ModelPickerGroup[]): string | null;
|
|
20
|
+
/**
|
|
21
|
+
* A one-line subtitle for the selected model: its hint, prefixed with the
|
|
22
|
+
* provider label unless the hint already opens with it (avoids
|
|
23
|
+
* "OpenAI · OpenAI · 4K, native multimodal"-style duplication).
|
|
24
|
+
*/
|
|
25
|
+
export declare function modelSubtitle(selection: ModelPickerSelection): string;
|
|
26
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../../src/react/features/model-picker/rules.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEvH;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,SAAS,EAAE,SAAS,aAAa,EAAE,EACnC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,GAC7D,gBAAgB,EAAE,CAkBpB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAG/G;AAED,gJAAgJ;AAChJ,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CASxG;AAED,2GAA2G;AAC3G,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,gBAAgB,EAAE,EACnC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,oBAAoB,GAAG,IAAI,CAO7B;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAGhH;AAED,gGAAgG;AAChG,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,GAAG,IAAI,CAExF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,oBAAoB,GAAG,MAAM,CAKrE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module rules
|
|
3
|
+
*
|
|
4
|
+
* Pure logic for the model-picker feature: grouping models by provider,
|
|
5
|
+
* searching/filtering, and resolving the current selection. No React, no
|
|
6
|
+
* transport, no DOM — ported and generified from OD's
|
|
7
|
+
* `NewProjectPanel.tsx`'s `MediaModelCards` (provider grouping + search) and
|
|
8
|
+
* `modelOptions.tsx`'s `matchesModelSearch`/`isCustomModel` (search matching
|
|
9
|
+
* + custom-value detection). See `source-map.md`.
|
|
10
|
+
*/
|
|
11
|
+
import { CREDENTIAL_STATUS_SORT_PRIORITY } from './constants.js';
|
|
12
|
+
/**
|
|
13
|
+
* Groups models by `providerId`, attaching each group's resolved credential
|
|
14
|
+
* status and sorting configured providers first (stable — ties keep model
|
|
15
|
+
* order). A model whose `providerId` has no matching entry in `providers`
|
|
16
|
+
* gets a synthesized provider (`{ id, label: id }`) rather than being
|
|
17
|
+
* dropped, so an unrecognized provider id still renders instead of silently
|
|
18
|
+
* disappearing.
|
|
19
|
+
*/
|
|
20
|
+
export function groupModelsByProvider(models, providers, statusByProviderId) {
|
|
21
|
+
const providerById = new Map(providers.map((provider) => [provider.id, provider]));
|
|
22
|
+
const groupsByProviderId = new Map();
|
|
23
|
+
for (const model of models) {
|
|
24
|
+
let group = groupsByProviderId.get(model.providerId);
|
|
25
|
+
if (!group) {
|
|
26
|
+
const provider = providerById.get(model.providerId) ?? { id: model.providerId, label: model.providerId };
|
|
27
|
+
const status = statusByProviderId[model.providerId] ?? 'unconfigured';
|
|
28
|
+
group = { provider, status, models: [] };
|
|
29
|
+
groupsByProviderId.set(model.providerId, group);
|
|
30
|
+
}
|
|
31
|
+
group.models.push(model);
|
|
32
|
+
}
|
|
33
|
+
return Array.from(groupsByProviderId.values()).sort((a, b) => CREDENTIAL_STATUS_SORT_PRIORITY[a.status] - CREDENTIAL_STATUS_SORT_PRIORITY[b.status]);
|
|
34
|
+
}
|
|
35
|
+
export function matchesModelQuery(model, provider, normalizedQuery) {
|
|
36
|
+
const haystack = `${model.id}\n${model.label}\n${model.hint ?? ''}\n${provider.label}`.toLowerCase();
|
|
37
|
+
return haystack.includes(normalizedQuery);
|
|
38
|
+
}
|
|
39
|
+
/** Filters each group's models by `query`; drops groups left with zero matches. Returns a shallow copy of every group when `query` is blank. */
|
|
40
|
+
export function filterModelGroups(groups, query) {
|
|
41
|
+
const normalized = query.trim().toLowerCase();
|
|
42
|
+
if (!normalized)
|
|
43
|
+
return groups.map((group) => ({ ...group, models: group.models.slice() }));
|
|
44
|
+
return groups
|
|
45
|
+
.map((group) => ({
|
|
46
|
+
...group,
|
|
47
|
+
models: group.models.filter((model) => matchesModelQuery(model, group.provider, normalized)),
|
|
48
|
+
}))
|
|
49
|
+
.filter((group) => group.models.length > 0);
|
|
50
|
+
}
|
|
51
|
+
/** Finds which group (and therefore provider) `modelId` belongs to, or `null` if it isn't in any group. */
|
|
52
|
+
export function findSelectedModel(groups, modelId) {
|
|
53
|
+
if (!modelId)
|
|
54
|
+
return null;
|
|
55
|
+
for (const group of groups) {
|
|
56
|
+
const model = group.models.find((m) => m.id === modelId);
|
|
57
|
+
if (model)
|
|
58
|
+
return { model, group };
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/** True when `modelId` is set but not present in any group — a free-text/custom value. */
|
|
63
|
+
export function isCustomModelId(modelId, groups) {
|
|
64
|
+
if (!modelId)
|
|
65
|
+
return false;
|
|
66
|
+
return findSelectedModel(groups, modelId) === null;
|
|
67
|
+
}
|
|
68
|
+
/** The first model in the first (highest-priority) group, or `null` if every group is empty. */
|
|
69
|
+
export function firstAvailableModelId(groups) {
|
|
70
|
+
return groups[0]?.models[0]?.id ?? null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* A one-line subtitle for the selected model: its hint, prefixed with the
|
|
74
|
+
* provider label unless the hint already opens with it (avoids
|
|
75
|
+
* "OpenAI · OpenAI · 4K, native multimodal"-style duplication).
|
|
76
|
+
*/
|
|
77
|
+
export function modelSubtitle(selection) {
|
|
78
|
+
const hint = selection.model.hint ?? '';
|
|
79
|
+
const providerLabel = selection.group.provider.label;
|
|
80
|
+
if (!hint)
|
|
81
|
+
return providerLabel;
|
|
82
|
+
return hint.toLowerCase().startsWith(providerLabel.toLowerCase()) ? hint : `${providerLabel} · ${hint}`;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../../src/react/features/model-picker/rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AAGjE;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA8B,EAC9B,SAAmC,EACnC,kBAA8D;IAE9D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAU,CAAC,CAAC,CAAC;IAC5F,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAA4B,CAAC;IAE/D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;YACzG,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC;YACtE,KAAK,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACzC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,+BAA+B,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,+BAA+B,CAAC,CAAC,CAAC,MAAM,CAAC,CAChG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAkB,EAAE,QAAuB,EAAE,eAAuB;IACpG,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,IAAI,EAAE,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC;IACrG,OAAO,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;AAC5C,CAAC;AAED,gJAAgJ;AAChJ,MAAM,UAAU,iBAAiB,CAAC,MAAmC,EAAE,KAAa;IAClF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5F,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACf,GAAG,KAAK;QACR,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;KAC7F,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,iBAAiB,CAC/B,MAAmC,EACnC,OAAkC;IAElC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QACzD,IAAI,KAAK;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,eAAe,CAAC,OAAkC,EAAE,MAAmC;IACrG,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CAAC,MAAmC;IACvE,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,SAA+B;IAC3D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IACxC,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,aAAa,CAAC;IAChC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,aAAa,MAAM,IAAI,EAAE,CAAC;AAC1G,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module types
|
|
3
|
+
*
|
|
4
|
+
* `features/model-picker/` is an independent feature slice: it depends only
|
|
5
|
+
* on `@jini-ai/protocol`'s agent-catalog vocabulary for what a model/agent/
|
|
6
|
+
* provider actually is — never on this package's own conversation/message
|
|
7
|
+
* state (`useConversation`/`useRunStream`/`transport.ts`) — so any consumer
|
|
8
|
+
* of `@jini-ai/chat-react` can use it without pulling in a full chat UI. See
|
|
9
|
+
* `source-map.md` for the extraction this ports (OD's `InlineModelSwitcher.tsx`
|
|
10
|
+
* + siblings and `NewProjectPanel.tsx`'s `MediaModelCards`).
|
|
11
|
+
*
|
|
12
|
+
* Files with no React import (this one included) stay at the feature's top
|
|
13
|
+
* level; `hooks/`/`components/` move under `react/` — the layout policy in
|
|
14
|
+
* `ADS-memory/reports/jini-port/god-components-extraction-plan.md`.
|
|
15
|
+
*/
|
|
16
|
+
import type { AgentDefinition, AgentDiagnostic, CredentialStatus, ModelCatalogOption as ModelOption, ModelProvider } from '@jini-ai/protocol';
|
|
17
|
+
export type { AgentDefinition, AgentDiagnostic, CredentialStatus, ModelOption, ModelProvider };
|
|
18
|
+
/** One provider's models, grouped together with that provider's resolved credential status. */
|
|
19
|
+
export interface ModelPickerGroup {
|
|
20
|
+
provider: ModelProvider;
|
|
21
|
+
status: CredentialStatus;
|
|
22
|
+
models: ModelOption[];
|
|
23
|
+
}
|
|
24
|
+
/** The currently-selected model plus the group (and therefore provider) it belongs to. */
|
|
25
|
+
export interface ModelPickerSelection {
|
|
26
|
+
model: ModelOption;
|
|
27
|
+
group: ModelPickerGroup;
|
|
28
|
+
}
|
|
29
|
+
export interface FetchProviderModelsInput {
|
|
30
|
+
providerId: string;
|
|
31
|
+
baseUrl?: string;
|
|
32
|
+
credential?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface FetchProviderModelsResult {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
models: ModelOption[];
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/react/features/model-picker/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAKhB,kBAAkB,IAAI,WAAW,EACjC,aAAa,EACd,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAE/F,+FAA+F;AAC/F,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,0FAA0F;AAC1F,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/react/features/model-picker/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module composer-draft-cache
|
|
3
|
+
*
|
|
4
|
+
* Per-conversation composer draft cache, keyed by conversation id. Exists so switching away from a
|
|
5
|
+
* conversation and back round-trips whatever the operator was typing — even when the host remounts
|
|
6
|
+
* `ChatPane` on switch (a React `key` keyed to the selected conversation, so a user-initiated switch
|
|
7
|
+
* re-seeds the transcript from `initialMessages` — a documented pattern for this component: the pane
|
|
8
|
+
* owns its own transcript and takes no `conversationId`-change effect of its own) — with zero host
|
|
9
|
+
* wiring required. `useComposer.ts` reads/writes this on every
|
|
10
|
+
* `conversationId` it is given; a host that also wants the draft to survive a page *reload* layers
|
|
11
|
+
* its own `persistence` (`ComposerDraftPersistence`) on top, unkeyed, exactly as documented there.
|
|
12
|
+
*
|
|
13
|
+
* This is intentionally NOT the same seam as `ComposerDraftPersistence`: that one is a single opaque
|
|
14
|
+
* host-owned slot (e.g. localStorage) that `useComposer` must never touch directly (see that
|
|
15
|
+
* module's doc). This cache lives in module scope instead, purely in memory, so it survives a
|
|
16
|
+
* `ChatPane` remount within the same page session — it does not, and is not meant to, survive a
|
|
17
|
+
* reload.
|
|
18
|
+
*
|
|
19
|
+
* @tradeoffs A module-level singleton (rather than a per-instance store a host constructs and
|
|
20
|
+
* passes down) was chosen so the fix works for every host with no new prop plumbing — known hosts of
|
|
21
|
+
* this package do not wire a `persistence` port today, so a purely opt-in fix would not have fixed
|
|
22
|
+
* the reported bug. The risk a singleton usually carries — two unrelated call sites sharing
|
|
23
|
+
* state that should be isolated (see `create-daemon-attachment-uploader.ts`'s per-uploader
|
|
24
|
+
* `batchUsage` map, which exists for exactly that reason) — does not apply the same way here: the
|
|
25
|
+
* partition key (`conversationId`) is already globally unique per backend, so two `ChatPane`
|
|
26
|
+
* instances showing two different conversations can never collide on it. Tests must call
|
|
27
|
+
* {@link __resetComposerDraftCacheForTests} between cases to avoid cross-test leakage; that is the
|
|
28
|
+
* real cost of this choice.
|
|
29
|
+
*
|
|
30
|
+
* Bounded to `MAX_CACHED_CONVERSATION_DRAFTS` distinct conversations so a long session visiting many
|
|
31
|
+
* conversations cannot grow this map without limit — the oldest-inserted entry is evicted once the
|
|
32
|
+
* cap is exceeded. A cleared/empty draft is deleted outright rather than kept as `''`, so the common
|
|
33
|
+
* case (drafted, then sent) does not linger in the cache at all.
|
|
34
|
+
*/
|
|
35
|
+
/** Cap on distinct conversations tracked at once; see the module doc's `@tradeoffs`. */
|
|
36
|
+
export declare const MAX_CACHED_CONVERSATION_DRAFTS = 50;
|
|
37
|
+
/**
|
|
38
|
+
* Reads the cached draft for `conversationId`.
|
|
39
|
+
*
|
|
40
|
+
* @returns The cached draft, or `null` when there is none — including when `conversationId` itself
|
|
41
|
+
* is absent (an untitled/new conversation has nothing to key on yet).
|
|
42
|
+
* @complexity Time/space: O(1).
|
|
43
|
+
*/
|
|
44
|
+
export declare function readCachedDraft(conversationId: string | null | undefined): string | null;
|
|
45
|
+
/**
|
|
46
|
+
* Stores `draft` for `conversationId`, evicting the oldest tracked conversation first if this would
|
|
47
|
+
* introduce a new entry past {@link MAX_CACHED_CONVERSATION_DRAFTS}.
|
|
48
|
+
*
|
|
49
|
+
* @param conversationId No-ops when absent (`null`/`undefined`) — there is nothing to key on yet.
|
|
50
|
+
* @param draft A blank (or whitespace-only) draft deletes the entry instead of storing `''`; see the
|
|
51
|
+
* module doc's cleanup note.
|
|
52
|
+
* @complexity Time/space: O(1) amortized.
|
|
53
|
+
*/
|
|
54
|
+
export declare function writeCachedDraft(conversationId: string | null | undefined, draft: string): void;
|
|
55
|
+
/**
|
|
56
|
+
* Explicitly evicts `conversationId`'s cached draft, for a host that wants to free it immediately
|
|
57
|
+
* (e.g. on conversation delete) rather than waiting for the cap-triggered eviction above. Not
|
|
58
|
+
* currently called by any host — a host's own conversation-delete flow is a candidate follow-up
|
|
59
|
+
* caller, out of scope here (that flow lives outside this package).
|
|
60
|
+
* @complexity Time/space: O(1).
|
|
61
|
+
*/
|
|
62
|
+
export declare function clearCachedDraft(conversationId: string | null | undefined): void;
|
|
63
|
+
/** Test-only: empties the module-level cache so test cases cannot leak drafts into each other. */
|
|
64
|
+
export declare function __resetComposerDraftCacheForTests(): void;
|
|
65
|
+
//# sourceMappingURL=composer-draft-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-draft-cache.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/composer-draft-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,wFAAwF;AACxF,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAIjD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGxF;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAW/F;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAGhF;AAED,kGAAkG;AAClG,wBAAgB,iCAAiC,IAAI,IAAI,CAExD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module composer-draft-cache
|
|
3
|
+
*
|
|
4
|
+
* Per-conversation composer draft cache, keyed by conversation id. Exists so switching away from a
|
|
5
|
+
* conversation and back round-trips whatever the operator was typing — even when the host remounts
|
|
6
|
+
* `ChatPane` on switch (a React `key` keyed to the selected conversation, so a user-initiated switch
|
|
7
|
+
* re-seeds the transcript from `initialMessages` — a documented pattern for this component: the pane
|
|
8
|
+
* owns its own transcript and takes no `conversationId`-change effect of its own) — with zero host
|
|
9
|
+
* wiring required. `useComposer.ts` reads/writes this on every
|
|
10
|
+
* `conversationId` it is given; a host that also wants the draft to survive a page *reload* layers
|
|
11
|
+
* its own `persistence` (`ComposerDraftPersistence`) on top, unkeyed, exactly as documented there.
|
|
12
|
+
*
|
|
13
|
+
* This is intentionally NOT the same seam as `ComposerDraftPersistence`: that one is a single opaque
|
|
14
|
+
* host-owned slot (e.g. localStorage) that `useComposer` must never touch directly (see that
|
|
15
|
+
* module's doc). This cache lives in module scope instead, purely in memory, so it survives a
|
|
16
|
+
* `ChatPane` remount within the same page session — it does not, and is not meant to, survive a
|
|
17
|
+
* reload.
|
|
18
|
+
*
|
|
19
|
+
* @tradeoffs A module-level singleton (rather than a per-instance store a host constructs and
|
|
20
|
+
* passes down) was chosen so the fix works for every host with no new prop plumbing — known hosts of
|
|
21
|
+
* this package do not wire a `persistence` port today, so a purely opt-in fix would not have fixed
|
|
22
|
+
* the reported bug. The risk a singleton usually carries — two unrelated call sites sharing
|
|
23
|
+
* state that should be isolated (see `create-daemon-attachment-uploader.ts`'s per-uploader
|
|
24
|
+
* `batchUsage` map, which exists for exactly that reason) — does not apply the same way here: the
|
|
25
|
+
* partition key (`conversationId`) is already globally unique per backend, so two `ChatPane`
|
|
26
|
+
* instances showing two different conversations can never collide on it. Tests must call
|
|
27
|
+
* {@link __resetComposerDraftCacheForTests} between cases to avoid cross-test leakage; that is the
|
|
28
|
+
* real cost of this choice.
|
|
29
|
+
*
|
|
30
|
+
* Bounded to `MAX_CACHED_CONVERSATION_DRAFTS` distinct conversations so a long session visiting many
|
|
31
|
+
* conversations cannot grow this map without limit — the oldest-inserted entry is evicted once the
|
|
32
|
+
* cap is exceeded. A cleared/empty draft is deleted outright rather than kept as `''`, so the common
|
|
33
|
+
* case (drafted, then sent) does not linger in the cache at all.
|
|
34
|
+
*/
|
|
35
|
+
/** Cap on distinct conversations tracked at once; see the module doc's `@tradeoffs`. */
|
|
36
|
+
export const MAX_CACHED_CONVERSATION_DRAFTS = 50;
|
|
37
|
+
const drafts = new Map();
|
|
38
|
+
/**
|
|
39
|
+
* Reads the cached draft for `conversationId`.
|
|
40
|
+
*
|
|
41
|
+
* @returns The cached draft, or `null` when there is none — including when `conversationId` itself
|
|
42
|
+
* is absent (an untitled/new conversation has nothing to key on yet).
|
|
43
|
+
* @complexity Time/space: O(1).
|
|
44
|
+
*/
|
|
45
|
+
export function readCachedDraft(conversationId) {
|
|
46
|
+
if (!conversationId)
|
|
47
|
+
return null;
|
|
48
|
+
return drafts.get(conversationId) ?? null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Stores `draft` for `conversationId`, evicting the oldest tracked conversation first if this would
|
|
52
|
+
* introduce a new entry past {@link MAX_CACHED_CONVERSATION_DRAFTS}.
|
|
53
|
+
*
|
|
54
|
+
* @param conversationId No-ops when absent (`null`/`undefined`) — there is nothing to key on yet.
|
|
55
|
+
* @param draft A blank (or whitespace-only) draft deletes the entry instead of storing `''`; see the
|
|
56
|
+
* module doc's cleanup note.
|
|
57
|
+
* @complexity Time/space: O(1) amortized.
|
|
58
|
+
*/
|
|
59
|
+
export function writeCachedDraft(conversationId, draft) {
|
|
60
|
+
if (!conversationId)
|
|
61
|
+
return;
|
|
62
|
+
if (draft.trim() === '') {
|
|
63
|
+
drafts.delete(conversationId);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (!drafts.has(conversationId) && drafts.size >= MAX_CACHED_CONVERSATION_DRAFTS) {
|
|
67
|
+
const oldest = drafts.keys().next().value;
|
|
68
|
+
if (oldest !== undefined)
|
|
69
|
+
drafts.delete(oldest);
|
|
70
|
+
}
|
|
71
|
+
drafts.set(conversationId, draft);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Explicitly evicts `conversationId`'s cached draft, for a host that wants to free it immediately
|
|
75
|
+
* (e.g. on conversation delete) rather than waiting for the cap-triggered eviction above. Not
|
|
76
|
+
* currently called by any host — a host's own conversation-delete flow is a candidate follow-up
|
|
77
|
+
* caller, out of scope here (that flow lives outside this package).
|
|
78
|
+
* @complexity Time/space: O(1).
|
|
79
|
+
*/
|
|
80
|
+
export function clearCachedDraft(conversationId) {
|
|
81
|
+
if (!conversationId)
|
|
82
|
+
return;
|
|
83
|
+
drafts.delete(conversationId);
|
|
84
|
+
}
|
|
85
|
+
/** Test-only: empties the module-level cache so test cases cannot leak drafts into each other. */
|
|
86
|
+
export function __resetComposerDraftCacheForTests() {
|
|
87
|
+
drafts.clear();
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=composer-draft-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-draft-cache.js","sourceRoot":"","sources":["../../../src/react/hooks/composer-draft-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,wFAAwF;AACxF,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,cAAyC;IACvE,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC;AAC5C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAyC,EAAE,KAAa;IACvF,IAAI,CAAC,cAAc;QAAE,OAAO;IAC5B,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,8BAA8B,EAAE,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC1C,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAyC;IACxE,IAAI,CAAC,cAAc;QAAE,OAAO;IAC5B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAChC,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,iCAAiC;IAC/C,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AnalyticsAdapter, I18nAdapter, ProjectContextValue } from '../slots.js';
|
|
2
|
+
import type { ChatTransport } from '../../core/index.js';
|
|
3
|
+
import type { RendererRegistry } from '../artifact-types.js';
|
|
4
|
+
export declare const I18nContext: import("react").Context<I18nAdapter>;
|
|
5
|
+
export declare const AnalyticsContext: import("react").Context<AnalyticsAdapter>;
|
|
6
|
+
export declare const ProjectContext: import("react").Context<ProjectContextValue | undefined>;
|
|
7
|
+
export declare const ChatTransportContext: import("react").Context<ChatTransport | undefined>;
|
|
8
|
+
export declare const ArtifactRegistryContext: import("react").Context<RendererRegistry | undefined>;
|
|
9
|
+
/** Convenience for call sites that only need the translator function. */
|
|
10
|
+
export declare function useT(): I18nAdapter['t'];
|
|
11
|
+
export declare function useI18n(): I18nAdapter;
|
|
12
|
+
export declare function useAnalytics(): AnalyticsAdapter;
|
|
13
|
+
/** `undefined` when no `<JiniChatProvider project={...}>` is mounted — components must treat project-dependent affordances (file links, uploads) as unavailable rather than throwing. */
|
|
14
|
+
export declare function useProjectContext(): ProjectContextValue | undefined;
|
|
15
|
+
/** Throws when read outside `<JiniChatProvider>` — unlike the other contexts, hooks that need a transport (`useConversation`/`useRunStream`) have no sensible no-op fallback. */
|
|
16
|
+
export declare function useChatTransport(): ChatTransport;
|
|
17
|
+
export declare function useArtifactRegistry(): RendererRegistry | undefined;
|
|
18
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/context.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAiB7D,eAAO,MAAM,WAAW,sCAA+C,CAAC;AACxE,eAAO,MAAM,gBAAgB,2CAAkD,CAAC;AAChF,eAAO,MAAM,cAAc,0DAA4D,CAAC;AACxF,eAAO,MAAM,oBAAoB,oDAAsD,CAAC;AACxF,eAAO,MAAM,uBAAuB,uDAAyD,CAAC;AAE9F,yEAAyE;AACzE,wBAAgB,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,CAEvC;AAED,wBAAgB,OAAO,IAAI,WAAW,CAErC;AAED,wBAAgB,YAAY,IAAI,gBAAgB,CAE/C;AAED,yLAAyL;AACzL,wBAAgB,iBAAiB,IAAI,mBAAmB,GAAG,SAAS,CAEnE;AAED,iLAAiL;AACjL,wBAAgB,gBAAgB,IAAI,aAAa,CAIhD;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,SAAS,CAElE"}
|