@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,298 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @module ToolCard
|
|
4
|
+
*
|
|
5
|
+
* Renders a single `tool_use` (optionally paired with its `tool_result`) as
|
|
6
|
+
* an inline card. Lookup order: (1) a user-registered renderer
|
|
7
|
+
* (`registerToolRenderer` — `../../tool-renderer-registry.js`), (2) a
|
|
8
|
+
* hardcoded family card for tools shipped with this package (TodoWrite /
|
|
9
|
+
* Write / Edit / Read / Bash / Glob / Grep / WebFetch / WebSearch), (3) a
|
|
10
|
+
* generic command/output fallback.
|
|
11
|
+
*
|
|
12
|
+
* Ported from OD's `components/ToolCard.tsx` (verified 0 OD product
|
|
13
|
+
* references) — `op-*` classNames and structure kept verbatim (this package
|
|
14
|
+
* ships unstyled semantic markup; a host supplies CSS), every user-facing
|
|
15
|
+
* string wrapped in `useT()`. The legacy `AskUserQuestion` read-only-history
|
|
16
|
+
* card and its `op-generic`-shaped answer-recovery parsing are intentionally
|
|
17
|
+
* NOT ported: that mechanism only exists in OD's persisted chat history
|
|
18
|
+
* pre-dating the `<question-form>` flow, which is out of scope for a fresh
|
|
19
|
+
* `@jini-ai/chat-react` consumer — an unrecognized tool name (including
|
|
20
|
+
* `AskUserQuestion`) falls through to `GenericCard`, which is a correct,
|
|
21
|
+
* generic rendering for it.
|
|
22
|
+
*/
|
|
23
|
+
import { useState } from 'react';
|
|
24
|
+
import { isTodoWriteToolName, parseTodoWriteInput, toRenderProps } from '../../core/index.js';
|
|
25
|
+
import { useT } from '../hooks/context.js';
|
|
26
|
+
import { getToolRenderer } from '../tool-renderer-registry.js';
|
|
27
|
+
import { Icon } from './Icon.js';
|
|
28
|
+
import { TodoCard } from './TodoCard.js';
|
|
29
|
+
/** A Jini registry tool id: dotted, lowercase, snake_case segments — `page.fill`, `daemon.db.vacuum`, `chat.send_message`. Never matches an agent-vendor tool name (`Bash`, `Write`, `mcp__jini__execute_delegated_tool`), which is the point — this is how a canonical delegated-tool event is told apart from everything else. */
|
|
30
|
+
const JINI_TOOL_ID_PATTERN = /^[a-z][a-z_]*(\.[a-z][a-z_]*)+$/;
|
|
31
|
+
const EXECUTE_DELEGATED_TOOL_NAMES = new Set(['execute_delegated_tool', 'mcp__jini__execute_delegated_tool']);
|
|
32
|
+
const SEARCH_TOOLS_NAMES = new Set(['search_tools', 'mcp__jini__search_tools']);
|
|
33
|
+
const DESCRIBE_TOOL_NAMES = new Set(['describe_tool', 'mcp__jini__describe_tool']);
|
|
34
|
+
export function ToolCard({ use, result, runStreaming, runSucceeded, projectFileNames, onRequestOpenFile }) {
|
|
35
|
+
const name = use.name;
|
|
36
|
+
const isStreaming = runStreaming ?? false;
|
|
37
|
+
const isSucceeded = runSucceeded ?? false;
|
|
38
|
+
const content = renderToolCardBody(name, use, result, isStreaming, isSucceeded, { projectFileNames, onRequestOpenFile });
|
|
39
|
+
if (content === null)
|
|
40
|
+
return null;
|
|
41
|
+
// Tagged once here, at the single dispatch point every branch below funnels through, rather than
|
|
42
|
+
// in each of the dozen card variants — one place to keep correct, and every variant (including a
|
|
43
|
+
// host's own custom-registered renderer) gets it automatically. `use.id` is this tool call's own
|
|
44
|
+
// stable identifier (unique per call within a message), never reused, so this handle is never
|
|
45
|
+
// ambiguous the way a repeated literal handle would be.
|
|
46
|
+
return (_jsx("div", { "data-agent-element": `tool-call-${use.id}`, "data-agent-role": "region", "data-agent-label": `A ${humanizeToolId(name)} tool call the AI made`, children: content }));
|
|
47
|
+
}
|
|
48
|
+
function renderToolCardBody(name, use, result, isStreaming, isSucceeded, fileCtx) {
|
|
49
|
+
const custom = getToolRenderer(name);
|
|
50
|
+
if (custom) {
|
|
51
|
+
try {
|
|
52
|
+
const node = custom(toRenderProps(use, result, isStreaming, isSucceeded));
|
|
53
|
+
if (node !== undefined && node !== null && node !== false)
|
|
54
|
+
return node;
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
console.error(`[ToolCard] custom renderer for "${name}" threw; falling back`, err);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// `execute_delegated_tool` is a transport wrapper: `@jini-ai/daemon`'s `delegated-tool-bridge.ts`
|
|
61
|
+
// always emits a second, canonical `tool_use` named after the real Jini tool id (`page.fill`,
|
|
62
|
+
// not `execute_delegated_tool`) alongside it — before calling `ToolExecutor`, so it exists even
|
|
63
|
+
// when the call fails at the tool-execution layer. Showing both floods the pane with the same
|
|
64
|
+
// action twice. Suppressed only on a *successful* result: a wrapper-level failure (a genuine
|
|
65
|
+
// transport error, not a tool-execution failure — those come back as a normal 'completed' result
|
|
66
|
+
// with status:'failed' inside it) has no matching canonical row to fall back on, so it must stay
|
|
67
|
+
// visible rather than disappear silently.
|
|
68
|
+
if (EXECUTE_DELEGATED_TOOL_NAMES.has(name) && result && !result.isError)
|
|
69
|
+
return null;
|
|
70
|
+
if (isTodoWriteToolName(name))
|
|
71
|
+
return _jsx(TodoCard, { todos: parseTodoWriteInput(use.input), runStreaming: isStreaming });
|
|
72
|
+
if (name === 'Write' || name === 'write' || name === 'create_file')
|
|
73
|
+
return _jsx(FileWriteCard, { input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded, ctx: fileCtx });
|
|
74
|
+
if (name === 'Edit' || name === 'str_replace_edit')
|
|
75
|
+
return _jsx(FileEditCard, { input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded, ctx: fileCtx });
|
|
76
|
+
if (name === 'Read' || name === 'read_file')
|
|
77
|
+
return _jsx(FileReadCard, { input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded, ctx: fileCtx });
|
|
78
|
+
if (name === 'Bash')
|
|
79
|
+
return _jsx(BashCard, { input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded });
|
|
80
|
+
if (name === 'Glob' || name === 'list_files')
|
|
81
|
+
return _jsx(GlobCard, { input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded });
|
|
82
|
+
if (name === 'Grep')
|
|
83
|
+
return _jsx(GrepCard, { input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded });
|
|
84
|
+
if (name === 'WebFetch' || name === 'web_fetch')
|
|
85
|
+
return _jsx(WebFetchCard, { input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded });
|
|
86
|
+
if (name === 'WebSearch' || name === 'web_search')
|
|
87
|
+
return _jsx(WebSearchCard, { input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded });
|
|
88
|
+
if (JINI_TOOL_ID_PATTERN.test(name) || EXECUTE_DELEGATED_TOOL_NAMES.has(name)) {
|
|
89
|
+
// The unsuppressed (failed-wrapper) case falls through here too: `name` is still
|
|
90
|
+
// `execute_delegated_tool`, so `jiniToolIdFromInput` recovers the real id from
|
|
91
|
+
// `{toolId, input}` instead of `DelegatedToolCard` receiving its own wrapper name as the title.
|
|
92
|
+
return _jsx(DelegatedToolCard, { name: name, input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded });
|
|
93
|
+
}
|
|
94
|
+
if (SEARCH_TOOLS_NAMES.has(name))
|
|
95
|
+
return _jsx(SearchToolsCard, { input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded });
|
|
96
|
+
if (DESCRIBE_TOOL_NAMES.has(name))
|
|
97
|
+
return _jsx(DescribeToolCard, { input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded });
|
|
98
|
+
return _jsx(GenericCard, { name: name, input: use.input, result: result, runStreaming: isStreaming, runSucceeded: isSucceeded });
|
|
99
|
+
}
|
|
100
|
+
/** `"page.fill"` -> `"Page Fill"`, `"daemon.db.vacuum"` -> `"Daemon Db Vacuum"`. Cosmetic only — never used to make a routing decision. */
|
|
101
|
+
function humanizeToolId(id) {
|
|
102
|
+
return id
|
|
103
|
+
.split('.')
|
|
104
|
+
.map((segment) => segment.split('_').map((word) => (word ? word[0].toUpperCase() + word.slice(1) : word)).join(' '))
|
|
105
|
+
.join(' ');
|
|
106
|
+
}
|
|
107
|
+
/** The one argument that best identifies *what* a call acted on, for the card's collapsed summary — an element handle, a page id, or (for tools with neither) whatever the first string-valued argument is. */
|
|
108
|
+
function primaryTarget(input) {
|
|
109
|
+
if (input == null || typeof input !== 'object')
|
|
110
|
+
return undefined;
|
|
111
|
+
const obj = input;
|
|
112
|
+
for (const key of ['element', 'page', 'handle', 'toolId', 'id']) {
|
|
113
|
+
const v = obj[key];
|
|
114
|
+
if (typeof v === 'string' && v)
|
|
115
|
+
return v;
|
|
116
|
+
}
|
|
117
|
+
for (const v of Object.values(obj)) {
|
|
118
|
+
if (typeof v === 'string' && v)
|
|
119
|
+
return v;
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* A card for one `page.*`/`daemon.db.*`/`chat.*`/… call — the canonical event
|
|
125
|
+
* `delegated-tool-bridge.ts` emits, named after the real Jini tool id. Collapsed by default with a
|
|
126
|
+
* title of the shape "Tool call · Page Fill · signup-name-input", matching every other card's
|
|
127
|
+
* accordion pattern rather than the raw `execute_delegated_tool{"toolId":...,"input":{...}}` JSON
|
|
128
|
+
* blob this replaces.
|
|
129
|
+
*/
|
|
130
|
+
function DelegatedToolCard({ name, input, result, runStreaming, runSucceeded }) {
|
|
131
|
+
const t = useT();
|
|
132
|
+
const [open, setOpen] = useState(false);
|
|
133
|
+
// Wrapper form (only reached on a failed wrapper call, per ToolCard's suppression comment):
|
|
134
|
+
// the real id and args are nested under {toolId, input}, not `input` itself.
|
|
135
|
+
const wrapper = (input ?? {});
|
|
136
|
+
const toolId = EXECUTE_DELEGATED_TOOL_NAMES.has(name) ? (wrapper.toolId ?? name) : name;
|
|
137
|
+
const args = EXECUTE_DELEGATED_TOOL_NAMES.has(name) ? wrapper.input : input;
|
|
138
|
+
const target = primaryTarget(args);
|
|
139
|
+
const isRunning = runStreaming && !result;
|
|
140
|
+
return (_jsxs("div", { className: "op-card op-jini-tool", children: [_jsxs("button", { type: "button", className: "op-card-head", onClick: () => setOpen((o) => !o), children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsxs("span", { className: `op-title${isRunning ? ' shimmer-text' : ''}`, children: [t('Tool call'), " \u00B7 ", humanizeToolId(toolId)] }), target ? _jsx("span", { className: "op-meta", children: target }) : null, _jsx("span", { className: "op-expand-chev", "aria-hidden": true, children: _jsx(Icon, { name: open ? 'chevron-down' : 'chevron-right', size: 11 }) })] }), _jsx("div", { className: `accordion-collapsible${open ? ' open' : ''}`, children: _jsx("div", { className: "accordion-collapsible-inner", children: _jsxs("div", { className: "op-card-detail", children: [_jsx("pre", { className: "op-command", children: JSON.stringify(args ?? {}) }), result?.content ? _jsx("pre", { className: "op-output", children: truncate(result.content, 2000) }) : null, _jsx(ToolResultMedia, { result: result })] }) }) }), _jsx(FileErrorDetail, { result: result })] }));
|
|
141
|
+
}
|
|
142
|
+
function SearchToolsCard({ input, result, runStreaming, runSucceeded }) {
|
|
143
|
+
const t = useT();
|
|
144
|
+
const [open, setOpen] = useState(false);
|
|
145
|
+
const obj = (input ?? {});
|
|
146
|
+
const isRunning = runStreaming && !result;
|
|
147
|
+
return (_jsxs("div", { className: "op-card op-jini-tool", children: [_jsxs("button", { type: "button", className: "op-card-head", onClick: () => setOpen((o) => !o), children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: `op-title${isRunning ? ' shimmer-text' : ''}`, children: t('Search tools') }), obj.query ? _jsx("span", { className: "op-meta", children: obj.query }) : null, _jsx("span", { className: "op-expand-chev", "aria-hidden": true, children: _jsx(Icon, { name: open ? 'chevron-down' : 'chevron-right', size: 11 }) })] }), _jsx("div", { className: `accordion-collapsible${open ? ' open' : ''}`, children: _jsx("div", { className: "accordion-collapsible-inner", children: _jsx("div", { className: "op-card-detail", children: result?.content ? _jsx("pre", { className: "op-output", children: truncate(result.content, 2000) }) : null }) }) }), _jsx(FileErrorDetail, { result: result })] }));
|
|
148
|
+
}
|
|
149
|
+
function DescribeToolCard({ input, result, runStreaming, runSucceeded }) {
|
|
150
|
+
const t = useT();
|
|
151
|
+
const [open, setOpen] = useState(false);
|
|
152
|
+
const obj = (input ?? {});
|
|
153
|
+
const isRunning = runStreaming && !result;
|
|
154
|
+
return (_jsxs("div", { className: "op-card op-jini-tool", children: [_jsxs("button", { type: "button", className: "op-card-head", onClick: () => setOpen((o) => !o), children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: `op-title${isRunning ? ' shimmer-text' : ''}`, children: t('Describe tool') }), obj.id ? _jsx("span", { className: "op-meta", children: obj.id }) : null, _jsx("span", { className: "op-expand-chev", "aria-hidden": true, children: _jsx(Icon, { name: open ? 'chevron-down' : 'chevron-right', size: 11 }) })] }), _jsx("div", { className: `accordion-collapsible${open ? ' open' : ''}`, children: _jsx("div", { className: "accordion-collapsible-inner", children: _jsx("div", { className: "op-card-detail", children: result?.content ? _jsx("pre", { className: "op-output", children: truncate(result.content, 2000) }) : null }) }) }), _jsx(FileErrorDetail, { result: result })] }));
|
|
155
|
+
}
|
|
156
|
+
function OpenInTabButton({ filePath, ctx }) {
|
|
157
|
+
const t = useT();
|
|
158
|
+
if (!ctx.onRequestOpenFile)
|
|
159
|
+
return null;
|
|
160
|
+
if (!filePath || filePath === '(unnamed)')
|
|
161
|
+
return null;
|
|
162
|
+
// `String.prototype.split` always returns a non-empty array, so `.pop()` on it can
|
|
163
|
+
// never be `undefined` here — the `??` fallback TS's return type demands is dead code.
|
|
164
|
+
const baseName = filePath.split('/').pop();
|
|
165
|
+
if (!baseName)
|
|
166
|
+
return null;
|
|
167
|
+
if (ctx.projectFileNames && !ctx.projectFileNames.has(baseName))
|
|
168
|
+
return null;
|
|
169
|
+
const open = ctx.onRequestOpenFile;
|
|
170
|
+
return (_jsx("button", { type: "button", className: "op-open", onClick: () => open(baseName), title: t('Open {name} in a tab', { name: baseName }), children: t('Open') }));
|
|
171
|
+
}
|
|
172
|
+
function FileWriteCard({ input, result, runStreaming, runSucceeded, ctx }) {
|
|
173
|
+
const t = useT();
|
|
174
|
+
const [open, setOpen] = useState(false);
|
|
175
|
+
const obj = (input ?? {});
|
|
176
|
+
const file = obj.file_path ?? obj.filePath ?? obj.path ?? '(unnamed)';
|
|
177
|
+
// See OpenInTabButton's baseName comment: `.split('/').pop()` is never undefined.
|
|
178
|
+
const baseName = file.split('/').pop();
|
|
179
|
+
const lines = typeof obj.content === 'string' ? obj.content.split('\n').length : null;
|
|
180
|
+
const isRunning = runStreaming && !result;
|
|
181
|
+
return (_jsxs("div", { className: "op-card op-file", children: [_jsxs("button", { type: "button", className: "op-card-head", onClick: () => setOpen((o) => !o), children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: `op-title${isRunning ? ' shimmer-text' : ''}`, children: t('Write') }), _jsxs("span", { className: "op-meta", children: [baseName, lines !== null ? ` · ${t('{n} lines', { n: lines })}` : ''] }), _jsx("span", { className: "op-expand-chev", "aria-hidden": true, children: _jsx(Icon, { name: open ? 'chevron-down' : 'chevron-right', size: 11 }) })] }), _jsx("div", { className: `accordion-collapsible${open ? ' open' : ''}`, children: _jsx("div", { className: "accordion-collapsible-inner", children: _jsxs("div", { className: "op-card-detail op-card-file-detail", children: [_jsx("code", { className: "op-path", children: file }), _jsx(OpenInTabButton, { filePath: file, ctx: ctx })] }) }) }), _jsx(FileErrorDetail, { result: result })] }));
|
|
182
|
+
}
|
|
183
|
+
function FileEditCard({ input, result, runStreaming, runSucceeded, ctx }) {
|
|
184
|
+
const t = useT();
|
|
185
|
+
const [open, setOpen] = useState(false);
|
|
186
|
+
const obj = (input ?? {});
|
|
187
|
+
const file = obj.file_path ?? obj.filePath ?? obj.path ?? '(unnamed)';
|
|
188
|
+
// See OpenInTabButton's baseName comment: `.split('/').pop()` is never undefined.
|
|
189
|
+
const baseName = file.split('/').pop();
|
|
190
|
+
const editCount = Array.isArray(obj.edits) ? obj.edits.length : 1;
|
|
191
|
+
const isRunning = runStreaming && !result;
|
|
192
|
+
return (_jsxs("div", { className: "op-card op-file", children: [_jsxs("button", { type: "button", className: "op-card-head", onClick: () => setOpen((o) => !o), children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: `op-title${isRunning ? ' shimmer-text' : ''}`, children: t('Edit') }), _jsxs("span", { className: "op-meta", children: [baseName, " \u00B7 ", editCount, " ", editCount === 1 ? t('change') : t('changes')] }), _jsx("span", { className: "op-expand-chev", "aria-hidden": true, children: _jsx(Icon, { name: open ? 'chevron-down' : 'chevron-right', size: 11 }) })] }), _jsx("div", { className: `accordion-collapsible${open ? ' open' : ''}`, children: _jsx("div", { className: "accordion-collapsible-inner", children: _jsxs("div", { className: "op-card-detail op-card-file-detail", children: [_jsx("code", { className: "op-path", children: file }), _jsx(OpenInTabButton, { filePath: file, ctx: ctx })] }) }) }), _jsx(FileErrorDetail, { result: result })] }));
|
|
193
|
+
}
|
|
194
|
+
function FileReadCard({ input, result, runStreaming, runSucceeded, ctx }) {
|
|
195
|
+
const t = useT();
|
|
196
|
+
const [open, setOpen] = useState(false);
|
|
197
|
+
const obj = (input ?? {});
|
|
198
|
+
const file = obj.file_path ?? obj.filePath ?? obj.path ?? '(unnamed)';
|
|
199
|
+
// See OpenInTabButton's baseName comment: `.split('/').pop()` is never undefined.
|
|
200
|
+
const baseName = file.split('/').pop();
|
|
201
|
+
const isRunning = runStreaming && !result;
|
|
202
|
+
return (_jsxs("div", { className: "op-card op-file", children: [_jsxs("button", { type: "button", className: "op-card-head", onClick: () => setOpen((o) => !o), children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: `op-title${isRunning ? ' shimmer-text' : ''}`, children: t('Read') }), _jsx("span", { className: "op-meta", children: baseName }), _jsx("span", { className: "op-expand-chev", "aria-hidden": true, children: _jsx(Icon, { name: open ? 'chevron-down' : 'chevron-right', size: 11 }) })] }), _jsx("div", { className: `accordion-collapsible${open ? ' open' : ''}`, children: _jsx("div", { className: "accordion-collapsible-inner", children: _jsxs("div", { className: "op-card-detail op-card-file-detail", children: [_jsx("code", { className: "op-path", children: file }), _jsx(OpenInTabButton, { filePath: file, ctx: ctx })] }) }) }), _jsx(FileErrorDetail, { result: result })] }));
|
|
203
|
+
}
|
|
204
|
+
function BashCard({ input, result, runStreaming, runSucceeded }) {
|
|
205
|
+
const t = useT();
|
|
206
|
+
const obj = (input ?? {});
|
|
207
|
+
const command = obj.command ?? '';
|
|
208
|
+
const desc = obj.description;
|
|
209
|
+
const [open, setOpen] = useState(false);
|
|
210
|
+
const isRunning = runStreaming && !result;
|
|
211
|
+
return (_jsxs("div", { className: "op-card op-bash", children: [_jsxs("button", { type: "button", className: "op-card-head", onClick: () => setOpen((o) => !o), children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: `op-title${isRunning ? ' shimmer-text' : ''}`, children: t('Bash') }), desc ? _jsx("span", { className: "op-meta op-desc", children: desc }) : null, _jsx("span", { className: "op-expand-chev", "aria-hidden": true, children: _jsx(Icon, { name: open ? 'chevron-down' : 'chevron-right', size: 11 }) })] }), _jsx("div", { className: `accordion-collapsible${open ? ' open' : ''}`, children: _jsx("div", { className: "accordion-collapsible-inner", children: _jsxs("div", { className: "op-card-detail", children: [_jsx("pre", { className: "op-command", children: truncate(command, 400) }), result?.content ? _jsx("pre", { className: "op-output", children: truncate(result.content, 4000) }) : null] }) }) })] }));
|
|
212
|
+
}
|
|
213
|
+
function GlobCard({ input, result, runStreaming, runSucceeded }) {
|
|
214
|
+
const t = useT();
|
|
215
|
+
const obj = (input ?? {});
|
|
216
|
+
return (_jsx("div", { className: "op-card op-search", children: _jsxs("div", { className: "op-card-head", children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: "op-title", children: t('Search files') }), _jsxs("span", { className: "op-meta", children: [obj.pattern ?? '*', obj.path ? ` in ${obj.path}` : ''] })] }) }));
|
|
217
|
+
}
|
|
218
|
+
function GrepCard({ input, result, runStreaming, runSucceeded }) {
|
|
219
|
+
const t = useT();
|
|
220
|
+
const obj = (input ?? {});
|
|
221
|
+
return (_jsx("div", { className: "op-card op-search", children: _jsxs("div", { className: "op-card-head", children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: "op-title", children: t('Search content') }), _jsxs("span", { className: "op-meta", children: [obj.pattern ?? '', obj.path ? ` in ${obj.path}` : ''] })] }) }));
|
|
222
|
+
}
|
|
223
|
+
function WebFetchCard({ input, result, runStreaming, runSucceeded }) {
|
|
224
|
+
const t = useT();
|
|
225
|
+
const obj = (input ?? {});
|
|
226
|
+
return (_jsx("div", { className: "op-card op-web", children: _jsxs("div", { className: "op-card-head", children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: "op-title", children: t('Fetch') }), _jsx("span", { className: "op-meta", children: obj.url ?? '' })] }) }));
|
|
227
|
+
}
|
|
228
|
+
function WebSearchCard({ input, result, runStreaming, runSucceeded }) {
|
|
229
|
+
const t = useT();
|
|
230
|
+
const obj = (input ?? {});
|
|
231
|
+
return (_jsx("div", { className: "op-card op-web", children: _jsxs("div", { className: "op-card-head", children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: "op-title", children: t('Search') }), _jsx("span", { className: "op-meta", children: obj.query ?? '' })] }) }));
|
|
232
|
+
}
|
|
233
|
+
function GenericCard({ name, input, result, runStreaming, runSucceeded }) {
|
|
234
|
+
const summary = describeInput(input);
|
|
235
|
+
return (_jsxs("div", { className: "op-card op-generic", children: [_jsxs("div", { className: "op-card-head", children: [_jsx(ResultBadge, { result: result, runStreaming: runStreaming, runSucceeded: runSucceeded }), _jsx("span", { className: "op-title", children: name }), summary ? _jsx("span", { className: "op-meta", children: truncate(summary, 200) }) : null] }), _jsx(ToolResultMedia, { result: result })] }));
|
|
236
|
+
}
|
|
237
|
+
function ResultBadge({ result, runStreaming, runSucceeded }) {
|
|
238
|
+
const t = useT();
|
|
239
|
+
if (!result && runStreaming)
|
|
240
|
+
return (_jsx("span", { className: "op-status op-status-running", title: t('Running'), children: _jsx(Icon, { name: "spinner", size: 14 }) }));
|
|
241
|
+
if (!result && !runSucceeded)
|
|
242
|
+
return (_jsx("span", { className: "op-status op-status-error", title: t('Error'), children: _jsx(Icon, { name: "close", size: 14 }) }));
|
|
243
|
+
if (result?.isError)
|
|
244
|
+
return (_jsx("span", { className: "op-status op-status-error", title: result.content || t('Error'), children: _jsx(Icon, { name: "close", size: 14 }) }));
|
|
245
|
+
return (_jsx("span", { className: "op-status op-status-ok", title: t('Done'), children: _jsx(Icon, { name: "check", size: 14 }) }));
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Renders the `image` blocks a tool result's `media` field carries — the one media type this slice
|
|
249
|
+
* proves end to end (`ToolResultMediaBlock`'s `text` arm is never collected into `media` in the
|
|
250
|
+
* first place; see `@jini-ai/daemon`'s `tool-result-media.ts`, so there is nothing to render for
|
|
251
|
+
* it). `null` for the overwhelming majority of results, which carry no `media` at all — every
|
|
252
|
+
* existing card that renders this stays visually unchanged.
|
|
253
|
+
*
|
|
254
|
+
* Styled only with an inline `max-width` safety net, not a class-driven layout: this package ships
|
|
255
|
+
* unstyled semantic markup (this module's own header) and a host supplies CSS via `.op-media`/
|
|
256
|
+
* `.op-media-image`. Without the inline rule, a handler-supplied image at its native pixel size
|
|
257
|
+
* could blow out the card's width before any host stylesheet loads.
|
|
258
|
+
*/
|
|
259
|
+
function ToolResultMedia({ result }) {
|
|
260
|
+
const blocks = result?.media;
|
|
261
|
+
if (!blocks || blocks.length === 0)
|
|
262
|
+
return null;
|
|
263
|
+
const images = blocks.filter((block) => block.type === 'image');
|
|
264
|
+
if (images.length === 0)
|
|
265
|
+
return null;
|
|
266
|
+
return (_jsx("div", { className: "op-media", children: images.map((block, index) => (_jsx("img", { className: "op-media-image", src: `data:${block.mimeType};base64,${block.data}`, alt: "", style: { maxWidth: '100%', height: 'auto', display: 'block' } }, index))) }));
|
|
267
|
+
}
|
|
268
|
+
function FileErrorDetail({ result }) {
|
|
269
|
+
if (!result?.isError || !result.content.trim())
|
|
270
|
+
return null;
|
|
271
|
+
return _jsx("pre", { className: "op-output", children: truncate(result.content, 1200) });
|
|
272
|
+
}
|
|
273
|
+
function describeInput(input) {
|
|
274
|
+
if (input == null)
|
|
275
|
+
return '';
|
|
276
|
+
if (typeof input === 'string')
|
|
277
|
+
return input;
|
|
278
|
+
if (typeof input !== 'object')
|
|
279
|
+
return String(input);
|
|
280
|
+
const obj = input;
|
|
281
|
+
for (const key of ['file_path', 'path', 'pattern', 'url', 'query', 'name', 'command']) {
|
|
282
|
+
const v = obj[key];
|
|
283
|
+
if (typeof v === 'string')
|
|
284
|
+
return v;
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
return JSON.stringify(obj);
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
return '';
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function truncate(s, n) {
|
|
294
|
+
if (s.length <= n)
|
|
295
|
+
return s;
|
|
296
|
+
return s.slice(0, n - 1) + '…';
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=ToolCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolCard.js","sourceRoot":"","sources":["../../../src/react/components/ToolCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
import type { ComposerDiscoveryGroup, ComposerDiscoveryItem } from '../slots.js';
|
|
3
|
+
export interface ComposerDiscoveryMatch {
|
|
4
|
+
groupId: string;
|
|
5
|
+
groupLabel: string;
|
|
6
|
+
item: ComposerDiscoveryItem;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A parsed `/command` or `/command argument…` token, anchored to the WHOLE draft (`^...$`) —
|
|
10
|
+
* matching non-null means the draft contains nothing but the trigger, which is what keeps
|
|
11
|
+
* {@link replaceComposerSlashTrigger}'s whole-draft replacement safe with no separate span to
|
|
12
|
+
* track (verified across three independent designs in the 2026-08-12 debate: a `[start, end]`
|
|
13
|
+
* tuple is always `[0, draft.length]` under this grammar and would be dead generality).
|
|
14
|
+
*/
|
|
15
|
+
export interface ComposerSlashQuery {
|
|
16
|
+
command: string;
|
|
17
|
+
/**
|
|
18
|
+
* `null` until a separator (one or more spaces) is typed after the command word; from then on
|
|
19
|
+
* holds the verbatim trailing text — including internal spaces and slashes — never re-split.
|
|
20
|
+
*/
|
|
21
|
+
argument: string | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Open Design's active slash-token rule (`/^\/([^\s/]*)$/`), extended to admit one optional
|
|
25
|
+
* trailing argument while staying anchored end-to-end. The command segment itself is unchanged —
|
|
26
|
+
* still no internal whitespace or slash — so every existing no-argument caller parses identically
|
|
27
|
+
* to before this extension.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseComposerSlashQuery(draft: string): ComposerSlashQuery | null;
|
|
30
|
+
/**
|
|
31
|
+
* Flattens non-empty groups while preserving host order, then filters.
|
|
32
|
+
*
|
|
33
|
+
* Two modes, selected by `query.argument`: {@link matchesFuzzyCommand} while the command word is
|
|
34
|
+
* still being typed (`argument === null`), {@link matchesLockedCommand} once a separator has been
|
|
35
|
+
* typed (`argument !== null`) — see each helper's own doc for why the rule changes at that point.
|
|
36
|
+
*/
|
|
37
|
+
export declare function filterComposerDiscovery(groups: readonly ComposerDiscoveryGroup[], query: ComposerSlashQuery): ComposerDiscoveryMatch[];
|
|
38
|
+
export type ComposerSlashResolution = {
|
|
39
|
+
/**
|
|
40
|
+
* The command word is not yet complete, or a required argument hasn't been typed yet.
|
|
41
|
+
* Complete the trigger to `draft` and keep editing — no host effect fires.
|
|
42
|
+
*/
|
|
43
|
+
type: 'complete';
|
|
44
|
+
draft: string;
|
|
45
|
+
} | {
|
|
46
|
+
/** Ready to notify the host. `argument` is `undefined` for a plain macro item (no
|
|
47
|
+
* `command` declared) — its own `insertText`/`label` drives the draft as before. */
|
|
48
|
+
type: 'invoke';
|
|
49
|
+
argument?: string | null;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Decides what selecting `item` (via click, Enter, or Tab) should do against the current `draft`.
|
|
53
|
+
*
|
|
54
|
+
* A plain item (no `command`) is unaffected — always resolves to `'invoke'`, preserving today's
|
|
55
|
+
* one-step select-and-replace behavior exactly. A command-bearing item completes the trigger
|
|
56
|
+
* instead of invoking whenever invoking now would be premature or meaningless:
|
|
57
|
+
* - the typed command word is only a fuzzy/prefix match, not the declared word itself (Enter
|
|
58
|
+
* disambiguates rather than guessing which of several prefix-matched commands was meant);
|
|
59
|
+
* - the item takes an argument and none has been typed yet (no separator);
|
|
60
|
+
* - the argument is declared `required` and only whitespace follows the separator.
|
|
61
|
+
*
|
|
62
|
+
* Everything else invokes: a no-argument command the moment its exact word is typed, or an
|
|
63
|
+
* argument-taking command the moment a separator exists and (if required) the argument is
|
|
64
|
+
* non-blank.
|
|
65
|
+
*/
|
|
66
|
+
export declare function resolveComposerSlashInvocation(draft: string, item: ComposerDiscoveryItem): ComposerSlashResolution | null;
|
|
67
|
+
/** Replaces the complete active slash token; callers only invoke this after the parser matches. */
|
|
68
|
+
export declare function replaceComposerSlashTrigger(draft: string, insertText: string): string;
|
|
69
|
+
/** Adds a menu-selected resource to an existing prompt without concatenating words. */
|
|
70
|
+
export declare function appendComposerDiscovery(draft: string, insertText: string): string;
|
|
71
|
+
export type ComposerSlashKeyAction = {
|
|
72
|
+
type: 'move';
|
|
73
|
+
offset: -1 | 1;
|
|
74
|
+
} | {
|
|
75
|
+
type: 'select';
|
|
76
|
+
} | {
|
|
77
|
+
type: 'dismiss';
|
|
78
|
+
} | {
|
|
79
|
+
type: 'none';
|
|
80
|
+
};
|
|
81
|
+
/** Maps palette keys without owning React state; arrows are intentionally circular at the caller. */
|
|
82
|
+
export declare function resolveComposerSlashKeyAction(key: string, shiftKey: boolean): ComposerSlashKeyAction;
|
|
83
|
+
/** The subset of `DOMRect` the popover-positioning math below actually reads, so a caller (or a
|
|
84
|
+
* test) can pass a plain object instead of constructing every read-only `DOMRect` accessor. */
|
|
85
|
+
export interface ComposerMenuAnchorRect {
|
|
86
|
+
top: number;
|
|
87
|
+
left: number;
|
|
88
|
+
width: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Viewport-fixed position for the "+" discovery menu, anchored to `.jini-composer`'s live rect.
|
|
92
|
+
* Keeps the menu's existing left-aligned, width-capped footprint (`inset-inline-start: 8px; width:
|
|
93
|
+
* min(280px, 100vw - 32px)` in the reference stylesheet) — only the escape-the-ancestor-clip and
|
|
94
|
+
* available-space clamp from {@link verticalUpPosition} are new.
|
|
95
|
+
*
|
|
96
|
+
* @complexity Time/space: O(1).
|
|
97
|
+
*/
|
|
98
|
+
export declare function composerDiscoveryMenuPosition(composerRect: ComposerMenuAnchorRect): CSSProperties;
|
|
99
|
+
/**
|
|
100
|
+
* Viewport-fixed position for the slash-command palette, anchored to `.jini-composer`'s live
|
|
101
|
+
* rect. Keeps the palette's existing full-width-minus-insets footprint (`inset-inline: 8px` in
|
|
102
|
+
* the reference stylesheet).
|
|
103
|
+
*
|
|
104
|
+
* @complexity Time/space: O(1).
|
|
105
|
+
*/
|
|
106
|
+
export declare function composerSlashMenuPosition(composerRect: ComposerMenuAnchorRect): CSSProperties;
|
|
107
|
+
//# sourceMappingURL=composer-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-discovery.d.ts","sourceRoot":"","sources":["../../../src/react/components/composer-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEjF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,qBAAqB,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAKhF;AA0BD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,sBAAsB,EAAE,EACzC,KAAK,EAAE,kBAAkB,GACxB,sBAAsB,EAAE,CAY1B;AAED,MAAM,MAAM,uBAAuB,GAC/B;IACE;;;OAGG;IACH,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE;wFACoF;IACpF,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEN;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,qBAAqB,GAC1B,uBAAuB,GAAG,IAAI,CAgBhC;AAED,mGAAmG;AACnG,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAErF;AAED,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGjF;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,qGAAqG;AACrG,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,sBAAsB,CAMpG;AAED;gGACgG;AAChG,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAkCD;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,sBAAsB,GAAG,aAAa,CAOjG;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,sBAAsB,GAAG,aAAa,CAO7F"}
|