@blade-hq/agent-kit 0.4.1 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -0
- package/dist/{internal/core/schemas/message.d.ts → AskUserQuestionBlock-CjvG_pUY.d.ts} +48 -16
- package/dist/SkillStatusBar-DItrW2vv.d.ts +203 -0
- package/dist/blade-client-nOsdVlb1.d.ts +1498 -0
- package/dist/client/index.d.ts +8525 -0
- package/dist/client/index.js +1076 -0
- package/dist/client/index.js.map +1 -0
- package/dist/licenses-Cxl1xGVy.d.ts +16 -0
- package/dist/{internal/core/schemas/projection.d.ts → projection-DIfyh6RK.d.ts} +10 -13
- package/dist/react/api/licenses.d.ts +7 -0
- package/dist/react/api/licenses.js +1477 -0
- package/dist/react/api/licenses.js.map +1 -0
- package/dist/react/api/vibe-coding.d.ts +55 -0
- package/dist/react/api/vibe-coding.js +1503 -0
- package/dist/react/api/vibe-coding.js.map +1 -0
- package/dist/react/cards/register.d.ts +2 -0
- package/dist/react/cards/register.js +4367 -0
- package/dist/react/cards/register.js.map +1 -0
- package/dist/react/components/chat/index.d.ts +128 -0
- package/dist/react/components/chat/index.js +11389 -0
- package/dist/react/components/chat/index.js.map +1 -0
- package/dist/react/components/plan/index.d.ts +111 -0
- package/dist/react/components/plan/index.js +3490 -0
- package/dist/react/components/plan/index.js.map +1 -0
- package/dist/react/components/session/index.d.ts +53 -0
- package/dist/react/components/session/index.js +2175 -0
- package/dist/react/components/session/index.js.map +1 -0
- package/dist/react/components/workspace/index.d.ts +35 -0
- package/dist/react/components/workspace/index.js +2886 -0
- package/dist/react/components/workspace/index.js.map +1 -0
- package/dist/react/devtools/bridge-devtools/index.d.ts +36 -0
- package/dist/react/devtools/bridge-devtools/index.js +692 -0
- package/dist/react/devtools/bridge-devtools/index.js.map +1 -0
- package/dist/react/index.d.ts +1355 -0
- package/dist/react/index.js +14407 -0
- package/dist/react/index.js.map +1 -0
- package/dist/{internal/core/schemas/session.d.ts → session-CDeiO81j.d.ts} +44 -17
- package/dist/style.css +2 -0
- package/package.json +24 -15
- package/dist/client.d.ts +0 -16
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -75
- package/dist/client.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- package/dist/internal/core/api/auth-resolve.d.ts +0 -10
- package/dist/internal/core/api/auth-resolve.d.ts.map +0 -1
- package/dist/internal/core/api/auth-resolve.js +0 -25
- package/dist/internal/core/api/auth-resolve.js.map +0 -1
- package/dist/internal/core/api/auth.d.ts +0 -22
- package/dist/internal/core/api/auth.d.ts.map +0 -1
- package/dist/internal/core/api/auth.js +0 -13
- package/dist/internal/core/api/auth.js.map +0 -1
- package/dist/internal/core/api/client.d.ts +0 -20
- package/dist/internal/core/api/client.d.ts.map +0 -1
- package/dist/internal/core/api/client.js +0 -135
- package/dist/internal/core/api/client.js.map +0 -1
- package/dist/internal/core/api/gis-api.d.ts +0 -4
- package/dist/internal/core/api/gis-api.d.ts.map +0 -1
- package/dist/internal/core/api/gis-api.js +0 -8
- package/dist/internal/core/api/gis-api.js.map +0 -1
- package/dist/internal/core/api/licenses.d.ts +0 -26
- package/dist/internal/core/api/licenses.d.ts.map +0 -1
- package/dist/internal/core/api/licenses.js +0 -40
- package/dist/internal/core/api/licenses.js.map +0 -1
- package/dist/internal/core/api/memories.d.ts +0 -46
- package/dist/internal/core/api/memories.d.ts.map +0 -1
- package/dist/internal/core/api/memories.js +0 -49
- package/dist/internal/core/api/memories.js.map +0 -1
- package/dist/internal/core/api/models.d.ts +0 -15
- package/dist/internal/core/api/models.d.ts.map +0 -1
- package/dist/internal/core/api/models.js +0 -15
- package/dist/internal/core/api/models.js.map +0 -1
- package/dist/internal/core/api/partner-skill.d.ts +0 -3
- package/dist/internal/core/api/partner-skill.d.ts.map +0 -1
- package/dist/internal/core/api/partner-skill.js +0 -9
- package/dist/internal/core/api/partner-skill.js.map +0 -1
- package/dist/internal/core/api/registry.d.ts +0 -272
- package/dist/internal/core/api/registry.d.ts.map +0 -1
- package/dist/internal/core/api/registry.js +0 -67
- package/dist/internal/core/api/registry.js.map +0 -1
- package/dist/internal/core/api/scenarios.d.ts +0 -51
- package/dist/internal/core/api/scenarios.d.ts.map +0 -1
- package/dist/internal/core/api/scenarios.js +0 -30
- package/dist/internal/core/api/scenarios.js.map +0 -1
- package/dist/internal/core/api/sessions.d.ts +0 -223
- package/dist/internal/core/api/sessions.d.ts.map +0 -1
- package/dist/internal/core/api/sessions.js +0 -340
- package/dist/internal/core/api/sessions.js.map +0 -1
- package/dist/internal/core/api/skills.d.ts +0 -19
- package/dist/internal/core/api/skills.d.ts.map +0 -1
- package/dist/internal/core/api/skills.js +0 -28
- package/dist/internal/core/api/skills.js.map +0 -1
- package/dist/internal/core/api/socket.d.ts +0 -56
- package/dist/internal/core/api/socket.d.ts.map +0 -1
- package/dist/internal/core/api/socket.js +0 -824
- package/dist/internal/core/api/socket.js.map +0 -1
- package/dist/internal/core/api/software-factory.d.ts +0 -126
- package/dist/internal/core/api/software-factory.d.ts.map +0 -1
- package/dist/internal/core/api/software-factory.js +0 -130
- package/dist/internal/core/api/software-factory.js.map +0 -1
- package/dist/internal/core/api/solutions.d.ts +0 -5
- package/dist/internal/core/api/solutions.d.ts.map +0 -1
- package/dist/internal/core/api/solutions.js +0 -21
- package/dist/internal/core/api/solutions.js.map +0 -1
- package/dist/internal/core/api/user-preferences.d.ts +0 -3
- package/dist/internal/core/api/user-preferences.d.ts.map +0 -1
- package/dist/internal/core/api/user-preferences.js +0 -12
- package/dist/internal/core/api/user-preferences.js.map +0 -1
- package/dist/internal/core/api/vibe-coding.d.ts +0 -90
- package/dist/internal/core/api/vibe-coding.d.ts.map +0 -1
- package/dist/internal/core/api/vibe-coding.js +0 -121
- package/dist/internal/core/api/vibe-coding.js.map +0 -1
- package/dist/internal/core/asr/VoiceWaveform.d.ts +0 -11
- package/dist/internal/core/asr/VoiceWaveform.d.ts.map +0 -1
- package/dist/internal/core/asr/VoiceWaveform.js +0 -28
- package/dist/internal/core/asr/VoiceWaveform.js.map +0 -1
- package/dist/internal/core/asr/use-tiptap-voice-input.d.ts +0 -30
- package/dist/internal/core/asr/use-tiptap-voice-input.d.ts.map +0 -1
- package/dist/internal/core/asr/use-tiptap-voice-input.js +0 -100
- package/dist/internal/core/asr/use-tiptap-voice-input.js.map +0 -1
- package/dist/internal/core/asr/use-voice-input.d.ts +0 -18
- package/dist/internal/core/asr/use-voice-input.d.ts.map +0 -1
- package/dist/internal/core/asr/use-voice-input.js +0 -312
- package/dist/internal/core/asr/use-voice-input.js.map +0 -1
- package/dist/internal/core/asr/voice-input-support.d.ts +0 -6
- package/dist/internal/core/asr/voice-input-support.d.ts.map +0 -1
- package/dist/internal/core/asr/voice-input-support.js +0 -35
- package/dist/internal/core/asr/voice-input-support.js.map +0 -1
- package/dist/internal/core/components/ai-elements/file-tree.d.ts +0 -27
- package/dist/internal/core/components/ai-elements/file-tree.d.ts.map +0 -1
- package/dist/internal/core/components/ai-elements/file-tree.js +0 -73
- package/dist/internal/core/components/ai-elements/file-tree.js.map +0 -1
- package/dist/internal/core/components/ai-elements/reasoning.d.ts +0 -33
- package/dist/internal/core/components/ai-elements/reasoning.d.ts.map +0 -1
- package/dist/internal/core/components/ai-elements/reasoning.js +0 -124
- package/dist/internal/core/components/ai-elements/reasoning.js.map +0 -1
- package/dist/internal/core/components/ai-elements/shimmer.d.ts +0 -10
- package/dist/internal/core/components/ai-elements/shimmer.d.ts.map +0 -1
- package/dist/internal/core/components/ai-elements/shimmer.js +0 -29
- package/dist/internal/core/components/ai-elements/shimmer.js.map +0 -1
- package/dist/internal/core/components/card/CardCodeBlock.d.ts +0 -6
- package/dist/internal/core/components/card/CardCodeBlock.d.ts.map +0 -1
- package/dist/internal/core/components/card/CardCodeBlock.js +0 -24
- package/dist/internal/core/components/card/CardCodeBlock.js.map +0 -1
- package/dist/internal/core/components/card/CardContext.d.ts +0 -8
- package/dist/internal/core/components/card/CardContext.d.ts.map +0 -1
- package/dist/internal/core/components/card/CardContext.js +0 -4
- package/dist/internal/core/components/card/CardContext.js.map +0 -1
- package/dist/internal/core/components/card/CardRenderer.d.ts +0 -8
- package/dist/internal/core/components/card/CardRenderer.d.ts.map +0 -1
- package/dist/internal/core/components/card/CardRenderer.js +0 -82
- package/dist/internal/core/components/card/CardRenderer.js.map +0 -1
- package/dist/internal/core/components/card/CardStates.d.ts +0 -9
- package/dist/internal/core/components/card/CardStates.d.ts.map +0 -1
- package/dist/internal/core/components/card/CardStates.js +0 -11
- package/dist/internal/core/components/card/CardStates.js.map +0 -1
- package/dist/internal/core/components/card/cards/attraction-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/attraction-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/attraction-card.js +0 -10
- package/dist/internal/core/components/card/cards/attraction-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/cite-card.d.ts +0 -11
- package/dist/internal/core/components/card/cards/cite-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/cite-card.js +0 -12
- package/dist/internal/core/components/card/cards/cite-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/comprehensive-analysis-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/comprehensive-analysis-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/comprehensive-analysis-card.js +0 -160
- package/dist/internal/core/components/card/cards/comprehensive-analysis-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/conflict-detection-card.d.ts +0 -5
- package/dist/internal/core/components/card/cards/conflict-detection-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/conflict-detection-card.js +0 -46
- package/dist/internal/core/components/card/cards/conflict-detection-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/counter.d.ts +0 -3
- package/dist/internal/core/components/card/cards/counter.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/counter.js +0 -10
- package/dist/internal/core/components/card/cards/counter.js.map +0 -1
- package/dist/internal/core/components/card/cards/damage-effect-card.d.ts +0 -5
- package/dist/internal/core/components/card/cards/damage-effect-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/damage-effect-card.js +0 -138
- package/dist/internal/core/components/card/cards/damage-effect-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/destination-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/destination-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/destination-card.js +0 -10
- package/dist/internal/core/components/card/cards/destination-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/diff-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/diff-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/diff-card.js +0 -81
- package/dist/internal/core/components/card/cards/diff-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/execution-order-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/execution-order-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/execution-order-card.js +0 -97
- package/dist/internal/core/components/card/cards/execution-order-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/experience-card-with-options.d.ts +0 -5
- package/dist/internal/core/components/card/cards/experience-card-with-options.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/experience-card-with-options.js +0 -113
- package/dist/internal/core/components/card/cards/experience-card-with-options.js.map +0 -1
- package/dist/internal/core/components/card/cards/flight-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/flight-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/flight-card.js +0 -10
- package/dist/internal/core/components/card/cards/flight-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/hotel-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/hotel-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/hotel-card.js +0 -10
- package/dist/internal/core/components/card/cards/hotel-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/kill-chain-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/kill-chain-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/kill-chain-card.js +0 -230
- package/dist/internal/core/components/card/cards/kill-chain-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/kill-chain-types.d.ts +0 -158
- package/dist/internal/core/components/card/cards/kill-chain-types.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/kill-chain-types.js +0 -9
- package/dist/internal/core/components/card/cards/kill-chain-types.js.map +0 -1
- package/dist/internal/core/components/card/cards/map-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/map-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/map-card.js +0 -60
- package/dist/internal/core/components/card/cards/map-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/order-status-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/order-status-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/order-status-card.js +0 -57
- package/dist/internal/core/components/card/cards/order-status-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/patch-card.d.ts +0 -16
- package/dist/internal/core/components/card/cards/patch-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/patch-card.js +0 -47
- package/dist/internal/core/components/card/cards/patch-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/product-recommendation-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/product-recommendation-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/product-recommendation-card.js +0 -18
- package/dist/internal/core/components/card/cards/product-recommendation-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/reflection-optimization-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/reflection-optimization-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/reflection-optimization-card.js +0 -51
- package/dist/internal/core/components/card/cards/reflection-optimization-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/resolution-modifications-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/resolution-modifications-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/resolution-modifications-card.js +0 -85
- package/dist/internal/core/components/card/cards/resolution-modifications-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/resolution-summary-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/resolution-summary-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/resolution-summary-card.js +0 -55
- package/dist/internal/core/components/card/cards/resolution-summary-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/restaurant-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/restaurant-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/restaurant-card.js +0 -10
- package/dist/internal/core/components/card/cards/restaurant-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/shopping-list-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/shopping-list-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/shopping-list-card.js +0 -17
- package/dist/internal/core/components/card/cards/shopping-list-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/simulation-event-card.d.ts +0 -5
- package/dist/internal/core/components/card/cards/simulation-event-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/simulation-event-card.js +0 -116
- package/dist/internal/core/components/card/cards/simulation-event-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/survival-effect-card.d.ts +0 -5
- package/dist/internal/core/components/card/cards/survival-effect-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/survival-effect-card.js +0 -76
- package/dist/internal/core/components/card/cards/survival-effect-card.js.map +0 -1
- package/dist/internal/core/components/card/cards/travel-itinerary-card.d.ts +0 -3
- package/dist/internal/core/components/card/cards/travel-itinerary-card.d.ts.map +0 -1
- package/dist/internal/core/components/card/cards/travel-itinerary-card.js +0 -16
- package/dist/internal/core/components/card/cards/travel-itinerary-card.js.map +0 -1
- package/dist/internal/core/components/card/register.d.ts +0 -2
- package/dist/internal/core/components/card/register.d.ts.map +0 -1
- package/dist/internal/core/components/card/register.js +0 -64
- package/dist/internal/core/components/card/register.js.map +0 -1
- package/dist/internal/core/components/chat/AgentLoopBlock.d.ts +0 -9
- package/dist/internal/core/components/chat/AgentLoopBlock.d.ts.map +0 -1
- package/dist/internal/core/components/chat/AgentLoopBlock.js +0 -174
- package/dist/internal/core/components/chat/AgentLoopBlock.js.map +0 -1
- package/dist/internal/core/components/chat/AskUserQuestionBlock.d.ts +0 -33
- package/dist/internal/core/components/chat/AskUserQuestionBlock.d.ts.map +0 -1
- package/dist/internal/core/components/chat/AskUserQuestionBlock.js +0 -178
- package/dist/internal/core/components/chat/AskUserQuestionBlock.js.map +0 -1
- package/dist/internal/core/components/chat/AssistantTurnBlock.d.ts +0 -17
- package/dist/internal/core/components/chat/AssistantTurnBlock.d.ts.map +0 -1
- package/dist/internal/core/components/chat/AssistantTurnBlock.js +0 -181
- package/dist/internal/core/components/chat/AssistantTurnBlock.js.map +0 -1
- package/dist/internal/core/components/chat/AttachmentPreviewDialog.d.ts +0 -27
- package/dist/internal/core/components/chat/AttachmentPreviewDialog.d.ts.map +0 -1
- package/dist/internal/core/components/chat/AttachmentPreviewDialog.js +0 -64
- package/dist/internal/core/components/chat/AttachmentPreviewDialog.js.map +0 -1
- package/dist/internal/core/components/chat/ChatInput.d.ts +0 -65
- package/dist/internal/core/components/chat/ChatInput.d.ts.map +0 -1
- package/dist/internal/core/components/chat/ChatInput.js +0 -1127
- package/dist/internal/core/components/chat/ChatInput.js.map +0 -1
- package/dist/internal/core/components/chat/ChatView.d.ts +0 -14
- package/dist/internal/core/components/chat/ChatView.d.ts.map +0 -1
- package/dist/internal/core/components/chat/ChatView.js +0 -28
- package/dist/internal/core/components/chat/ChatView.js.map +0 -1
- package/dist/internal/core/components/chat/CompactionCard.d.ts +0 -7
- package/dist/internal/core/components/chat/CompactionCard.d.ts.map +0 -1
- package/dist/internal/core/components/chat/CompactionCard.js +0 -82
- package/dist/internal/core/components/chat/CompactionCard.js.map +0 -1
- package/dist/internal/core/components/chat/ConnectionBanner.d.ts +0 -2
- package/dist/internal/core/components/chat/ConnectionBanner.d.ts.map +0 -1
- package/dist/internal/core/components/chat/ConnectionBanner.js +0 -37
- package/dist/internal/core/components/chat/ConnectionBanner.js.map +0 -1
- package/dist/internal/core/components/chat/FileCompletionMenu.d.ts +0 -14
- package/dist/internal/core/components/chat/FileCompletionMenu.d.ts.map +0 -1
- package/dist/internal/core/components/chat/FileCompletionMenu.js +0 -163
- package/dist/internal/core/components/chat/FileCompletionMenu.js.map +0 -1
- package/dist/internal/core/components/chat/FileSizeLimitDialog.d.ts +0 -10
- package/dist/internal/core/components/chat/FileSizeLimitDialog.d.ts.map +0 -1
- package/dist/internal/core/components/chat/FileSizeLimitDialog.js +0 -30
- package/dist/internal/core/components/chat/FileSizeLimitDialog.js.map +0 -1
- package/dist/internal/core/components/chat/ImageLightbox.d.ts +0 -12
- package/dist/internal/core/components/chat/ImageLightbox.d.ts.map +0 -1
- package/dist/internal/core/components/chat/ImageLightbox.js +0 -140
- package/dist/internal/core/components/chat/ImageLightbox.js.map +0 -1
- package/dist/internal/core/components/chat/MessageActions.d.ts +0 -7
- package/dist/internal/core/components/chat/MessageActions.d.ts.map +0 -1
- package/dist/internal/core/components/chat/MessageActions.js +0 -18
- package/dist/internal/core/components/chat/MessageActions.js.map +0 -1
- package/dist/internal/core/components/chat/MessageContextPills.d.ts +0 -7
- package/dist/internal/core/components/chat/MessageContextPills.d.ts.map +0 -1
- package/dist/internal/core/components/chat/MessageContextPills.js +0 -8
- package/dist/internal/core/components/chat/MessageContextPills.js.map +0 -1
- package/dist/internal/core/components/chat/MessageFileAttachmentList.d.ts +0 -14
- package/dist/internal/core/components/chat/MessageFileAttachmentList.d.ts.map +0 -1
- package/dist/internal/core/components/chat/MessageFileAttachmentList.js +0 -38
- package/dist/internal/core/components/chat/MessageFileAttachmentList.js.map +0 -1
- package/dist/internal/core/components/chat/MessageList.d.ts +0 -12
- package/dist/internal/core/components/chat/MessageList.d.ts.map +0 -1
- package/dist/internal/core/components/chat/MessageList.js +0 -315
- package/dist/internal/core/components/chat/MessageList.js.map +0 -1
- package/dist/internal/core/components/chat/ProgressCircle.d.ts +0 -13
- package/dist/internal/core/components/chat/ProgressCircle.d.ts.map +0 -1
- package/dist/internal/core/components/chat/ProgressCircle.js +0 -28
- package/dist/internal/core/components/chat/ProgressCircle.js.map +0 -1
- package/dist/internal/core/components/chat/RenderErrorBoundary.d.ts +0 -20
- package/dist/internal/core/components/chat/RenderErrorBoundary.d.ts.map +0 -1
- package/dist/internal/core/components/chat/RenderErrorBoundary.js +0 -39
- package/dist/internal/core/components/chat/RenderErrorBoundary.js.map +0 -1
- package/dist/internal/core/components/chat/ResourceIframe.d.ts +0 -6
- package/dist/internal/core/components/chat/ResourceIframe.d.ts.map +0 -1
- package/dist/internal/core/components/chat/ResourceIframe.js +0 -124
- package/dist/internal/core/components/chat/ResourceIframe.js.map +0 -1
- package/dist/internal/core/components/chat/Shimmer.d.ts +0 -7
- package/dist/internal/core/components/chat/Shimmer.d.ts.map +0 -1
- package/dist/internal/core/components/chat/Shimmer.js +0 -6
- package/dist/internal/core/components/chat/Shimmer.js.map +0 -1
- package/dist/internal/core/components/chat/SkillCompletionMenu.d.ts +0 -10
- package/dist/internal/core/components/chat/SkillCompletionMenu.d.ts.map +0 -1
- package/dist/internal/core/components/chat/SkillCompletionMenu.js +0 -65
- package/dist/internal/core/components/chat/SkillCompletionMenu.js.map +0 -1
- package/dist/internal/core/components/chat/SkillStatusBar.d.ts +0 -7
- package/dist/internal/core/components/chat/SkillStatusBar.d.ts.map +0 -1
- package/dist/internal/core/components/chat/SkillStatusBar.js +0 -113
- package/dist/internal/core/components/chat/SkillStatusBar.js.map +0 -1
- package/dist/internal/core/components/chat/StickyStatusBar.d.ts +0 -11
- package/dist/internal/core/components/chat/StickyStatusBar.d.ts.map +0 -1
- package/dist/internal/core/components/chat/StickyStatusBar.js +0 -115
- package/dist/internal/core/components/chat/StickyStatusBar.js.map +0 -1
- package/dist/internal/core/components/chat/TextAttachmentPills.d.ts +0 -11
- package/dist/internal/core/components/chat/TextAttachmentPills.d.ts.map +0 -1
- package/dist/internal/core/components/chat/TextAttachmentPills.js +0 -35
- package/dist/internal/core/components/chat/TextAttachmentPills.js.map +0 -1
- package/dist/internal/core/components/chat/ToolCallBlock.d.ts +0 -17
- package/dist/internal/core/components/chat/ToolCallBlock.d.ts.map +0 -1
- package/dist/internal/core/components/chat/ToolCallBlock.js +0 -172
- package/dist/internal/core/components/chat/ToolCallBlock.js.map +0 -1
- package/dist/internal/core/components/chat/TurnNavRail.d.ts +0 -12
- package/dist/internal/core/components/chat/TurnNavRail.d.ts.map +0 -1
- package/dist/internal/core/components/chat/TurnNavRail.js +0 -14
- package/dist/internal/core/components/chat/TurnNavRail.js.map +0 -1
- package/dist/internal/core/components/chat/UserMessageBubble.d.ts +0 -18
- package/dist/internal/core/components/chat/UserMessageBubble.d.ts.map +0 -1
- package/dist/internal/core/components/chat/UserMessageBubble.js +0 -130
- package/dist/internal/core/components/chat/UserMessageBubble.js.map +0 -1
- package/dist/internal/core/components/chat/WhatIfUserBubble.d.ts +0 -14
- package/dist/internal/core/components/chat/WhatIfUserBubble.d.ts.map +0 -1
- package/dist/internal/core/components/chat/WhatIfUserBubble.js +0 -20
- package/dist/internal/core/components/chat/WhatIfUserBubble.js.map +0 -1
- package/dist/internal/core/components/chat/display-utils.d.ts +0 -36
- package/dist/internal/core/components/chat/display-utils.d.ts.map +0 -1
- package/dist/internal/core/components/chat/display-utils.js +0 -533
- package/dist/internal/core/components/chat/display-utils.js.map +0 -1
- package/dist/internal/core/components/chat/extensions/file-mention.d.ts +0 -13
- package/dist/internal/core/components/chat/extensions/file-mention.d.ts.map +0 -1
- package/dist/internal/core/components/chat/extensions/file-mention.js +0 -52
- package/dist/internal/core/components/chat/extensions/file-mention.js.map +0 -1
- package/dist/internal/core/components/chat/extensions/skill-mention.d.ts +0 -26
- package/dist/internal/core/components/chat/extensions/skill-mention.d.ts.map +0 -1
- package/dist/internal/core/components/chat/extensions/skill-mention.js +0 -72
- package/dist/internal/core/components/chat/extensions/skill-mention.js.map +0 -1
- package/dist/internal/core/components/chat/index.d.ts +0 -15
- package/dist/internal/core/components/chat/index.d.ts.map +0 -1
- package/dist/internal/core/components/chat/index.js +0 -15
- package/dist/internal/core/components/chat/index.js.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/BashRenderer.d.ts +0 -3
- package/dist/internal/core/components/chat/tool-renderers/BashRenderer.d.ts.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/BashRenderer.js +0 -52
- package/dist/internal/core/components/chat/tool-renderers/BashRenderer.js.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/FileEditRenderer.d.ts +0 -3
- package/dist/internal/core/components/chat/tool-renderers/FileEditRenderer.d.ts.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/FileEditRenderer.js +0 -108
- package/dist/internal/core/components/chat/tool-renderers/FileEditRenderer.js.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/FileReadRenderer.d.ts +0 -3
- package/dist/internal/core/components/chat/tool-renderers/FileReadRenderer.d.ts.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/FileReadRenderer.js +0 -75
- package/dist/internal/core/components/chat/tool-renderers/FileReadRenderer.js.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/SearchRenderer.d.ts +0 -3
- package/dist/internal/core/components/chat/tool-renderers/SearchRenderer.d.ts.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/SearchRenderer.js +0 -96
- package/dist/internal/core/components/chat/tool-renderers/SearchRenderer.js.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/registry.d.ts +0 -10
- package/dist/internal/core/components/chat/tool-renderers/registry.d.ts.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/registry.js +0 -21
- package/dist/internal/core/components/chat/tool-renderers/registry.js.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/shared.d.ts +0 -27
- package/dist/internal/core/components/chat/tool-renderers/shared.d.ts.map +0 -1
- package/dist/internal/core/components/chat/tool-renderers/shared.js +0 -116
- package/dist/internal/core/components/chat/tool-renderers/shared.js.map +0 -1
- package/dist/internal/core/components/chat/whatif-quote-context.d.ts +0 -16
- package/dist/internal/core/components/chat/whatif-quote-context.d.ts.map +0 -1
- package/dist/internal/core/components/chat/whatif-quote-context.js +0 -16
- package/dist/internal/core/components/chat/whatif-quote-context.js.map +0 -1
- package/dist/internal/core/components/markdown/MarkdownContent.d.ts +0 -10
- package/dist/internal/core/components/markdown/MarkdownContent.d.ts.map +0 -1
- package/dist/internal/core/components/markdown/MarkdownContent.js +0 -95
- package/dist/internal/core/components/markdown/MarkdownContent.js.map +0 -1
- package/dist/internal/core/components/model/ModelSelector.d.ts +0 -10
- package/dist/internal/core/components/model/ModelSelector.d.ts.map +0 -1
- package/dist/internal/core/components/model/ModelSelector.js +0 -48
- package/dist/internal/core/components/model/ModelSelector.js.map +0 -1
- package/dist/internal/core/components/plan/PlanSummaryCard.d.ts +0 -9
- package/dist/internal/core/components/plan/PlanSummaryCard.d.ts.map +0 -1
- package/dist/internal/core/components/plan/PlanSummaryCard.js +0 -75
- package/dist/internal/core/components/plan/PlanSummaryCard.js.map +0 -1
- package/dist/internal/core/components/plan/PlanVisualization.d.ts +0 -14
- package/dist/internal/core/components/plan/PlanVisualization.d.ts.map +0 -1
- package/dist/internal/core/components/plan/PlanVisualization.js +0 -82
- package/dist/internal/core/components/plan/PlanVisualization.js.map +0 -1
- package/dist/internal/core/components/plan/debug-log.d.ts +0 -22
- package/dist/internal/core/components/plan/debug-log.d.ts.map +0 -1
- package/dist/internal/core/components/plan/debug-log.js +0 -47
- package/dist/internal/core/components/plan/debug-log.js.map +0 -1
- package/dist/internal/core/components/plan/extract-plan-messages.d.ts +0 -3
- package/dist/internal/core/components/plan/extract-plan-messages.d.ts.map +0 -1
- package/dist/internal/core/components/plan/extract-plan-messages.js +0 -59
- package/dist/internal/core/components/plan/extract-plan-messages.js.map +0 -1
- package/dist/internal/core/components/plan/index.d.ts +0 -7
- package/dist/internal/core/components/plan/index.d.ts.map +0 -1
- package/dist/internal/core/components/plan/index.js +0 -6
- package/dist/internal/core/components/plan/index.js.map +0 -1
- package/dist/internal/core/components/plan/parse-plan-messages.d.ts +0 -12
- package/dist/internal/core/components/plan/parse-plan-messages.d.ts.map +0 -1
- package/dist/internal/core/components/plan/parse-plan-messages.js +0 -272
- package/dist/internal/core/components/plan/parse-plan-messages.js.map +0 -1
- package/dist/internal/core/components/plan/parse-plan-tree.d.ts +0 -17
- package/dist/internal/core/components/plan/parse-plan-tree.d.ts.map +0 -1
- package/dist/internal/core/components/plan/parse-plan-tree.js +0 -117
- package/dist/internal/core/components/plan/parse-plan-tree.js.map +0 -1
- package/dist/internal/core/components/plan/phases/PlanMindMap.d.ts +0 -9
- package/dist/internal/core/components/plan/phases/PlanMindMap.d.ts.map +0 -1
- package/dist/internal/core/components/plan/phases/PlanMindMap.js +0 -42
- package/dist/internal/core/components/plan/phases/PlanMindMap.js.map +0 -1
- package/dist/internal/core/components/plan/phases/PlanStatusIcon.d.ts +0 -6
- package/dist/internal/core/components/plan/phases/PlanStatusIcon.d.ts.map +0 -1
- package/dist/internal/core/components/plan/phases/PlanStatusIcon.js +0 -15
- package/dist/internal/core/components/plan/phases/PlanStatusIcon.js.map +0 -1
- package/dist/internal/core/components/plan/phases/PlanTree.d.ts +0 -9
- package/dist/internal/core/components/plan/phases/PlanTree.d.ts.map +0 -1
- package/dist/internal/core/components/plan/phases/PlanTree.js +0 -55
- package/dist/internal/core/components/plan/phases/PlanTree.js.map +0 -1
- package/dist/internal/core/components/plan/phases/SkillAnalysis.d.ts +0 -8
- package/dist/internal/core/components/plan/phases/SkillAnalysis.d.ts.map +0 -1
- package/dist/internal/core/components/plan/phases/SkillAnalysis.js +0 -22
- package/dist/internal/core/components/plan/phases/SkillAnalysis.js.map +0 -1
- package/dist/internal/core/components/plan/phases/SkillDiscovery.d.ts +0 -11
- package/dist/internal/core/components/plan/phases/SkillDiscovery.d.ts.map +0 -1
- package/dist/internal/core/components/plan/phases/SkillDiscovery.js +0 -52
- package/dist/internal/core/components/plan/phases/SkillDiscovery.js.map +0 -1
- package/dist/internal/core/components/plan/types.d.ts +0 -57
- package/dist/internal/core/components/plan/types.d.ts.map +0 -1
- package/dist/internal/core/components/plan/types.js +0 -2
- package/dist/internal/core/components/plan/types.js.map +0 -1
- package/dist/internal/core/components/session/SessionDetail.d.ts +0 -9
- package/dist/internal/core/components/session/SessionDetail.d.ts.map +0 -1
- package/dist/internal/core/components/session/SessionDetail.js +0 -248
- package/dist/internal/core/components/session/SessionDetail.js.map +0 -1
- package/dist/internal/core/components/session/SessionList.d.ts +0 -10
- package/dist/internal/core/components/session/SessionList.d.ts.map +0 -1
- package/dist/internal/core/components/session/SessionList.js +0 -28
- package/dist/internal/core/components/session/SessionList.js.map +0 -1
- package/dist/internal/core/components/session/SessionListItem.d.ts +0 -9
- package/dist/internal/core/components/session/SessionListItem.d.ts.map +0 -1
- package/dist/internal/core/components/session/SessionListItem.js +0 -10
- package/dist/internal/core/components/session/SessionListItem.js.map +0 -1
- package/dist/internal/core/components/session/StatusBadge.d.ts +0 -4
- package/dist/internal/core/components/session/StatusBadge.d.ts.map +0 -1
- package/dist/internal/core/components/session/StatusBadge.js +0 -47
- package/dist/internal/core/components/session/StatusBadge.js.map +0 -1
- package/dist/internal/core/components/session/index.d.ts +0 -6
- package/dist/internal/core/components/session/index.d.ts.map +0 -1
- package/dist/internal/core/components/session/index.js +0 -6
- package/dist/internal/core/components/session/index.js.map +0 -1
- package/dist/internal/core/components/session/session-utils.d.ts +0 -20
- package/dist/internal/core/components/session/session-utils.d.ts.map +0 -1
- package/dist/internal/core/components/session/session-utils.js +0 -130
- package/dist/internal/core/components/session/session-utils.js.map +0 -1
- package/dist/internal/core/components/ui/collapsible.d.ts +0 -6
- package/dist/internal/core/components/ui/collapsible.d.ts.map +0 -1
- package/dist/internal/core/components/ui/collapsible.js +0 -13
- package/dist/internal/core/components/ui/collapsible.js.map +0 -1
- package/dist/internal/core/components/workspace/FileTree.d.ts +0 -14
- package/dist/internal/core/components/workspace/FileTree.d.ts.map +0 -1
- package/dist/internal/core/components/workspace/FileTree.js +0 -521
- package/dist/internal/core/components/workspace/FileTree.js.map +0 -1
- package/dist/internal/core/components/workspace/WorkspaceFilesPanel.d.ts +0 -20
- package/dist/internal/core/components/workspace/WorkspaceFilesPanel.d.ts.map +0 -1
- package/dist/internal/core/components/workspace/WorkspaceFilesPanel.js +0 -142
- package/dist/internal/core/components/workspace/WorkspaceFilesPanel.js.map +0 -1
- package/dist/internal/core/components/workspace/index.d.ts +0 -3
- package/dist/internal/core/components/workspace/index.d.ts.map +0 -1
- package/dist/internal/core/components/workspace/index.js +0 -3
- package/dist/internal/core/components/workspace/index.js.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/BridgeDevtoolsFab.d.ts +0 -2
- package/dist/internal/core/devtools/bridge-devtools/BridgeDevtoolsFab.d.ts.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/BridgeDevtoolsFab.js +0 -306
- package/dist/internal/core/devtools/bridge-devtools/BridgeDevtoolsFab.js.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/index.d.ts +0 -4
- package/dist/internal/core/devtools/bridge-devtools/index.d.ts.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/index.js +0 -3
- package/dist/internal/core/devtools/bridge-devtools/index.js.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/mount.d.ts +0 -2
- package/dist/internal/core/devtools/bridge-devtools/mount.d.ts.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/mount.js +0 -24
- package/dist/internal/core/devtools/bridge-devtools/mount.js.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/store.d.ts +0 -16
- package/dist/internal/core/devtools/bridge-devtools/store.d.ts.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/store.js +0 -37
- package/dist/internal/core/devtools/bridge-devtools/store.js.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/tap.d.ts +0 -6
- package/dist/internal/core/devtools/bridge-devtools/tap.d.ts.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/tap.js +0 -58
- package/dist/internal/core/devtools/bridge-devtools/tap.js.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/types.d.ts +0 -30
- package/dist/internal/core/devtools/bridge-devtools/types.d.ts.map +0 -1
- package/dist/internal/core/devtools/bridge-devtools/types.js +0 -2
- package/dist/internal/core/devtools/bridge-devtools/types.js.map +0 -1
- package/dist/internal/core/hooks/use-background-tasks.d.ts +0 -8
- package/dist/internal/core/hooks/use-background-tasks.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-background-tasks.js +0 -23
- package/dist/internal/core/hooks/use-background-tasks.js.map +0 -1
- package/dist/internal/core/hooks/use-card-state.d.ts +0 -2
- package/dist/internal/core/hooks/use-card-state.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-card-state.js +0 -22
- package/dist/internal/core/hooks/use-card-state.js.map +0 -1
- package/dist/internal/core/hooks/use-chat.d.ts +0 -11
- package/dist/internal/core/hooks/use-chat.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-chat.js +0 -68
- package/dist/internal/core/hooks/use-chat.js.map +0 -1
- package/dist/internal/core/hooks/use-check-skill-file.d.ts +0 -5
- package/dist/internal/core/hooks/use-check-skill-file.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-check-skill-file.js +0 -26
- package/dist/internal/core/hooks/use-check-skill-file.js.map +0 -1
- package/dist/internal/core/hooks/use-context-stats.d.ts +0 -8
- package/dist/internal/core/hooks/use-context-stats.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-context-stats.js +0 -22
- package/dist/internal/core/hooks/use-context-stats.js.map +0 -1
- package/dist/internal/core/hooks/use-gis.d.ts +0 -18
- package/dist/internal/core/hooks/use-gis.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-gis.js +0 -52
- package/dist/internal/core/hooks/use-gis.js.map +0 -1
- package/dist/internal/core/hooks/use-global-skill-stats.d.ts +0 -7
- package/dist/internal/core/hooks/use-global-skill-stats.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-global-skill-stats.js +0 -20
- package/dist/internal/core/hooks/use-global-skill-stats.js.map +0 -1
- package/dist/internal/core/hooks/use-input-history.d.ts +0 -8
- package/dist/internal/core/hooks/use-input-history.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-input-history.js +0 -90
- package/dist/internal/core/hooks/use-input-history.js.map +0 -1
- package/dist/internal/core/hooks/use-registry.d.ts +0 -54
- package/dist/internal/core/hooks/use-registry.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-registry.js +0 -35
- package/dist/internal/core/hooks/use-registry.js.map +0 -1
- package/dist/internal/core/hooks/use-session.d.ts +0 -11
- package/dist/internal/core/hooks/use-session.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-session.js +0 -22
- package/dist/internal/core/hooks/use-session.js.map +0 -1
- package/dist/internal/core/hooks/use-skill-stats.d.ts +0 -8
- package/dist/internal/core/hooks/use-skill-stats.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-skill-stats.js +0 -24
- package/dist/internal/core/hooks/use-skill-stats.js.map +0 -1
- package/dist/internal/core/hooks/use-skills.d.ts +0 -7
- package/dist/internal/core/hooks/use-skills.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-skills.js +0 -11
- package/dist/internal/core/hooks/use-skills.js.map +0 -1
- package/dist/internal/core/hooks/use-token-pressure.d.ts +0 -7
- package/dist/internal/core/hooks/use-token-pressure.d.ts.map +0 -1
- package/dist/internal/core/hooks/use-token-pressure.js +0 -28
- package/dist/internal/core/hooks/use-token-pressure.js.map +0 -1
- package/dist/internal/core/index.d.ts +0 -99
- package/dist/internal/core/index.d.ts.map +0 -1
- package/dist/internal/core/index.js +0 -83
- package/dist/internal/core/index.js.map +0 -1
- package/dist/internal/core/lib/analytics.d.ts +0 -8
- package/dist/internal/core/lib/analytics.d.ts.map +0 -1
- package/dist/internal/core/lib/analytics.js +0 -8
- package/dist/internal/core/lib/analytics.js.map +0 -1
- package/dist/internal/core/lib/attachment-upload.d.ts +0 -11
- package/dist/internal/core/lib/attachment-upload.d.ts.map +0 -1
- package/dist/internal/core/lib/attachment-upload.js +0 -26
- package/dist/internal/core/lib/attachment-upload.js.map +0 -1
- package/dist/internal/core/lib/card-registry.d.ts +0 -36
- package/dist/internal/core/lib/card-registry.d.ts.map +0 -1
- package/dist/internal/core/lib/card-registry.js +0 -67
- package/dist/internal/core/lib/card-registry.js.map +0 -1
- package/dist/internal/core/lib/chat.d.ts +0 -49
- package/dist/internal/core/lib/chat.d.ts.map +0 -1
- package/dist/internal/core/lib/chat.js +0 -172
- package/dist/internal/core/lib/chat.js.map +0 -1
- package/dist/internal/core/lib/code-highlight.d.ts +0 -9
- package/dist/internal/core/lib/code-highlight.d.ts.map +0 -1
- package/dist/internal/core/lib/code-highlight.js +0 -153
- package/dist/internal/core/lib/code-highlight.js.map +0 -1
- package/dist/internal/core/lib/open-session-file.d.ts +0 -3
- package/dist/internal/core/lib/open-session-file.d.ts.map +0 -1
- package/dist/internal/core/lib/open-session-file.js +0 -14
- package/dist/internal/core/lib/open-session-file.js.map +0 -1
- package/dist/internal/core/lib/parent-bridge.d.ts +0 -20
- package/dist/internal/core/lib/parent-bridge.d.ts.map +0 -1
- package/dist/internal/core/lib/parent-bridge.js +0 -135
- package/dist/internal/core/lib/parent-bridge.js.map +0 -1
- package/dist/internal/core/lib/preview-dispatch.d.ts +0 -25
- package/dist/internal/core/lib/preview-dispatch.d.ts.map +0 -1
- package/dist/internal/core/lib/preview-dispatch.js +0 -55
- package/dist/internal/core/lib/preview-dispatch.js.map +0 -1
- package/dist/internal/core/lib/resource-bridge.d.ts +0 -12
- package/dist/internal/core/lib/resource-bridge.d.ts.map +0 -1
- package/dist/internal/core/lib/resource-bridge.js +0 -51
- package/dist/internal/core/lib/resource-bridge.js.map +0 -1
- package/dist/internal/core/lib/session-file-preview.d.ts +0 -4
- package/dist/internal/core/lib/session-file-preview.d.ts.map +0 -1
- package/dist/internal/core/lib/session-file-preview.js +0 -71
- package/dist/internal/core/lib/session-file-preview.js.map +0 -1
- package/dist/internal/core/lib/step-ranges.d.ts +0 -43
- package/dist/internal/core/lib/step-ranges.d.ts.map +0 -1
- package/dist/internal/core/lib/step-ranges.js +0 -229
- package/dist/internal/core/lib/step-ranges.js.map +0 -1
- package/dist/internal/core/lib/tool-preview.d.ts +0 -3
- package/dist/internal/core/lib/tool-preview.d.ts.map +0 -1
- package/dist/internal/core/lib/tool-preview.js +0 -7
- package/dist/internal/core/lib/tool-preview.js.map +0 -1
- package/dist/internal/core/lib/ui-meta.d.ts +0 -10
- package/dist/internal/core/lib/ui-meta.d.ts.map +0 -1
- package/dist/internal/core/lib/ui-meta.js +0 -28
- package/dist/internal/core/lib/ui-meta.js.map +0 -1
- package/dist/internal/core/lib/utils.d.ts +0 -4
- package/dist/internal/core/lib/utils.d.ts.map +0 -1
- package/dist/internal/core/lib/utils.js +0 -30
- package/dist/internal/core/lib/utils.js.map +0 -1
- package/dist/internal/core/lib/whatif-prompt.d.ts +0 -46
- package/dist/internal/core/lib/whatif-prompt.d.ts.map +0 -1
- package/dist/internal/core/lib/whatif-prompt.js +0 -138
- package/dist/internal/core/lib/whatif-prompt.js.map +0 -1
- package/dist/internal/core/react/AgentKitProvider.d.ts +0 -20
- package/dist/internal/core/react/AgentKitProvider.d.ts.map +0 -1
- package/dist/internal/core/react/AgentKitProvider.js +0 -32
- package/dist/internal/core/react/AgentKitProvider.js.map +0 -1
- package/dist/internal/core/routes.d.ts +0 -2
- package/dist/internal/core/routes.d.ts.map +0 -1
- package/dist/internal/core/routes.js +0 -2
- package/dist/internal/core/routes.js.map +0 -1
- package/dist/internal/core/schemas/background.d.ts +0 -12
- package/dist/internal/core/schemas/background.d.ts.map +0 -1
- package/dist/internal/core/schemas/background.js +0 -2
- package/dist/internal/core/schemas/background.js.map +0 -1
- package/dist/internal/core/schemas/event.d.ts +0 -46
- package/dist/internal/core/schemas/event.d.ts.map +0 -1
- package/dist/internal/core/schemas/event.js +0 -2
- package/dist/internal/core/schemas/event.js.map +0 -1
- package/dist/internal/core/schemas/gis.d.ts +0 -51
- package/dist/internal/core/schemas/gis.d.ts.map +0 -1
- package/dist/internal/core/schemas/gis.js +0 -2
- package/dist/internal/core/schemas/gis.js.map +0 -1
- package/dist/internal/core/schemas/message.d.ts.map +0 -1
- package/dist/internal/core/schemas/message.js +0 -23
- package/dist/internal/core/schemas/message.js.map +0 -1
- package/dist/internal/core/schemas/partner-skill.d.ts +0 -24
- package/dist/internal/core/schemas/partner-skill.d.ts.map +0 -1
- package/dist/internal/core/schemas/partner-skill.js +0 -24
- package/dist/internal/core/schemas/partner-skill.js.map +0 -1
- package/dist/internal/core/schemas/projection.d.ts.map +0 -1
- package/dist/internal/core/schemas/projection.js +0 -2
- package/dist/internal/core/schemas/projection.js.map +0 -1
- package/dist/internal/core/schemas/session.d.ts.map +0 -1
- package/dist/internal/core/schemas/session.js +0 -27
- package/dist/internal/core/schemas/session.js.map +0 -1
- package/dist/internal/core/schemas/skill.d.ts +0 -51
- package/dist/internal/core/schemas/skill.d.ts.map +0 -1
- package/dist/internal/core/schemas/skill.js +0 -8
- package/dist/internal/core/schemas/skill.js.map +0 -1
- package/dist/internal/core/schemas/studio/agent.d.ts +0 -13
- package/dist/internal/core/schemas/studio/agent.d.ts.map +0 -1
- package/dist/internal/core/schemas/studio/agent.js +0 -10
- package/dist/internal/core/schemas/studio/agent.js.map +0 -1
- package/dist/internal/core/schemas/studio/database.d.ts +0 -40
- package/dist/internal/core/schemas/studio/database.d.ts.map +0 -1
- package/dist/internal/core/schemas/studio/database.js +0 -35
- package/dist/internal/core/schemas/studio/database.js.map +0 -1
- package/dist/internal/core/schemas/studio/env.d.ts +0 -8
- package/dist/internal/core/schemas/studio/env.d.ts.map +0 -1
- package/dist/internal/core/schemas/studio/env.js +0 -8
- package/dist/internal/core/schemas/studio/env.js.map +0 -1
- package/dist/internal/core/schemas/studio/knowledge.d.ts +0 -19
- package/dist/internal/core/schemas/studio/knowledge.d.ts.map +0 -1
- package/dist/internal/core/schemas/studio/knowledge.js +0 -15
- package/dist/internal/core/schemas/studio/knowledge.js.map +0 -1
- package/dist/internal/core/schemas/studio/resource-base.d.ts +0 -8
- package/dist/internal/core/schemas/studio/resource-base.d.ts.map +0 -1
- package/dist/internal/core/schemas/studio/resource-base.js +0 -8
- package/dist/internal/core/schemas/studio/resource-base.js.map +0 -1
- package/dist/internal/core/schemas/studio/scene.d.ts +0 -13
- package/dist/internal/core/schemas/studio/scene.d.ts.map +0 -1
- package/dist/internal/core/schemas/studio/scene.js +0 -12
- package/dist/internal/core/schemas/studio/scene.js.map +0 -1
- package/dist/internal/core/schemas/studio/tool.d.ts +0 -26
- package/dist/internal/core/schemas/studio/tool.d.ts.map +0 -1
- package/dist/internal/core/schemas/studio/tool.js +0 -21
- package/dist/internal/core/schemas/studio/tool.js.map +0 -1
- package/dist/internal/core/schemas/task.d.ts +0 -13
- package/dist/internal/core/schemas/task.d.ts.map +0 -1
- package/dist/internal/core/schemas/task.js +0 -12
- package/dist/internal/core/schemas/task.js.map +0 -1
- package/dist/internal/core/stores/answer-callback-store.d.ts +0 -9
- package/dist/internal/core/stores/answer-callback-store.d.ts.map +0 -1
- package/dist/internal/core/stores/answer-callback-store.js +0 -13
- package/dist/internal/core/stores/answer-callback-store.js.map +0 -1
- package/dist/internal/core/stores/auth-store.d.ts +0 -38
- package/dist/internal/core/stores/auth-store.d.ts.map +0 -1
- package/dist/internal/core/stores/auth-store.js +0 -137
- package/dist/internal/core/stores/auth-store.js.map +0 -1
- package/dist/internal/core/stores/background-store.d.ts +0 -11
- package/dist/internal/core/stores/background-store.d.ts.map +0 -1
- package/dist/internal/core/stores/background-store.js +0 -34
- package/dist/internal/core/stores/background-store.js.map +0 -1
- package/dist/internal/core/stores/card-state-store.d.ts +0 -10
- package/dist/internal/core/stores/card-state-store.d.ts.map +0 -1
- package/dist/internal/core/stores/card-state-store.js +0 -22
- package/dist/internal/core/stores/card-state-store.js.map +0 -1
- package/dist/internal/core/stores/chat-store.d.ts +0 -34
- package/dist/internal/core/stores/chat-store.d.ts.map +0 -1
- package/dist/internal/core/stores/chat-store.js +0 -470
- package/dist/internal/core/stores/chat-store.js.map +0 -1
- package/dist/internal/core/stores/connection-store.d.ts +0 -14
- package/dist/internal/core/stores/connection-store.d.ts.map +0 -1
- package/dist/internal/core/stores/connection-store.js +0 -28
- package/dist/internal/core/stores/connection-store.js.map +0 -1
- package/dist/internal/core/stores/gis-store.d.ts +0 -19
- package/dist/internal/core/stores/gis-store.d.ts.map +0 -1
- package/dist/internal/core/stores/gis-store.js +0 -60
- package/dist/internal/core/stores/gis-store.js.map +0 -1
- package/dist/internal/core/stores/model-preferences-store.d.ts +0 -14
- package/dist/internal/core/stores/model-preferences-store.d.ts.map +0 -1
- package/dist/internal/core/stores/model-preferences-store.js +0 -62
- package/dist/internal/core/stores/model-preferences-store.js.map +0 -1
- package/dist/internal/core/stores/runtime-features-store.d.ts +0 -19
- package/dist/internal/core/stores/runtime-features-store.d.ts.map +0 -1
- package/dist/internal/core/stores/runtime-features-store.js +0 -17
- package/dist/internal/core/stores/runtime-features-store.js.map +0 -1
- package/dist/internal/core/stores/runtime-store.d.ts +0 -18
- package/dist/internal/core/stores/runtime-store.d.ts.map +0 -1
- package/dist/internal/core/stores/runtime-store.js +0 -23
- package/dist/internal/core/stores/runtime-store.js.map +0 -1
- package/dist/internal/core/stores/session-store.d.ts +0 -39
- package/dist/internal/core/stores/session-store.d.ts.map +0 -1
- package/dist/internal/core/stores/session-store.js +0 -396
- package/dist/internal/core/stores/session-store.js.map +0 -1
- package/dist/internal/core/stores/task-store.d.ts +0 -9
- package/dist/internal/core/stores/task-store.d.ts.map +0 -1
- package/dist/internal/core/stores/task-store.js +0 -14
- package/dist/internal/core/stores/task-store.js.map +0 -1
- package/dist/internal/core/stores/ui-bridge-store.d.ts +0 -31
- package/dist/internal/core/stores/ui-bridge-store.d.ts.map +0 -1
- package/dist/internal/core/stores/ui-bridge-store.js +0 -116
- package/dist/internal/core/stores/ui-bridge-store.js.map +0 -1
- package/dist/internal/core/stores/ui-store.d.ts +0 -59
- package/dist/internal/core/stores/ui-store.d.ts.map +0 -1
- package/dist/internal/core/stores/ui-store.js +0 -109
- package/dist/internal/core/stores/ui-store.js.map +0 -1
- package/dist/internal/core/types/index.d.ts +0 -8
- package/dist/internal/core/types/index.d.ts.map +0 -1
- package/dist/internal/core/types/index.js +0 -2
- package/dist/internal/core/types/index.js.map +0 -1
- package/dist/internal/core/types/solution.d.ts +0 -22
- package/dist/internal/core/types/solution.d.ts.map +0 -1
- package/dist/internal/core/types/solution.js +0 -7
- package/dist/internal/core/types/solution.js.map +0 -1
- package/dist/react.d.ts +0 -9
- package/dist/react.d.ts.map +0 -1
- package/dist/react.js +0 -9
- package/dist/react.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/resources/models.ts","../../../../src/client/socket.ts","../../../../src/react/schemas/partner-skill.ts","../../../../src/react/stores/ui-bridge-store.ts","../../../../src/react/stores/client-aware.ts","../../../../src/react/lib/chat.ts","../../../../src/react/stores/auth-store.ts","../../../../src/react/api/auth.ts","../../../../src/react/sockets/socket-state.ts","../../../../src/react/stores/session-store.ts","../../../../src/react/stores/chat-store.ts","../../../../src/react/components/chat/display-utils.ts","../../../../src/react/stores/ui-store.ts","../../../../src/react/stores/task-store.ts","../../../../src/react/stores/background-store.ts","../../../../src/react/stores/card-state-store.ts","../../../../src/react/stores/connection-store.ts","../../../../src/react/stores/runtime-store.ts","../../../../src/react/stores/gis-store.ts","../../../../src/react/stores/answer-callback-store.ts","../../../../src/react/stores/runtime-features-store.ts","../../../../src/react/bootstrap.ts","../../../../src/react/api/client.ts","../../../../src/react/api/sessions.ts","../../../../src/react/lib/utils.ts","../../../../src/react/components/session/SessionDetail.tsx","../../../../src/react/components/session/SessionList.tsx","../../../../src/react/hooks/use-session.ts","../../../../src/react/components/session/SessionListItem.tsx","../../../../src/react/components/session/StatusBadge.tsx","../../../../src/react/components/session/session-utils.ts"],"sourcesContent":["import { type } from \"arktype\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport const ModelOption = type({\n id: \"string\",\n label: \"string\",\n})\nexport type ModelOption = typeof ModelOption.infer\n\nexport const ModelsConfig = type({\n default: \"string\",\n models: ModelOption.array(),\n})\n\nexport type ModelsConfig = typeof ModelsConfig.infer\n\nexport class ModelsResource {\n constructor(private client: BladeClient) {}\n\n async getModelsConfig(init?: RequestInit): Promise<ModelsConfig> {\n const data = await this.client.jsonFromInit<unknown>(\"/api/config/models\", init)\n return ModelsConfig.assert(data)\n }\n}\n","import { io, type Socket } from \"socket.io-client\"\nimport { buildSocketAuth, type AuthOptions } from \"./auth\"\nimport type { ClientToServerEvents, ServerToClientEvents } from \"./types/socket-events\"\n\nexport type TypedSocket = Socket<ServerToClientEvents, ClientToServerEvents>\n\nexport interface CreateSocketOptions extends AuthOptions {\n baseUrl: string\n path?: string\n}\n\nexport function createSocket(options: CreateSocketOptions): TypedSocket {\n const auth = buildSocketAuth(options)\n return io(options.baseUrl, {\n path: options.path ?? \"/socket.io\",\n withCredentials: true,\n auth: typeof options.token === \"function\" ? (cb) => cb(buildSocketAuth(options) ?? {}) : auth,\n autoConnect: false,\n })\n}\n","import { type } from \"arktype\"\n\nexport const PartnerSkillName = type(\"/^[a-z0-9-]+\\\\/[a-z0-9-]+$/\")\nexport type PartnerSkillName = typeof PartnerSkillName.infer\n\nexport const PartnerSkillFile = type({\n path: \"string > 0\",\n content: \"string\",\n})\nexport type PartnerSkillFile = typeof PartnerSkillFile.infer\n\nexport const PartnerSkillInstallPayload = type({\n name: PartnerSkillName,\n files: PartnerSkillFile.array().atLeastLength(1),\n})\nexport type PartnerSkillInstallPayload = typeof PartnerSkillInstallPayload.infer\n\nexport const PartnerSkillInstallResult = type({\n name: PartnerSkillName,\n skill_dir: \"string\",\n file_count: \"number.integer >= 0\",\n overwritten: \"boolean\",\n})\nexport type PartnerSkillInstallResult = typeof PartnerSkillInstallResult.infer\n\nexport function parsePartnerSkillInstallPayload(payload: unknown): PartnerSkillInstallPayload {\n const parsed = PartnerSkillInstallPayload.assert(payload)\n\n if (!parsed.files.some((file) => file.path === \"SKILL.md\")) {\n throw new Error(\"installSkill payload must include SKILL.md\")\n }\n\n return parsed\n}\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nfunction buildSignalId() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID()\n }\n return `bridge-${Date.now()}-${Math.random().toString(36).slice(2)}`\n}\n\nfunction clearSignalRecord<T>(\n record: Record<string, T[]>,\n sessionId: string,\n) {\n if (!(sessionId in record)) {\n return record\n }\n\n const next = { ...record }\n delete next[sessionId]\n return next\n}\n\nexport interface PendingContextSignal {\n id: string\n label: string\n content: string\n}\n\nexport interface DraftAppendSignal {\n id: string\n text: string\n}\n\nexport interface SendRequestSignal {\n id: string\n}\n\ninterface UiBridgeState extends ClientAwareState {\n pendingContexts: Record<string, PendingContextSignal[]>\n draftAppends: Record<string, DraftAppendSignal[]>\n sendRequests: Record<string, SendRequestSignal[]>\n\n addPendingContext: (sessionId: string, context: Omit<PendingContextSignal, \"id\">) => void\n removePendingContext: (sessionId: string, contextId: string) => void\n consumePendingContexts: (sessionId: string) => PendingContextSignal[]\n clearPendingContexts: (sessionId: string) => void\n\n addDraftAppend: (sessionId: string, text: string) => void\n consumeDraftAppends: (sessionId: string) => DraftAppendSignal[]\n clearDraftAppends: (sessionId: string) => void\n\n addSendRequest: (sessionId: string) => void\n consumeSendRequests: (sessionId: string) => SendRequestSignal[]\n clearSendRequests: (sessionId: string) => void\n\n clearSession: (sessionId: string) => void\n}\n\nexport const useUiBridgeStore = create<UiBridgeState>()((set, get) => ({\n ...createClientActions(set),\n pendingContexts: {},\n draftAppends: {},\n sendRequests: {},\n\n addPendingContext: (sessionId, context) =>\n set((state) => ({\n pendingContexts: {\n ...state.pendingContexts,\n [sessionId]: [\n ...(state.pendingContexts[sessionId] ?? []),\n {\n id: buildSignalId(),\n label: context.label,\n content: context.content,\n },\n ],\n },\n })),\n removePendingContext: (sessionId, contextId) =>\n set((state) => {\n const contexts = state.pendingContexts[sessionId]\n if (!contexts?.length) {\n return state\n }\n\n const nextContexts = contexts.filter((context) => context.id !== contextId)\n if (nextContexts.length === contexts.length) {\n return state\n }\n\n return {\n pendingContexts:\n nextContexts.length > 0\n ? {\n ...state.pendingContexts,\n [sessionId]: nextContexts,\n }\n : clearSignalRecord(state.pendingContexts, sessionId),\n }\n }),\n consumePendingContexts: (sessionId) => {\n const signals = get().pendingContexts[sessionId] ?? []\n if (signals.length === 0) return []\n set((state) => ({\n pendingContexts: clearSignalRecord(state.pendingContexts, sessionId),\n }))\n return signals\n },\n clearPendingContexts: (sessionId) =>\n set((state) => ({\n pendingContexts: clearSignalRecord(state.pendingContexts, sessionId),\n })),\n\n addDraftAppend: (sessionId, text) =>\n set((state) => ({\n draftAppends: {\n ...state.draftAppends,\n [sessionId]: [\n ...(state.draftAppends[sessionId] ?? []),\n {\n id: buildSignalId(),\n text,\n },\n ],\n },\n })),\n consumeDraftAppends: (sessionId) => {\n const signals = get().draftAppends[sessionId] ?? []\n if (signals.length === 0) return []\n set((state) => ({\n draftAppends: clearSignalRecord(state.draftAppends, sessionId),\n }))\n return signals\n },\n clearDraftAppends: (sessionId) =>\n set((state) => ({\n draftAppends: clearSignalRecord(state.draftAppends, sessionId),\n })),\n\n addSendRequest: (sessionId) =>\n set((state) => ({\n sendRequests: {\n ...state.sendRequests,\n [sessionId]: [\n ...(state.sendRequests[sessionId] ?? []),\n {\n id: buildSignalId(),\n },\n ],\n },\n })),\n consumeSendRequests: (sessionId) => {\n const signals = get().sendRequests[sessionId] ?? []\n if (signals.length === 0) return []\n set((state) => ({\n sendRequests: clearSignalRecord(state.sendRequests, sessionId),\n }))\n return signals\n },\n clearSendRequests: (sessionId) =>\n set((state) => ({\n sendRequests: clearSignalRecord(state.sendRequests, sessionId),\n })),\n\n clearSession: (sessionId) =>\n set((state) => ({\n pendingContexts: clearSignalRecord(state.pendingContexts, sessionId),\n draftAppends: clearSignalRecord(state.draftAppends, sessionId),\n sendRequests: clearSignalRecord(state.sendRequests, sessionId),\n })),\n}))\n","import type { StoreApi } from \"zustand\"\nimport type { BladeClient } from \"../../client\"\n\nexport interface ClientAwareState {\n _client: BladeClient | null\n setClient: (client: BladeClient) => void\n}\n\nexport function createClientActions<T extends ClientAwareState>(\n set: StoreApi<T>[\"setState\"],\n): ClientAwareState {\n return {\n _client: null,\n setClient: (client) => set({ _client: client } as Partial<T>),\n }\n}\n","import type {\n ChatMessage,\n FileContentPart,\n ImageUrlContentPart,\n MessageContent,\n MessageContentPart,\n} from \"../schemas/message\"\n\nconst SYSTEM_REMINDER_PATTERN = /^<system-reminder>\\s*[\\s\\S]*?\\s*<\\/system-reminder>$/i\nconst LEGACY_FORK_CONTEXT_MARKERS = [\n \"父智能体在派生你之前已经完成了一些操作。\",\n \"可通过 `read_file` 读取。\",\n \"# 你的任务\",\n]\n\nexport function normalizeMessageContent(content: unknown): MessageContent {\n if (typeof content === \"string\") return content\n if (Array.isArray(content)) return content as MessageContentPart[]\n return String(content ?? \"\")\n}\n\nexport function getTextContent(content: MessageContent): string {\n if (typeof content === \"string\") return content\n return content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n}\n\nexport function isSystemReminderText(text: string): boolean {\n return SYSTEM_REMINDER_PATTERN.test(text.trim())\n}\n\nexport function isLegacyForkContextText(text: string): boolean {\n const normalized = text.trim()\n return LEGACY_FORK_CONTEXT_MARKERS.every((marker) => normalized.includes(marker))\n}\n\nexport function isHiddenInternalMessage(message: Pick<ChatMessage, \"role\" | \"content\">): boolean {\n if (message.role !== \"user\") return false\n const text = getTextContent(normalizeMessageContent(message.content))\n return isSystemReminderText(text) || isLegacyForkContextText(text)\n}\n\nexport function buildMessageContent(\n text: string,\n attachments: Array<{\n kind: \"file\"\n name: string\n uploadedPath?: string\n textContent?: string | null\n mimeType?: string\n }>,\n): MessageContent {\n if (attachments.length === 0) return text\n const textSegments: string[] = []\n\n if (text.trim()) {\n textSegments.push(text)\n }\n\n for (const attachment of attachments) {\n let fileText: string\n if (attachment.uploadedPath) {\n const displayName = attachment.uploadedPath.split(\"/\").pop() || attachment.name\n fileText = `[附件: ${displayName}] 已上传到工作区路径: ${attachment.uploadedPath}`\n } else if (attachment.textContent) {\n const MAX_TEXT_CHARS = 100_000\n const content =\n attachment.textContent.length > MAX_TEXT_CHARS\n ? `${attachment.textContent.slice(0, MAX_TEXT_CHARS)}\\n\\n[内容已截断,原始共 ${attachment.textContent.length} 字符]`\n : attachment.textContent\n fileText = `[附件: ${attachment.name}]\\n${content}`\n } else {\n fileText = `[附件: ${attachment.name}]`\n }\n textSegments.push(fileText)\n }\n\n return textSegments.join(\"\\n\\n\")\n}\n\nexport function contentPreview(content: MessageContent, maxLen = 80): string {\n const text = getTextContent(content).trim()\n return text.length > maxLen ? `${text.slice(0, maxLen)}…` : text\n}\n\n/**\n * Transform a skill mention into a natural language skill invocation.\n * Strips the `<skill>name</skill>` tag from the raw input and prepends the instruction.\n */\nexport function transformSlashCommand(skillName: string, rawInput: string): string {\n const prompt = rawInput.replace(`<skill>${skillName}</skill>`, \"\").trim()\n return prompt\n ? `请使用 ${skillName} skill 完成任务\\n${prompt}`\n : `请使用 ${skillName} skill 完成任务`\n}\n\nconst ATTACHMENT_TAG_RE = /\\[附件:\\s*([^\\]]+)\\](?:[ \\t]*已上传到工作区路径:[ \\t]*([^\\r\\n]+))?/g\n// 来自 addContext 的 context 在发送时序列化为独立 text part:`[上下文: LABEL]\\nCONTENT`\n// 整块 part 匹配而非行内替换,避免破坏正文中可能出现的\"[上下文:\"字样\nconst CONTEXT_PART_RE = /^\\[上下文:\\s*([^\\]]+)\\]\\n([\\s\\S]*)$/\n\nexport interface ParsedTextAttachment {\n name: string\n uploadedPath?: string\n}\n\nexport interface ParsedTextContext {\n label: string\n content: string\n}\n\n/**\n * Extract `[附件: name]` and `[上下文: label]` tags from text parts and return\n * the cleaned text plus the collected attachment / context metadata. 每个 text\n * part 独立匹配,以避免跨 part 拼接打乱正则。\n */\nexport function extractTextAttachments(content: MessageContent): {\n cleanText: string\n attachments: ParsedTextAttachment[]\n contexts: ParsedTextContext[]\n} {\n if (typeof content === \"string\") {\n const attachments: ParsedTextAttachment[] = []\n const contexts: ParsedTextContext[] = []\n const ctxMatch = CONTEXT_PART_RE.exec(content)\n let working = content\n if (ctxMatch) {\n contexts.push({ label: ctxMatch[1].trim(), content: ctxMatch[2].trim() })\n working = \"\"\n }\n for (const match of working.matchAll(ATTACHMENT_TAG_RE)) {\n attachments.push({\n name: match[1].trim(),\n uploadedPath: match[2]?.trim() || undefined,\n })\n }\n return {\n cleanText: working.replace(ATTACHMENT_TAG_RE, \"\").trim(),\n attachments,\n contexts,\n }\n }\n\n const attachments: ParsedTextAttachment[] = []\n const contexts: ParsedTextContext[] = []\n const cleanParts: string[] = []\n\n for (const part of content) {\n if (part.type !== \"text\") continue\n\n const ctxMatch = CONTEXT_PART_RE.exec(part.text)\n if (ctxMatch) {\n contexts.push({ label: ctxMatch[1].trim(), content: ctxMatch[2].trim() })\n continue\n }\n\n let hasAttachment = false\n for (const match of part.text.matchAll(ATTACHMENT_TAG_RE)) {\n attachments.push({\n name: match[1].trim(),\n uploadedPath: match[2]?.trim() || undefined,\n })\n hasAttachment = true\n }\n if (hasAttachment) {\n const remaining = part.text.replace(ATTACHMENT_TAG_RE, \"\").trim()\n if (remaining) cleanParts.push(remaining)\n } else {\n cleanParts.push(part.text)\n }\n }\n\n return { cleanText: cleanParts.join(\"\\n\").trim(), attachments, contexts }\n}\n\nexport function getImageParts(content: MessageContent): ImageUrlContentPart[] {\n if (typeof content === \"string\") return []\n return content.filter((part): part is ImageUrlContentPart => part.type === \"image_url\")\n}\n\nexport function getFileParts(content: MessageContent): FileContentPart[] {\n if (typeof content === \"string\") return []\n return content.filter((part): part is FileContentPart => part.type === \"file\")\n}\n\ninterface MessageGroup {\n root: ChatMessage | null\n childLoops: { loopName: string; messages: ChatMessage[] }[]\n}\n\nexport function groupMessagesByLoop(messages: ChatMessage[]): MessageGroup[] {\n const groups: MessageGroup[] = []\n let currentGroup: MessageGroup | null = null\n\n for (const msg of messages) {\n const loop = msg.loop_name ?? \"root\"\n\n if (loop === \"root\") {\n currentGroup = { root: msg, childLoops: [] }\n groups.push(currentGroup)\n } else {\n if (!currentGroup) {\n currentGroup = { root: null, childLoops: [] }\n groups.push(currentGroup)\n }\n const existingLoop = currentGroup.childLoops.find((l) => l.loopName === loop)\n if (existingLoop) {\n existingLoop.messages.push(msg)\n } else {\n currentGroup.childLoops.push({ loopName: loop, messages: [msg] })\n }\n }\n }\n\n return groups\n}\n","import { create } from \"zustand\"\nimport { createJSONStorage, persist } from \"zustand/middleware\"\nimport * as authApi from \"../api/auth\"\nimport { agentSocket } from \"../sockets/socket-state\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\nimport { useSessionStore } from \"./session-store\"\n\ninterface User {\n id: string\n username: string\n display_name?: string | null\n avatar_url: string | null\n is_admin?: boolean\n}\n\ninterface AuthState extends ClientAwareState {\n token: string | null\n socketAuthToken: string | null\n user: User | null\n loading: boolean\n error: string | null\n\n logout: () => void\n checkAuth: () => Promise<void>\n hydrateFromCookie: () => Promise<void>\n}\n\ntype PersistedAuthState = Pick<AuthState, \"token\" | \"user\">\n\nconst noopStorage = {\n getItem: () => null,\n setItem: () => {},\n removeItem: () => {},\n}\n\nfunction shouldClearPersistedAuthState(value: string): boolean {\n try {\n const parsed = JSON.parse(value) as {\n state?: PersistedAuthState | null\n }\n return parsed.state?.token == null && parsed.state?.user == null\n } catch {\n return false\n }\n}\n\nconst authStorage = createJSONStorage<PersistedAuthState>(() => {\n if (typeof localStorage === \"undefined\") {\n return noopStorage\n }\n\n return {\n getItem: (name) => localStorage.getItem(name),\n setItem: (name, value) => {\n if (shouldClearPersistedAuthState(value)) {\n localStorage.removeItem(name)\n return\n }\n\n localStorage.setItem(name, value)\n },\n removeItem: (name) => localStorage.removeItem(name),\n }\n})\n\nfunction finishAuth(set: (partial: Partial<AuthState>) => void, payload: { token: string; user: User }) {\n set({\n token: payload.token,\n socketAuthToken: null,\n user: payload.user,\n loading: false,\n error: null,\n })\n agentSocket?.reconnect()\n useSessionStore\n .getState()\n .fetchSessions()\n .catch(() => {})\n}\n\nfunction finishCookieHydration(\n set: (partial: Partial<AuthState>) => void,\n payload: { token: string; user: User },\n) {\n set({\n token: null,\n socketAuthToken: payload.token,\n user: payload.user,\n loading: false,\n error: null,\n })\n agentSocket?.reconnect()\n useSessionStore\n .getState()\n .fetchSessions()\n .catch(() => {})\n}\n\nfunction toUser(info: authApi.UserInfo): User {\n return {\n id: info.id,\n username: info.username,\n display_name: info.display_name,\n avatar_url: info.avatar_url,\n is_admin: info.is_admin,\n }\n}\n\nexport const useAuthStore = create<AuthState>()(\n persist(\n (set, get) => ({\n ...createClientActions(set),\n token: null,\n socketAuthToken: null,\n user: null,\n loading: false,\n error: null,\n\n logout: () => {\n void authApi.logout().catch(() => {})\n set({ token: null, socketAuthToken: null, user: null, error: null })\n agentSocket?.disconnect()\n useSessionStore.getState().reset()\n },\n\n checkAuth: async () => {\n const token = get().token\n if (!token) return\n try {\n const auth = await authApi.getMe()\n finishAuth(set, { token: auth.token, user: toUser(auth) })\n } catch {\n set({ token: null, socketAuthToken: null, user: null, error: null })\n useSessionStore.getState().reset()\n }\n },\n\n hydrateFromCookie: async () => {\n set({ loading: true, error: null })\n const previousToken = get().token\n\n if (previousToken) {\n try {\n const auth = await authApi.getMe()\n finishAuth(set, { token: auth.token, user: toUser(auth) })\n return\n } catch {\n set({ token: null, socketAuthToken: null, user: null, error: null })\n useSessionStore.getState().reset()\n }\n }\n\n try {\n const auth = await authApi.getMe()\n finishCookieHydration(set, { token: auth.token, user: toUser(auth) })\n } catch {\n set({\n token: null,\n socketAuthToken: null,\n user: null,\n loading: false,\n error: null,\n })\n useSessionStore.getState().reset()\n }\n },\n }),\n {\n name: \"agent-auth\",\n storage: authStorage,\n partialize: (state) => {\n if (state.socketAuthToken) {\n return { token: null, user: null }\n }\n return { token: state.token, user: state.user }\n },\n },\n ),\n)\n","import type { AuthResource } from \"../../client/resources/auth\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/auth\"\n\nconst r = (): AuthResource => getClient().auth\nexport const getProviders = (...args: Parameters<AuthResource[\"getProviders\"]>) => r().getProviders(...args)\nexport const getMe = (...args: Parameters<AuthResource[\"getMe\"]>) => r().getMe(...args)\nexport const logout = (...args: Parameters<AuthResource[\"logout\"]>) => r().logout(...args)\n","import type { AgentSocket } from \"./event-bridge\"\n\nexport let agentSocket: AgentSocket | null = null\n\nexport function setAgentSocket(nextSocket: AgentSocket | null): void {\n agentSocket = nextSocket\n}\n\nexport function getSocket(): AgentSocket {\n if (!agentSocket) throw new Error(\"Socket not initialized. Call bootstrapBladeClient() first.\")\n return agentSocket\n}\n","import { create } from \"zustand\"\nimport * as sessionsApi from \"../api/sessions\"\nimport type { AskUserAnswerData } from \"../components/chat/AskUserQuestionBlock\"\nimport type { ContentBlock, TurnProjection } from \"../schemas/projection\"\nimport type { ModeId, SessionInfo, SessionStatus } from \"../schemas/session\"\nimport { setChatStoreSessionAccessor, useChatStore } from \"./chat-store\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\nimport { useTaskStore } from \"./task-store\"\n\nexport type SessionMode = ModeId\nconst DEFAULT_SESSION_MODE: SessionMode = \"executing\"\n\ntype QueryClientLike = {\n invalidateQueries: (options: { queryKey: readonly unknown[] }) => Promise<unknown>\n}\n\ninterface SessionState extends ClientAwareState {\n sessions: SessionInfo[]\n activeSessionId: string | null\n loading: boolean\n modes: Record<string, SessionMode>\n rewindDrafts: Record<string, string>\n /** Session IDs that were just created and haven't had their first history load yet */\n _freshSessions: Set<string>\n\n fetchSessions: () => Promise<void>\n createSession: (intent?: string) => Promise<string>\n registerCreatedSession: (session: SessionInfo, mode?: SessionMode) => void\n upsertSession: (session: SessionInfo) => void\n isFreshSession: (sessionId: string) => boolean\n setActiveSession: (id: string) => void\n clearActiveSession: () => void\n deleteSession: (id: string) => Promise<void>\n updateSessionStatus: (sessionId: string, status: SessionStatus) => void\n updateSessionIntent: (sessionId: string, intent: string) => void\n /**\n * ship-attack v2:通用增量更新 session 字段。用于 session:updated 等事件\n * 广播\"后端刚改了 session 元数据(intent / bound_skill_id / ...)\"时,\n * 前端原地 patch sessions 缓存,而不需要重新拉整个列表。\n */\n patchSession: (sessionId: string, patch: Partial<SessionInfo>) => void\n pinSession: (sessionId: string, pinned: boolean) => Promise<void>\n setRewindDraft: (sessionId: string, text: string | null) => void\n setMode: (sessionId: string, mode: SessionMode) => void\n togglePlanningMode: (sessionId: string) => void\n toggleSharing: (sessionId: string) => Promise<void>\n reset: () => void\n}\n\n// agentSocket will be set after socket init -- see socket.ts\nlet onSessionChange: ((sessionId: string | null) => void) | null = null\nexport function setOnSessionChange(fn: (sessionId: string | null) => void) {\n onSessionChange = fn\n}\n\n/** 侧栏等使用 React Query 拉取会话列表时,与 zustand patch 同步失效。 */\nexport function invalidateHomeSidebarSessions() {\n const queryClient = (globalThis as { __agentQueryClient?: QueryClientLike }).__agentQueryClient\n if (!queryClient) return\n void queryClient.invalidateQueries({ queryKey: [\"sessions\", \"home-sidebar\"] })\n}\n\nfunction isSessionAccessRevoked(error: unknown) {\n if (error instanceof Error) {\n const msg = error.message\n return msg.includes(\"API 403\") || msg.includes(\"API 404\")\n }\n return false\n}\n\nfunction removeSessionArtifacts(sessionId: string) {\n useChatStore.getState().clearMessages(sessionId)\n useTaskStore.getState().setTasks(sessionId, [])\n}\n\nfunction pruneSessionState(state: SessionState, sessionId: string) {\n const nextFresh = new Set(state._freshSessions)\n nextFresh.delete(sessionId)\n const { [sessionId]: _mode, ...modes } = state.modes\n const { [sessionId]: _rewindDraft, ...rewindDrafts } = state.rewindDrafts\n\n return {\n sessions: state.sessions.filter((session) => session.id !== sessionId),\n activeSessionId: state.activeSessionId === sessionId ? null : state.activeSessionId,\n modes,\n rewindDrafts,\n _freshSessions: nextFresh,\n }\n}\n\nfunction navigateAwayFromSession(sessionId: string) {\n if (typeof window === \"undefined\") return\n if (window.location.pathname !== `/chat/${sessionId}`) return\n window.history.replaceState(window.history.state, \"\", \"/chat\")\n window.dispatchEvent(new PopStateEvent(\"popstate\"))\n}\n\nfunction handleUnreadableSession(\n set: (\n partial:\n | Partial<SessionState>\n | ((state: SessionState) => Partial<SessionState> | SessionState),\n ) => void,\n get: () => SessionState,\n sessionId: string,\n) {\n const wasActive = get().activeSessionId === sessionId\n removeSessionArtifacts(sessionId)\n set((state) => pruneSessionState(state, sessionId))\n if (wasActive) {\n onSessionChange?.(null)\n navigateAwayFromSession(sessionId)\n }\n invalidateHomeSidebarSessions()\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction extractModeFromBlocks(blocks: ContentBlock[]): SessionMode | null {\n const modeBlock = blocks.find((block) => block.type === \"mode_change\")\n if (\n modeBlock &&\n isPlainRecord(modeBlock.content) &&\n (modeBlock.content.to === \"planning\" || modeBlock.content.to === \"executing\")\n ) {\n return modeBlock.content.to\n }\n if (blocks.some((block) => block.type === \"planning_enter\")) return \"planning\"\n if (blocks.some((block) => block.type === \"planning_exit\")) return \"executing\"\n return null\n}\n\nfunction toSelectionMap(value: unknown): Record<number, number[]> {\n if (!isPlainRecord(value)) return {}\n const entries = Object.entries(value)\n .map(([questionKey, optionIndexes]) => {\n if (!Array.isArray(optionIndexes)) return null\n const parsedIndexes = optionIndexes\n .map((item) => (typeof item === \"number\" ? item : Number(item)))\n .filter((item) => Number.isInteger(item))\n return [Number(questionKey), parsedIndexes] as const\n })\n .filter((entry): entry is readonly [number, number[]] => entry !== null)\n return Object.fromEntries(entries) as Record<number, number[]>\n}\n\nfunction toCustomMap(value: unknown): Record<number, string> {\n if (!isPlainRecord(value)) return {}\n const entries = Object.entries(value)\n .filter(([, text]) => typeof text === \"string\")\n .map(([questionKey, text]) => [Number(questionKey), text] as const)\n return Object.fromEntries(entries) as Record<number, string>\n}\n\nfunction extractAskAnswers(turns: TurnProjection[]): Record<string, AskUserAnswerData> {\n const answers: Record<string, AskUserAnswerData> = {}\n\n for (const turn of turns) {\n for (const block of turn.blocks) {\n if (block.type !== \"ask_user_answer\" || typeof block.tool_call_id !== \"string\") continue\n answers[block.tool_call_id] = {\n selections: toSelectionMap(isPlainRecord(block.content) ? block.content.selections : undefined),\n custom: toCustomMap(isPlainRecord(block.content) ? block.content.custom : undefined),\n }\n }\n }\n\n return answers\n}\n\nfunction registerCreatedSessionState(\n set: (\n partial:\n | Partial<SessionState>\n | ((state: SessionState) => Partial<SessionState> | SessionState),\n ) => void,\n session: SessionInfo,\n mode: SessionMode = DEFAULT_SESSION_MODE,\n) {\n useChatStore.getState().setTurns(session.id, [])\n useTaskStore.getState().setTasks(session.id, [])\n set((state) => ({\n sessions: [session, ...state.sessions.filter((item) => item.id !== session.id)],\n modes: { ...state.modes, [session.id]: state.modes[session.id] ?? mode },\n _freshSessions: new Set(state._freshSessions).add(session.id),\n }))\n}\n\nasync function revalidateViewerSessions(existingSessions: SessionInfo[]): Promise<SessionInfo[]> {\n const viewerSessions = existingSessions.filter((session) => session.viewer_role === \"viewer\")\n if (viewerSessions.length === 0) {\n return []\n }\n const refreshed = await Promise.all(\n viewerSessions.map(async (session) => {\n try {\n return await sessionsApi.getSession(session.id)\n } catch (error) {\n if (isSessionAccessRevoked(error)) {\n return null\n }\n return session\n }\n }),\n )\n return refreshed.filter((session): session is SessionInfo => session !== null)\n}\n\nexport const useSessionStore = create<SessionState>()((set, get) => ({\n ...createClientActions(set),\n sessions: [],\n activeSessionId: null,\n loading: false,\n modes: {},\n rewindDrafts: {},\n _freshSessions: new Set(),\n\n fetchSessions: async () => {\n set({ loading: true })\n try {\n const currentState = get()\n const [sessions, viewerSessions] = await Promise.all([\n sessionsApi.listSessions(),\n revalidateViewerSessions(currentState.sessions),\n ])\n const knownSessionIds = new Set(sessions.map((session) => session.id))\n const mergedSessions = [\n ...sessions,\n ...viewerSessions.filter((session) => !knownSessionIds.has(session.id)),\n ]\n const removedSessionIds = currentState.sessions\n .filter(\n (session) =>\n session.viewer_role === \"viewer\" &&\n !mergedSessions.some((candidate) => candidate.id === session.id),\n )\n .map((session) => session.id)\n const activeSessionId = currentState.activeSessionId\n\n for (const sessionId of removedSessionIds) {\n removeSessionArtifacts(sessionId)\n }\n\n let nextState: Partial<SessionState> = {\n sessions: mergedSessions,\n activeSessionId: currentState.activeSessionId,\n loading: false,\n modes: currentState.modes,\n rewindDrafts: currentState.rewindDrafts,\n _freshSessions: currentState._freshSessions,\n }\n for (const sessionId of removedSessionIds) {\n nextState = {\n ...nextState,\n ...pruneSessionState(\n {\n ...currentState,\n sessions: nextState.sessions ?? currentState.sessions,\n activeSessionId: nextState.activeSessionId ?? currentState.activeSessionId,\n loading: nextState.loading ?? currentState.loading,\n modes: nextState.modes ?? currentState.modes,\n rewindDrafts: nextState.rewindDrafts ?? currentState.rewindDrafts,\n _freshSessions: nextState._freshSessions ?? currentState._freshSessions,\n },\n sessionId,\n ),\n }\n }\n set(nextState)\n\n if (activeSessionId && removedSessionIds.includes(activeSessionId)) {\n onSessionChange?.(null)\n navigateAwayFromSession(activeSessionId)\n }\n\n invalidateHomeSidebarSessions()\n } catch (error) {\n set({ loading: false })\n throw error\n }\n },\n\n createSession: async (intent) => {\n const { session_id } = await sessionsApi.createSession(intent)\n const now = new Date().toISOString()\n get().registerCreatedSession({\n id: session_id,\n intent: intent ?? \"\",\n status: \"created\" as const,\n created_at: now,\n updated_at: now,\n })\n get().setActiveSession(session_id)\n invalidateHomeSidebarSessions()\n get()\n .fetchSessions()\n .catch(() => {})\n return session_id\n },\n\n registerCreatedSession: (session, mode = DEFAULT_SESSION_MODE) => {\n registerCreatedSessionState(set, session, mode)\n },\n\n upsertSession: (session) => {\n set((state) => ({\n sessions: state.sessions.some((item) => item.id === session.id)\n ? state.sessions.map((item) => (item.id === session.id ? { ...item, ...session } : item))\n : [session, ...state.sessions],\n }))\n },\n\n isFreshSession: (sessionId) => get()._freshSessions.has(sessionId),\n\n setActiveSession: (id) => {\n set({ activeSessionId: id })\n onSessionChange?.(id)\n // 切换 session 时后端可能已经走完了一轮对话但前端没订阅,sessions 列表里的\n // status 还停留在旧值(running/waiting_for_input 混乱)。异步拉一次 detail\n // 合回 sessions 数组,保证 AskUser 卡片的 answered 判定正确。\n sessionsApi\n .getSession(id)\n .then((detail) => {\n set((state) => ({\n sessions: state.sessions.some((s) => s.id === id)\n ? state.sessions.map((s) =>\n s.id === id\n ? { ...s, status: detail.status, updated_at: detail.updated_at }\n : s,\n )\n : [detail, ...state.sessions],\n }))\n })\n .catch(() => {})\n const tasksPromise = sessionsApi.getSessionTasks(id).catch(() => null)\n Promise.all([sessionsApi.getSessionTurns(id), tasksPromise])\n .then(([turns, tasks]) => {\n if (tasks) useTaskStore.getState().setTasks(id, tasks)\n useChatStore.getState().setAskAnswers(id, extractAskAnswers(turns))\n let inferredMode: SessionMode = DEFAULT_SESSION_MODE\n for (const turn of turns) {\n const nextMode = extractModeFromBlocks(turn.blocks)\n if (nextMode) {\n inferredMode = nextMode\n }\n }\n set((state) => {\n if (state.modes[id] == null) {\n return { modes: { ...state.modes, [id]: inferredMode } }\n }\n return state\n })\n\n // Skip overwriting messages for fresh sessions — the optimistic seed is\n // correct and the history response is empty; overwriting would erase any\n // message that was sent between create and this response arriving.\n const isFresh = get()._freshSessions.has(id)\n if (isFresh) {\n set((state) => {\n const next = new Set(state._freshSessions)\n next.delete(id)\n return { _freshSessions: next }\n })\n // Only apply if history is non-empty (e.g. resumed session)\n if (turns.length > 0) {\n useChatStore.getState().setTurns(id, turns)\n }\n } else {\n useChatStore.getState().setTurns(id, turns)\n }\n })\n .catch((error) => {\n if (isSessionAccessRevoked(error)) {\n handleUnreadableSession(set, get, id)\n return\n }\n console.error(\"Failed to load session data\", error)\n })\n },\n\n clearActiveSession: () => {\n set({ activeSessionId: null })\n onSessionChange?.(null)\n },\n\n deleteSession: async (id) => {\n await sessionsApi.deleteSession(id)\n invalidateHomeSidebarSessions()\n const wasActive = get().activeSessionId === id\n await get().fetchSessions()\n if (!wasActive) {\n return\n }\n\n const nextId = get().sessions[0]?.id ?? null\n if (nextId) {\n get().setActiveSession(nextId)\n return\n }\n\n get().clearActiveSession()\n },\n\n updateSessionStatus: (sessionId, status) => {\n set((state) => ({\n sessions: state.sessions.map((s) => (s.id === sessionId ? { ...s, status } : s)),\n }))\n // Only reset streaming on terminal statuses to avoid race conditions\n // where a stale status update from a previous run could cancel streaming\n // for a new in-flight run. The primary streaming reset is via chat:end;\n // this serves as a fallback for missed chat:end events.\n if (status === \"failed\" || status === \"interrupted\") {\n useChatStore.getState().setStreaming(sessionId, false)\n if (status === \"interrupted\") {\n useChatStore.getState().markInterrupted(sessionId)\n } else {\n useChatStore.getState().markFailed(sessionId)\n }\n }\n },\n\n updateSessionIntent: (sessionId, intent) => {\n set((state) => ({\n sessions: state.sessions.map((s) => (s.id === sessionId ? { ...s, intent } : s)),\n }))\n },\n\n patchSession: (sessionId, patch) => {\n set((state) => ({\n sessions: state.sessions.map((s) =>\n s.id === sessionId ? { ...s, ...patch } : s,\n ),\n }))\n },\n\n pinSession: async (sessionId, pinned) => {\n const updated = await sessionsApi.pinSession(sessionId, pinned)\n set((state) => ({\n sessions: state.sessions.map((s) =>\n s.id === sessionId\n ? { ...s, is_pinned: updated.is_pinned, pinned_at: updated.pinned_at }\n : s,\n ),\n }))\n invalidateHomeSidebarSessions()\n },\n\n setRewindDraft: (sessionId, text) => {\n set((state) => {\n if (text == null) {\n const { [sessionId]: _, ...rest } = state.rewindDrafts\n return { rewindDrafts: rest }\n }\n\n return {\n rewindDrafts: {\n ...state.rewindDrafts,\n [sessionId]: text,\n },\n }\n })\n },\n\n setMode: (sessionId, mode) => {\n set((state) => ({ modes: { ...state.modes, [sessionId]: mode } }))\n },\n\n togglePlanningMode: (sessionId) => {\n const current = get().modes[sessionId] ?? DEFAULT_SESSION_MODE\n const next = current === \"executing\" ? \"planning\" : \"executing\"\n set((state) => ({ modes: { ...state.modes, [sessionId]: next } }))\n },\n\n toggleSharing: async (sessionId) => {\n const session = get().sessions.find((s) => s.id === sessionId)\n if (!session) return\n const newShared = !session.shared\n const result = await sessionsApi.updateSharing(sessionId, newShared)\n set((state) => ({\n sessions: state.sessions.map((s) =>\n s.id === sessionId ? { ...s, shared: result.shared } : s,\n ),\n }))\n },\n\n reset: () => {\n set({\n sessions: [],\n activeSessionId: null,\n loading: false,\n modes: {},\n rewindDrafts: {},\n _freshSessions: new Set(),\n })\n invalidateHomeSidebarSessions()\n },\n}))\n\n// Wire up lazy accessor to break circular dependency with chat-store\nsetChatStoreSessionAccessor(() => useSessionStore.getState().activeSessionId)\n","import { create } from \"zustand\"\nimport type { AskUserAnswerData } from \"../components/chat/AskUserQuestionBlock\"\nimport { formatToolName } from \"../components/chat/display-utils\"\nimport { normalizeMessageContent } from \"../lib/chat\"\nimport type { ChatMessage, CompactionInfo, MessageContent, ToolCallInfo } from \"../schemas/message\"\nimport type { ContentBlock, PatchEnvelope, TurnProjection } from \"../schemas/projection\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\nimport { useUiStore } from \"./ui-store\"\n\nlet _getActiveSessionId: (() => string | null) | null = null\n\nexport function setChatStoreSessionAccessor(fn: () => string | null) {\n _getActiveSessionId = fn\n}\n\nexport interface AgentLoopInfo {\n toolCallId: string\n description: string\n status: \"running\" | \"done\" | \"error\" | \"cancelled\" | \"awaiting_answer\"\n}\n\nexport interface ActiveCompactionState extends CompactionInfo {\n turn_id: string\n status: \"streaming\" | \"completed\" | \"paused\" | \"failed\" | \"interrupted\"\n}\n\ninterface ChatState extends ClientAwareState {\n turns: Record<string, TurnProjection[]>\n messages: Record<string, ChatMessage[]>\n askAnswers: Record<string, Record<string, AskUserAnswerData>>\n isStreaming: Record<string, boolean>\n agentLoops: Record<string, Record<string, AgentLoopInfo>>\n activeCompactions: Record<string, ActiveCompactionState | null>\n\n addUserMessage: (sessionId: string, content: MessageContent) => void\n setTurns: (sessionId: string, turns: TurnProjection[]) => void\n upsertTurn: (sessionId: string, turn: TurnProjection) => void\n applyTurnPatch: (sessionId: string, patch: PatchEnvelope) => void\n addErrorMessage: (sessionId: string, content: string) => void\n markInterrupted: (sessionId: string) => void\n markFailed: (sessionId: string) => void\n setStreaming: (sessionId: string, streaming: boolean) => void\n setAskAnswers: (sessionId: string, answers: Record<string, AskUserAnswerData>) => void\n clearMessages: (sessionId: string) => void\n}\n\nfunction parseAgentDescription(argumentsJson: string): string {\n try {\n return JSON.parse(argumentsJson)?.description ?? \"子智能体\"\n } catch {\n return \"子智能体\"\n }\n}\n\nfunction inferLoopStatusFromMessages(messages: ChatMessage[]): AgentLoopInfo[\"status\"] {\n const toolCalls = messages.flatMap((message) => message.tool_calls ?? [])\n if (messages.some((message) => message.status === \"streaming\")) return \"running\"\n if (toolCalls.some((toolCall) => toolCall.status === \"awaiting_answer\")) return \"awaiting_answer\"\n if (toolCalls.some((toolCall) => toolCall.status === \"error\")) return \"error\"\n if (toolCalls.some((toolCall) => toolCall.status === \"cancelled\")) return \"cancelled\"\n if (toolCalls.some((toolCall) => toolCall.status === \"pending\")) return \"running\"\n return \"done\"\n}\n\nfunction inferLoopStatusFromTurns(turns: TurnProjection[], messages: ChatMessage[]): AgentLoopInfo[\"status\"] {\n const latestAgentNotification = [...turns]\n .reverse()\n .flatMap((turn) => turn.blocks)\n .find((block) => {\n if (block.type !== \"system_notification\" || !isRecord(block.content)) return false\n return block.content.notification_type === \"agent:start\" || block.content.notification_type === \"agent:end\"\n })\n if (\n latestAgentNotification?.type === \"system_notification\" &&\n isRecord(latestAgentNotification.content)\n ) {\n const notificationType = latestAgentNotification.content.notification_type\n const status = latestAgentNotification.content.status\n if (notificationType === \"agent:start\" || status === \"running\") return \"running\"\n if (status === \"error\") return \"error\"\n if (status === \"cancelled\") return \"cancelled\"\n }\n return inferLoopStatusFromMessages(messages)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction parentForkToolCallIdFromTurn(turn: TurnProjection): string | null {\n if (typeof turn.parent_fork_tool_call_id === \"string\" && turn.parent_fork_tool_call_id.length > 0) {\n return turn.parent_fork_tool_call_id\n }\n for (const block of turn.blocks) {\n if (block.type !== \"system_notification\" || !isRecord(block.content)) continue\n const metadata = block.content.metadata\n if (!isRecord(metadata)) continue\n const parentId = metadata.parent_fork_tool_call_id\n if (typeof parentId === \"string\" && parentId.length > 0) return parentId\n }\n return null\n}\n\nfunction buildMessageContent(turn: TurnProjection): MessageContent {\n const textBlocks = turn.blocks.filter((block) => block.type === \"text\")\n if (textBlocks.length === 0) return \"\"\n if (textBlocks.length === 1) return normalizeMessageContent(textBlocks[0].content)\n return textBlocks\n .map((block) => {\n if (typeof block.content === \"string\") return block.content\n return JSON.stringify(block.content)\n })\n .join(\"\")\n}\n\nfunction buildReasoning(turn: TurnProjection): string | undefined {\n const thinking = turn.blocks\n .filter((block) => block.type === \"thinking\")\n .map((block) => (typeof block.content === \"string\" ? block.content : JSON.stringify(block.content)))\n .filter(Boolean)\n if (thinking.length === 0) return undefined\n return thinking.join(\"\\n\\n\")\n}\n\nfunction isModeChangeContent(value: unknown): value is { from: string; to: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { from?: unknown }).from === \"string\" &&\n typeof (value as { to?: unknown }).to === \"string\"\n )\n}\n\nfunction extractModeFromBlocks(blocks: ContentBlock[]): \"planning\" | \"executing\" | null {\n const modeBlock = blocks.find((block) => block.type === \"mode_change\")\n if (modeBlock && isModeChangeContent(modeBlock.content)) {\n return modeBlock.content.to === \"planning\" || modeBlock.content.to === \"executing\"\n ? modeBlock.content.to\n : null\n }\n if (blocks.some((block) => block.type === \"planning_enter\")) return \"planning\"\n if (blocks.some((block) => block.type === \"planning_exit\")) return \"executing\"\n return null\n}\n\nfunction projectionToMessage(turn: TurnProjection): ChatMessage | null {\n if (turn.kind === \"compaction\" && turn.compaction_id) {\n return {\n role: \"assistant\",\n content: turn.summary_preview ?? \"\",\n kind: \"compaction\",\n loop_name: turn.loop_id,\n entry_id: turn.turn_id,\n status: turn.status,\n compaction: {\n compaction_id: turn.compaction_id,\n summary_preview: turn.summary_preview,\n summary_full: turn.summary_full,\n archived_count: turn.archived_count,\n archived_files: turn.archived_files,\n archived_tool_calls: turn.archived_tool_calls,\n tokens_before: turn.tokens_before,\n tokens_after: turn.tokens_after,\n saved_ratio: turn.saved_ratio,\n trigger: turn.trigger,\n failure_reason: turn.failure_reason,\n fallback_applied: turn.fallback_applied,\n },\n }\n }\n\n const planningBlock = turn.blocks.find(\n (block) =>\n block.type === \"mode_change\" ||\n block.type === \"planning_enter\" ||\n block.type === \"planning_exit\" ||\n block.type === \"plan_status\",\n )\n if (planningBlock) {\n if (planningBlock.type === \"plan_status\") {\n return {\n role: \"tool\",\n content:\n typeof planningBlock.content === \"string\"\n ? planningBlock.content\n : JSON.stringify(planningBlock.content ?? {}, null, 2),\n kind: \"plan_status\",\n loop_name: turn.loop_id,\n entry_id: turn.turn_id,\n status: turn.status,\n }\n }\n return {\n role: \"assistant\",\n content:\n planningBlock.type === \"mode_change\"\n ? typeof planningBlock.content === \"string\"\n ? planningBlock.content\n : JSON.stringify(planningBlock.content ?? {})\n : \"\",\n kind: planningBlock.type,\n loop_name: turn.loop_id,\n entry_id: turn.turn_id,\n status: turn.status,\n }\n }\n\n if (turn.blocks.some((block) => block.type === \"ask_user_answer\")) {\n return null\n }\n\n const content = buildMessageContent(turn)\n const reasoning = buildReasoning(turn)\n const toolCalls: ToolCallInfo[] | undefined =\n turn.tool_calls.length > 0\n ? turn.tool_calls.map((toolCall) => ({\n id: toolCall.id,\n name: toolCall.tool_name,\n display_name: toolCall.display_name,\n arguments: toolCall.arguments,\n result: toolCall.result ?? undefined,\n pending_question_ref: toolCall.pending_question_ref ?? undefined,\n status:\n toolCall.status === \"pending\" ||\n toolCall.status === \"awaiting_answer\" ||\n toolCall.status === \"done\" ||\n toolCall.status === \"error\" ||\n toolCall.status === \"cancelled\"\n ? toolCall.status\n : \"pending\",\n ...(typeof toolCall.duration_ms === \"number\" ? { duration_ms: toolCall.duration_ms } : {}),\n }))\n : undefined\n\n if (turn.role === \"system\" && !content && !toolCalls?.length) {\n return null\n }\n\n return {\n role: turn.role === \"system\" ? \"assistant\" : turn.role,\n content,\n blocks: turn.blocks,\n ...(reasoning ? { reasoning } : {}),\n ...(toolCalls ? { tool_calls: toolCalls } : {}),\n loop_name: turn.loop_id,\n entry_id: turn.turn_id,\n status: turn.status,\n ...(typeof turn.duration_ms === \"number\" ? { duration_ms: turn.duration_ms } : {}),\n ...(turn.started_at ? { timestamp: turn.started_at } : {}),\n ...(turn.memory_refs?.length ? { memory_refs: turn.memory_refs } : {}),\n }\n}\n\nfunction rebuildAgentLoops(turns: TurnProjection[]): Record<string, AgentLoopInfo> {\n const messages = turns.map(projectionToMessage).filter(Boolean) as ChatMessage[]\n const childLoopNames = [...new Set(turns.map((turn) => turn.loop_id).filter((name) => name !== \"root\"))]\n if (childLoopNames.length === 0) return {}\n\n const agentToolCalls = messages\n .filter((message) => message.role === \"assistant\" && (message.loop_name ?? \"root\") === \"root\")\n .flatMap((message) => message.tool_calls ?? [])\n .filter((toolCall) => formatToolName(toolCall.name) === \"Agent\")\n\n const loops: Record<string, AgentLoopInfo> = {}\n const agentToolCallsById = new Map(agentToolCalls.map((toolCall) => [toolCall.id, toolCall]))\n const explicitParentToolCallIds = new Set(\n turns.map(parentForkToolCallIdFromTurn).filter((id): id is string => id !== null),\n )\n const usedToolCallIds = new Set<string>()\n for (const loopName of childLoopNames) {\n const loopMessages = messages.filter((message) => (message.loop_name ?? \"root\") === loopName)\n const loopTurns = turns.filter((turn) => turn.loop_id === loopName)\n const parentToolCallId = loopTurns.map(parentForkToolCallIdFromTurn).find(Boolean)\n const explicitToolCall =\n parentToolCallId && !usedToolCallIds.has(parentToolCallId)\n ? (agentToolCallsById.get(parentToolCallId) ?? null)\n : null\n const fallbackToolCall =\n explicitToolCall === null\n ? agentToolCalls.find(\n (toolCall) => !usedToolCallIds.has(toolCall.id) && !explicitParentToolCallIds.has(toolCall.id),\n )\n : null\n const toolCall = explicitToolCall ?? fallbackToolCall\n if (!toolCall) continue\n usedToolCallIds.add(toolCall.id)\n loops[loopName] = {\n toolCallId: toolCall.id,\n description: parseAgentDescription(toolCall.arguments),\n status: inferLoopStatusFromTurns(loopTurns, loopMessages),\n }\n }\n return loops\n}\n\nfunction applyPlanningSideEffects(sessionId: string, turns: TurnProjection[]) {\n const latestMode = [...turns]\n .reverse()\n .map((turn) => extractModeFromBlocks(turn.blocks))\n .find((mode): mode is \"planning\" | \"executing\" => mode !== null)\n if (latestMode !== \"planning\") return\n if (_getActiveSessionId?.() !== sessionId) return\n const ui = useUiStore.getState()\n ui.setActiveRightTab(\"situation\")\n if (ui.rightPanelCollapsed) {\n ui.toggleRightPanel()\n }\n}\n\nfunction materialize(turns: TurnProjection[]) {\n const messages = turns\n .map(projectionToMessage)\n .filter((message): message is ChatMessage => message !== null)\n const activeCompaction = [...turns]\n .reverse()\n .find(\n (turn): turn is TurnProjection =>\n turn.kind === \"compaction\" && turn.status === \"streaming\" && typeof turn.compaction_id === \"string\",\n )\n return {\n messages,\n agentLoops: rebuildAgentLoops(turns),\n activeCompaction: activeCompaction\n ? {\n turn_id: activeCompaction.turn_id,\n status: activeCompaction.status,\n compaction_id: activeCompaction.compaction_id!,\n summary_preview: activeCompaction.summary_preview,\n summary_full: activeCompaction.summary_full,\n archived_count: activeCompaction.archived_count,\n archived_files: activeCompaction.archived_files,\n archived_tool_calls: activeCompaction.archived_tool_calls,\n tokens_before: activeCompaction.tokens_before,\n tokens_after: activeCompaction.tokens_after,\n saved_ratio: activeCompaction.saved_ratio,\n trigger: activeCompaction.trigger,\n failure_reason: activeCompaction.failure_reason,\n fallback_applied: activeCompaction.fallback_applied,\n }\n : null,\n }\n}\n\nconst ERROR_ANCHOR_PREFIX = \"error-anchor:\"\n\nfunction updateSessionState(state: ChatState, sessionId: string, turns: TurnProjection[]) {\n const orderedTurns = [...turns].sort((left, right) => left.sequence - right.sequence)\n const { messages, agentLoops, activeCompaction } = materialize(orderedTurns)\n applyPlanningSideEffects(sessionId, orderedTurns)\n // addErrorMessage 注入的 role===\"error\" 不在 turns 里,默认会被 materialize 抹掉。\n // 给每条 error 打上 turn_id 锚点(见 addErrorMessage),只保留锚点命中当前最后一个 turn 的 error:\n // - upsertTurn/applyTurnPatch 推进同一 turn:锚点仍命中 → 错误气泡保留\n // - 用户发新消息(addUserMessage 追加 user turn):最后一个 turn 变化 → 旧错误自动丢弃\n // - session rewind 到更早 checkpoint:锚点的 turn 已不在列表 → 旧错误自动丢弃\n // - 重连/reload 同一 session:最后一个 turn 仍是那个 failed turn → 错误气泡保留\n const lastTurnId = orderedTurns[orderedTurns.length - 1]?.turn_id ?? null\n const preservedErrors = lastTurnId\n ? (state.messages[sessionId] ?? []).filter(\n (m) =>\n m.role === \"error\" &&\n typeof m.entry_id === \"string\" &&\n m.entry_id.startsWith(`${ERROR_ANCHOR_PREFIX}${lastTurnId}:`),\n )\n : []\n const mergedMessages = preservedErrors.length > 0 ? [...messages, ...preservedErrors] : messages\n return {\n turns: { ...state.turns, [sessionId]: orderedTurns },\n messages: { ...state.messages, [sessionId]: mergedMessages },\n agentLoops: { ...state.agentLoops, [sessionId]: agentLoops },\n activeCompactions: { ...state.activeCompactions, [sessionId]: activeCompaction },\n }\n}\n\nexport const useChatStore = create<ChatState>()((set) => ({\n ...createClientActions(set),\n turns: {},\n messages: {},\n askAnswers: {},\n isStreaming: {},\n agentLoops: {},\n activeCompactions: {},\n\n addUserMessage: (sessionId, content) => {\n set((state) => {\n const existing = state.turns[sessionId] ?? []\n const turnId = `local-user-${Date.now()}`\n const optimisticTurn: TurnProjection = {\n id: turnId,\n sequence: Math.max(0, ...existing.map((turn) => turn.sequence)) + 1,\n turn_id: turnId,\n loop_id: \"root\",\n role: \"user\",\n status: \"completed\",\n blocks: [{ type: \"text\", content }],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n }\n return updateSessionState(state, sessionId, [...existing, optimisticTurn])\n })\n },\n\n setTurns: (sessionId, turns) => {\n set((state) => updateSessionState(state, sessionId, [...turns]))\n },\n\n upsertTurn: (sessionId, turn) => {\n set((state) => {\n const existing = [...(state.turns[sessionId] ?? [])]\n const index = existing.findIndex((item) => item.turn_id === turn.turn_id)\n if (index >= 0) {\n existing[index] = turn\n } else {\n existing.push(turn)\n }\n return {\n ...updateSessionState(state, sessionId, existing),\n }\n })\n },\n\n applyTurnPatch: (sessionId, patch) => {\n set((state) => {\n const turn = patch.data.turn\n if (!turn) return state\n\n const existing = [...(state.turns[sessionId] ?? [])]\n const index = existing.findIndex((item) => item.turn_id === turn.turn_id)\n const lastSequence = index >= 0 ? existing[index].sequence : null\n if (lastSequence !== null && patch.sequence <= lastSequence) {\n return state\n }\n\n const nextTurn = {\n ...turn,\n sequence: patch.sequence,\n }\n if (index >= 0) {\n existing[index] = nextTurn\n } else {\n existing.push(nextTurn)\n }\n return {\n ...updateSessionState(state, sessionId, existing),\n }\n })\n },\n\n addErrorMessage: (sessionId, content) => {\n set((state) => {\n const turns = state.turns[sessionId] ?? []\n const anchorTurnId = turns[turns.length - 1]?.turn_id ?? null\n // 用 entry_id 携带 turn_id 锚点,updateSessionState 据此决定错误气泡去留\n const entry_id = anchorTurnId\n ? `${ERROR_ANCHOR_PREFIX}${anchorTurnId}:${Date.now()}`\n : undefined\n return {\n messages: {\n ...state.messages,\n [sessionId]: [\n ...(state.messages[sessionId] ?? []),\n { role: \"error\", content, loop_name: \"root\", entry_id },\n ],\n },\n }\n })\n },\n\n markInterrupted: (sessionId) => {\n set((state) => {\n const turns = (state.turns[sessionId] ?? []).map((turn) => {\n if (turn.status !== \"streaming\") return turn\n return {\n ...turn,\n status: \"interrupted\" as const,\n tool_calls: turn.tool_calls.map((toolCall) =>\n toolCall.status === \"pending\" || toolCall.status === \"awaiting_answer\"\n ? { ...toolCall, status: \"cancelled\" as const }\n : toolCall,\n ),\n }\n })\n return {\n ...updateSessionState(state, sessionId, turns),\n }\n })\n },\n\n markFailed: (sessionId) => {\n set((state) => {\n const turns = (state.turns[sessionId] ?? []).map((turn) => {\n if (turn.status !== \"streaming\") return turn\n return {\n ...turn,\n status: \"failed\" as const,\n tool_calls: turn.tool_calls.map((toolCall) =>\n toolCall.status === \"pending\" || toolCall.status === \"awaiting_answer\"\n ? { ...toolCall, status: \"error\" as const }\n : toolCall,\n ),\n }\n })\n return {\n ...updateSessionState(state, sessionId, turns),\n }\n })\n },\n\n setStreaming: (sessionId, streaming) => {\n set((state) => ({\n isStreaming: { ...state.isStreaming, [sessionId]: streaming },\n }))\n },\n\n setAskAnswers: (sessionId, answers) => {\n set((state) => ({\n askAnswers: {\n ...state.askAnswers,\n [sessionId]: answers,\n },\n }))\n },\n\n clearMessages: (sessionId) => {\n set((state) => {\n const { [sessionId]: _turns, ...restTurns } = state.turns\n const { [sessionId]: _messages, ...restMessages } = state.messages\n const { [sessionId]: _answers, ...restAnswers } = state.askAnswers\n const { [sessionId]: _loops, ...restLoops } = state.agentLoops\n const { [sessionId]: _compaction, ...restCompactions } = state.activeCompactions\n return {\n turns: restTurns,\n messages: restMessages,\n askAnswers: restAnswers,\n agentLoops: restLoops,\n activeCompactions: restCompactions,\n }\n })\n },\n}))\n","import type { ChatMessage, ToolCallInfo } from \"../../schemas/message\"\n\nconst TOOL_NAME_ALIASES: Record<string, string> = {\n agent: \"Agent\",\n ask_user_question: \"AskUserQuestion\",\n bash: \"Bash\",\n bg_bash: \"BgBash\",\n edit: \"Edit\",\n exit_plan_mode: \"ExitPlanMode\",\n file_edit: \"Edit\",\n file_read: \"Read\",\n file_write: \"Write\",\n finish_task: \"FinishTask\",\n get_skill_content: \"GetSkillContent\",\n glob: \"Glob\",\n grep: \"Grep\",\n list_skill_tools: \"ListSkillTools\",\n load_skill_tools: \"LoadSkillTools\",\n ls: \"Ls\",\n read: \"Read\",\n run_skill_tool: \"RunSkillTool\",\n search_skills: \"SearchSkills\",\n web_fetch: \"WebFetch\",\n web_search: \"WebSearch\",\n write: \"Write\",\n}\n\n/** System tool Chinese display labels */\nconst TOOL_DISPLAY_LABELS: Record<string, string> = {\n Bash: \"执行命令\",\n BgBash: \"后台执行命令\",\n Read: \"读取文件\",\n Write: \"写入文件\",\n Edit: \"编辑文件\",\n Ls: \"列出目录\",\n Glob: \"匹配文件\",\n Grep: \"搜索文本\",\n WebSearch: \"搜索网页\",\n WebFetch: \"整理网页内容\",\n Agent: \"派生子智能体\",\n AskUserQuestion: \"向用户提问\",\n SearchSkills: \"搜索技能\",\n GetSkillContent: \"读取技能\",\n ListSkillTools: \"查看工具列表\",\n LoadSkillTools: \"加载技能\",\n RunSkillTool: \"执行技能工具\",\n FinishTask: \"任务完成\",\n ExitPlanMode: \"提交计划\",\n ListSessions: \"列出历史会话\",\n GetSessionHistory: \"读取会话历史\",\n}\n\n/** Summary format: \"动词 + N + 量词\" style, e.g. \"读取 4 个技能\" */\nconst TOOL_SUMMARY_TEMPLATES: Record<string, (n: number) => string> = {\n Bash: (n) => `执行 ${n} 条命令`,\n BgBash: (n) => `启动 ${n} 个后台任务`,\n Read: (n) => `读取 ${n} 个文件`,\n Write: (n) => `写入 ${n} 个文件`,\n Edit: (n) => `编辑 ${n} 个文件`,\n Ls: (n) => `查看 ${n} 个目录`,\n Glob: (n) => `匹配 ${n} 组文件`,\n Grep: (n) => `搜索 ${n} 次文本`,\n WebSearch: (n) => `搜索 ${n} 次网页`,\n WebFetch: (n) => `整理 ${n} 次网页`,\n SearchSkills: (n) => `搜索 ${n} 次技能`,\n GetSkillContent: (n) => `读取 ${n} 个技能`,\n ListSkillTools: (n) => `查看 ${n} 个工具列表`,\n RunSkillTool: (n) => `执行 ${n} 个技能工具`,\n Agent: (n) => `调用 ${n} 个子智能体`,\n}\n\nconst OUTPUT_TOOL_ICONS: Record<string, string> = {\n Write: \"📄\",\n Edit: \"📝\",\n}\n\nconst PRIORITY_FILE_KEYS = [\n \"file_path\",\n \"output_file\",\n \"output_path\",\n \"path\",\n \"filepath\",\n \"target_file\",\n \"destination\",\n \"filename\",\n]\n\nconst FILE_PATH_PATTERN =\n /(?:^|[\\s\"'`::])([^\\s\"'`,;:)\\]},。;、]+?\\.[a-z0-9]{1,8})(?=$|[\\s\"'`,.;:)\\]},。;、])/i\n\nexport type ToolTone = \"emerald\" | \"blue\" | \"amber\" | \"red\"\n\nexport interface ToolSummaryTag {\n key: string\n label: string\n tone: \"emerald\" | \"blue\"\n}\n\nconst INDIVIDUAL_SUMMARY_TOOL_NAMES = new Set([\"RunSkillTool\", \"Bash\", \"BgBash\"])\n\nfunction safeParseJson(value: string | null | undefined): unknown {\n if (!value) return null\n try {\n return JSON.parse(value)\n } catch {\n return null\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction getStringArgValue(args: Record<string, unknown> | null, key: string): string {\n const value = args?.[key]\n return typeof value === \"string\" ? value.trim() : \"\"\n}\n\n/** Generic spec labels that should NOT be treated as per-call display names. */\nconst GENERIC_DISPLAY_NAMES = new Set(Object.values(TOOL_DISPLAY_LABELS))\n\nfunction getRunSkillDisplayName(\n toolCall: ToolCallInfo,\n args: Record<string, unknown> | null,\n): string {\n // Prefer per-call display name from arguments over the spec-level generic label.\n const argDisplayName = getStringArgValue(args, \"display_name\")\n if (argDisplayName) return argDisplayName\n\n // Only use toolCall.display_name if it's not a generic spec label\n const displayName = toolCall.display_name?.trim() ?? \"\"\n if (displayName && (displayName === \"写入文件\" || !GENERIC_DISPLAY_NAMES.has(displayName))) {\n return displayName\n }\n\n const argToolName = getStringArgValue(args, \"tool_name\")\n if (argToolName) return argToolName\n\n return \"\"\n}\n\nfunction getCommandDescription(args: Record<string, unknown> | null): string {\n return getStringArgValue(args, \"description\")\n}\n\nfunction findFileLikeValue(value: unknown, depth = 0, allowPlainString = false): string | null {\n if (depth > 3) return null\n if (typeof value === \"string\") {\n const trimmed = value.trim()\n if (!trimmed) return null\n if (allowPlainString || trimmed.includes(\"/\") || /\\.[a-z0-9]{1,8}$/i.test(trimmed)) {\n return trimmed\n }\n return null\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n const found = findFileLikeValue(item, depth + 1, allowPlainString)\n if (found) return found\n }\n return null\n }\n if (isPlainObject(value)) {\n for (const key of PRIORITY_FILE_KEYS) {\n const direct = findFileLikeValue(value[key], depth + 1, true)\n if (direct) return direct\n }\n for (const nested of Object.values(value)) {\n const found = findFileLikeValue(nested, depth + 1, allowPlainString)\n if (found) return found\n }\n }\n return null\n}\n\nfunction extractFilePathFromText(text: string): string | null {\n return text.match(FILE_PATH_PATTERN)?.[1] ?? null\n}\n\nfunction extractFilePathFromResult(result: unknown): string | null {\n if (typeof result === \"string\") {\n const parsed = safeParseJson(result)\n if (parsed != null && parsed !== result) {\n const found = extractFilePathFromResult(parsed)\n if (found) return found\n }\n return extractFilePathFromText(result)\n }\n if (Array.isArray(result)) {\n for (const item of result) {\n const found = extractFilePathFromResult(item)\n if (found) return found\n }\n return null\n }\n if (isPlainObject(result)) {\n for (const key of PRIORITY_FILE_KEYS) {\n const direct = findFileLikeValue(result[key], 0, true)\n if (direct) return direct\n }\n for (const nested of Object.values(result)) {\n const found = extractFilePathFromResult(nested)\n if (found) return found\n }\n }\n return null\n}\n\nfunction isWriteLikeRunSkillTool(label: string, args: Record<string, unknown> | null): boolean {\n const normalizedLabel = label.trim()\n if (normalizedLabel === \"写入文件\" || /write/i.test(normalizedLabel)) return true\n\n const toolName = getStringArgValue(args, \"tool_name\")\n if (/write/i.test(toolName)) return true\n\n return false\n}\n\nfunction formatFileName(filePath: string): string {\n return filePath.split(\"/\").pop() ?? filePath\n}\n\nfunction isInternalStatusFile(filePath: string): boolean {\n const fileName = formatFileName(filePath).toLowerCase()\n return fileName === \"phase.json\"\n}\n\nexport function formatToolName(name: string): string {\n const trimmed = name.trim()\n if (!trimmed) return name\n\n const stripped =\n trimmed.split(\":\").pop()?.split(\"/\").pop()?.split(\".\").pop()?.trim() || trimmed\n const normalized = stripped\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toLowerCase()\n\n return TOOL_NAME_ALIASES[normalized] ?? stripped\n}\n\n/**\n * Returns a context-aware Chinese display label for a tool call.\n * Uses tool arguments to provide specific context (e.g., skill name, file path).\n */\nexport function getToolDisplayLabel(toolCall: ToolCallInfo): string {\n const normalized = formatToolName(toolCall.name)\n const args = safeParseJson(toolCall.arguments) as Record<string, unknown> | null\n const displayName = toolCall.display_name?.trim() ?? \"\"\n const baseLabel = displayName || TOOL_DISPLAY_LABELS[normalized] || normalized\n const metaDisplayName = getStringArgValue(args, \"_meta_display_name\")\n if (metaDisplayName) {\n return metaDisplayName\n }\n\n switch (normalized) {\n case \"RunSkillTool\": {\n const runSkillDisplayName = getRunSkillDisplayName(toolCall, args)\n if (runSkillDisplayName) {\n const filePath = extractToolFilePath(toolCall)\n if (filePath && isWriteLikeRunSkillTool(runSkillDisplayName, args)) {\n return `${runSkillDisplayName}「${formatFileName(filePath)}」`\n }\n return runSkillDisplayName\n }\n return \"执行技能工具\"\n }\n case \"Bash\": {\n const description = getCommandDescription(args)\n return description ? `执行命令行操作:${description}` : \"执行命令行操作\"\n }\n case \"BgBash\": {\n const description = getCommandDescription(args)\n return description ? `后台执行:${description}` : \"后台执行命令\"\n }\n case \"Ls\": {\n const path = args && typeof args.path === \"string\" ? args.path : \"\"\n return path ? `${baseLabel}「${path}」` : baseLabel\n }\n case \"Glob\": {\n const pattern = args && typeof args.pattern === \"string\" ? args.pattern : \"\"\n return pattern ? `${baseLabel}「${pattern}」` : baseLabel\n }\n case \"Grep\": {\n const pattern = args && typeof args.pattern === \"string\" ? args.pattern : \"\"\n return pattern ? `${baseLabel}「${pattern}」` : baseLabel\n }\n case \"WebSearch\":\n case \"WebFetch\": {\n const query = args && typeof args.query === \"string\" ? args.query : \"\"\n return query ? `${baseLabel}「${query}」` : baseLabel\n }\n case \"GetSkillContent\": {\n const skillName =\n args && typeof args.skill_id === \"string\"\n ? args.skill_id\n : args && typeof args.skill_name === \"string\"\n ? args.skill_name\n : \"\"\n return skillName ? `${baseLabel}「${skillName}」` : baseLabel\n }\n case \"SearchSkills\": {\n const query = args && typeof args.query === \"string\" ? args.query : \"\"\n return query ? `${baseLabel}「${query}」` : baseLabel\n }\n case \"ListSkillTools\": {\n const skillId = args && typeof args.skill_id === \"string\" ? args.skill_id : \"\"\n return skillId ? `${baseLabel}「${skillId}」` : baseLabel\n }\n case \"LoadSkillTools\":\n return \"加载技能\"\n case \"FinishTask\": {\n const title = args && typeof args.title === \"string\" ? args.title : \"\"\n return title ? `${baseLabel}:${title}` : baseLabel\n }\n default:\n return baseLabel\n }\n}\n\nexport function getToolTone(status?: ToolCallInfo[\"status\"]): ToolTone {\n if (status === \"error\" || status === \"cancelled\") return \"red\"\n if (status === \"awaiting_answer\") return \"amber\"\n if (status === \"pending\") return \"blue\"\n return \"emerald\"\n}\n\nexport function getToolStatusLabel(status?: ToolCallInfo[\"status\"]): string {\n if (status === \"pending\") return \"运行中\"\n if (status === \"awaiting_answer\") return \"等待回答\"\n if (status === \"error\") return \"错误\"\n if (status === \"cancelled\") return \"已取消\"\n return \"完成\"\n}\n\nexport function getAggregateToolTone(toolCalls: ToolCallInfo[]): ToolTone {\n if (\n toolCalls.some((toolCall) => toolCall.status === \"error\" || toolCall.status === \"cancelled\")\n ) {\n return \"red\"\n }\n if (toolCalls.some((toolCall) => toolCall.status === \"awaiting_answer\")) {\n return \"amber\"\n }\n if (toolCalls.some((toolCall) => toolCall.status === \"pending\")) {\n return \"blue\"\n }\n return \"emerald\"\n}\n\nexport function extractToolFilePath(toolCall: ToolCallInfo): string | null {\n const formattedName = formatToolName(toolCall.name)\n const argsValue = safeParseJson(toolCall.arguments)\n let filePath: string | null = null\n\n if (formattedName === \"Read\" || formattedName === \"Write\" || formattedName === \"Edit\") {\n filePath = findFileLikeValue(argsValue)\n } else if (formattedName === \"RunSkillTool\") {\n filePath = findFileLikeValue(argsValue) ?? extractFilePathFromResult(toolCall.result)\n }\n\n if (!filePath || isInternalStatusFile(filePath)) return null\n return filePath\n}\n\nexport function getToolOutputTag(toolCall: ToolCallInfo): ToolSummaryTag | null {\n const toolName = formatToolName(toolCall.name)\n const filePath = extractToolFilePath(toolCall)\n const icon = OUTPUT_TOOL_ICONS[toolName]\n\n if (!icon || !filePath) return null\n\n return {\n key: `${toolCall.id}-${filePath}`,\n label: `${icon} ${filePath.split(\"/\").pop() ?? filePath}`,\n tone: \"blue\",\n }\n}\n\nexport function isSuccessfulToolCall(toolCall: ToolCallInfo): boolean {\n if (toolCall.status === \"error\" || toolCall.status === \"cancelled\") return false\n if (toolCall.status === \"awaiting_answer\") return false\n if (toolCall.status === \"pending\") return false\n return toolCall.status === \"done\" || toolCall.result != null || toolCall.status == null\n}\n\nexport function countSuccessfulToolCalls(toolCalls: ToolCallInfo[]): number {\n return toolCalls.filter(isSuccessfulToolCall).length\n}\n\nexport function countPendingToolCalls(toolCalls: ToolCallInfo[]): number {\n return toolCalls.filter(\n (toolCall) => toolCall.status === \"pending\" || toolCall.status === \"awaiting_answer\",\n ).length\n}\n\nexport function formatToolCallCount(count: number): string {\n return `已执行 ${count} 次工具调用`\n}\n\nexport function summarizeToolCalls(toolCalls: ToolCallInfo[]): ToolSummaryTag[] {\n const outputTagMap = new Map<string, ToolSummaryTag>()\n const counts = new Map<string, number>()\n const individualTags: ToolSummaryTag[] = []\n\n for (const toolCall of toolCalls.filter(isSuccessfulToolCall)) {\n const normalized = formatToolName(toolCall.name)\n const args = safeParseJson(toolCall.arguments) as Record<string, unknown> | null\n\n if (normalized === \"Agent\" || normalized === \"FinishTask\") continue\n\n if (INDIVIDUAL_SUMMARY_TOOL_NAMES.has(normalized)) {\n if (normalized === \"RunSkillTool\") {\n const runSkillDisplayName = getRunSkillDisplayName(toolCall, args)\n const filePath = extractToolFilePath(toolCall)\n if (filePath && isWriteLikeRunSkillTool(runSkillDisplayName, args)) {\n individualTags.push({\n key: `${individualTags.length}-${toolCall.id}`,\n label: `📄 ${formatFileName(filePath)}`,\n tone: \"blue\",\n })\n continue\n }\n individualTags.push({\n key: `${individualTags.length}-${toolCall.id}`,\n label: runSkillDisplayName || \"执行技能工具\",\n tone: \"emerald\",\n })\n continue\n }\n\n if (normalized === \"Bash\") {\n individualTags.push({\n key: `${individualTags.length}-${toolCall.id}`,\n label: getCommandDescription(args) || \"执行命令行操作\",\n tone: \"emerald\",\n })\n continue\n }\n\n if (normalized === \"BgBash\") {\n individualTags.push({\n key: `${individualTags.length}-${toolCall.id}`,\n label: getCommandDescription(args) || \"后台执行命令\",\n tone: \"emerald\",\n })\n continue\n }\n }\n\n const outputTag = getToolOutputTag(toolCall)\n if (outputTag) {\n const fileLabel = outputTag.label.replace(/^[^\\s]+\\s+/, \"\")\n const existing = outputTagMap.get(fileLabel)\n if (existing?.label.startsWith(\"📄\")) {\n continue\n }\n outputTagMap.set(fileLabel, {\n ...outputTag,\n key: fileLabel,\n label:\n normalized === \"Write\" ||\n existing?.label.startsWith(\"📝\")\n ? `📄 ${fileLabel}`\n : outputTag.label,\n })\n continue\n }\n\n counts.set(normalized, (counts.get(normalized) ?? 0) + 1)\n }\n\n const aggregatedCountTags: ToolSummaryTag[] = []\n for (const [normalized, count] of counts.entries()) {\n const template = TOOL_SUMMARY_TEMPLATES[normalized]\n const label = template ? template(count) : `${TOOL_DISPLAY_LABELS[normalized] ?? normalized} ×${count}`\n aggregatedCountTags.push({\n key: `${normalized}-${count}`,\n label,\n tone: \"emerald\",\n })\n }\n\n const outputTags = [...outputTagMap.values()].sort((left, right) =>\n left.label.localeCompare(right.label),\n )\n const sortedCountTags = aggregatedCountTags.sort((left, right) =>\n left.label.localeCompare(right.label),\n )\n const merged = [...individualTags, ...outputTags, ...sortedCountTags]\n\n if (merged.length <= 5) return merged\n\n return [\n ...merged.slice(0, 5),\n {\n key: `overflow-${merged.length - 5}`,\n label: `+${merged.length - 5} 更多`,\n tone: \"emerald\",\n },\n ]\n}\n\nfunction getMessageText(message: ChatMessage): string {\n if (typeof message.content === \"string\") return message.content\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n}\n\nexport function hasNaturalLanguageText(message: ChatMessage): boolean {\n return getMessageText(message).trim().length > 0\n}\n\nexport function findAnchorMessageIndex(messages: ChatMessage[]): number {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n if (hasNaturalLanguageText(messages[index])) {\n return index\n }\n }\n return Math.max(messages.length - 1, 0)\n}\n\nexport function getCollapsedTurnSegments(messages: ChatMessage[]): {\n anchorIndex: number\n summaryMessages: ChatMessage[]\n visibleMessages: ChatMessage[]\n} {\n if (messages.length === 0) {\n return { anchorIndex: 0, summaryMessages: [], visibleMessages: [] }\n }\n\n const anchorIndex = findAnchorMessageIndex(messages)\n return {\n anchorIndex,\n summaryMessages: messages.slice(0, anchorIndex),\n visibleMessages: messages.slice(anchorIndex),\n }\n}\n\nexport function getLatestPendingToolName(toolCalls: ToolCallInfo[]): string | null {\n for (let index = toolCalls.length - 1; index >= 0; index -= 1) {\n if (\n toolCalls[index].status === \"pending\" ||\n toolCalls[index].status === \"awaiting_answer\"\n ) {\n return formatToolName(toolCalls[index].name)\n }\n }\n return null\n}\n\nexport function getFinishTaskTitle(toolCalls: ToolCallInfo[]): string | null {\n for (let index = toolCalls.length - 1; index >= 0; index -= 1) {\n if (formatToolName(toolCalls[index].name) !== \"FinishTask\") continue\n const args = safeParseJson(toolCalls[index].arguments)\n if (!isPlainObject(args)) continue\n const title = typeof args.title === \"string\" ? args.title.trim() : \"\"\n if (title) return title\n }\n return null\n}\n\nexport function getTextContentSegments(messages: ChatMessage[]): string[] {\n return messages\n .map((message) => {\n if (typeof message.content === \"string\") return message.content\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n })\n .map((text) => text.trim())\n .filter(Boolean)\n}\n\nexport function getLastTextSegment(messages: ChatMessage[]): string {\n const texts = getTextContentSegments(messages)\n return texts[texts.length - 1] ?? \"\"\n}\n\nexport function countMessageLines(message: ChatMessage): number {\n const text = typeof message.content === \"string\" ? message.content : \"\"\n const reasoningLines = message.reasoning ? message.reasoning.split(\"\\n\").length : 0\n const textLines = text.trim() ? text.trim().split(\"\\n\").length : 0\n const toolLines = message.tool_calls?.length ?? 0\n return reasoningLines + textLines + toolLines\n}\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\ntype ThemeValue = \"light\" | \"dark\" | \"system\"\n\nconst isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\"\n\nexport function resolveEffectiveTheme(theme: ThemeValue): \"light\" | \"dark\" {\n if (theme !== \"system\") return theme\n return isBrowser && window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\"\n}\n\nfunction applyTheme(theme: ThemeValue) {\n if (!isBrowser) return\n const effective = resolveEffectiveTheme(theme)\n document.documentElement.setAttribute(\"data-theme\", effective)\n}\n\n// Initialize theme from localStorage before store creation\nconst storedTheme = isBrowser\n ? (localStorage.getItem(\"blade-theme\") as ThemeValue | null) ?? \"light\"\n : \"light\"\napplyTheme(storedTheme)\n\n// Listen for system preference changes\nif (isBrowser) {\n window.matchMedia(\"(prefers-color-scheme: dark)\").addEventListener(\"change\", () => {\n const current = useUiStore?.getState?.()?.theme\n if (current === \"system\") applyTheme(\"system\")\n })\n}\n\nexport interface PreviewTarget {\n type:\n | \"file\"\n | \"markdown\"\n | \"image\"\n | \"url\"\n | \"html\"\n | \"resource-html\"\n | \"resource-uri\"\n | \"diff\"\n | \"pdf\"\n | \"docx\"\n | \"video\"\n | \"audio\"\n | \"download\"\n | \"card\"\n | \"excel\"\n | \"csv\"\n | \"ppt\"\n content: string\n title?: string\n /** Stable identity key for tab deduplication (e.g. file_path). Falls back to title. */\n key?: string\n /** For diff type: the old content before edit */\n oldContent?: string\n /** Optional bridge session binding for resource iframes. */\n bridgeSessionId?: string\n /** Original source file URL when preview content uses a derived representation (e.g. PPT -> PDF). */\n sourceUrl?: string\n /** Changes when an artifact with the same key is updated in place. */\n revision?: number\n}\n\nexport type ActiveRightTab = \"situation\" | \"preview\" | \"skill-test\" | \"vibe-service\" | \"vibe-preview\"\n\ninterface UpsertArtifactOptions {\n reveal?: boolean\n activate?: boolean\n}\n\ninterface UiState extends ClientAwareState {\n leftPanelSize: number\n rightPanelSize: number\n leftPanelCollapsed: boolean\n rightPanelCollapsed: boolean\n activeRightTab: ActiveRightTab\n /** All open artifact tabs */\n artifacts: PreviewTarget[]\n /** Index of the active tab (-1 if none) */\n activeArtifactIndex: number\n theme: ThemeValue\n\n setLeftPanelSize: (size: number) => void\n setRightPanelSize: (size: number) => void\n setLeftPanelCollapsed: (collapsed: boolean) => void\n setRightPanelCollapsed: (collapsed: boolean) => void\n toggleLeftPanel: () => void\n toggleRightPanel: () => void\n setActiveRightTab: (tab: ActiveRightTab) => void\n /** Add or update an artifact tab (matched by key/title). Opens the panel automatically. */\n pushArtifact: (target: PreviewTarget) => void\n /** Add or update an artifact tab with optional reveal/activate control. */\n upsertArtifact: (target: PreviewTarget, options?: UpsertArtifactOptions) => void\n /** Switch to a tab by index */\n setActiveArtifact: (index: number) => void\n /** Close a tab by index */\n closeArtifact: (index: number) => void\n /** Close a tab by stable key if it exists. */\n removeArtifactByKey: (key: string) => void\n /** Close all tabs and collapse panel */\n clearArtifacts: () => void\n /** Legacy single-target setter for backwards compat */\n setPreviewTarget: (target: PreviewTarget | null) => void\n setTheme: (theme: ThemeValue) => void\n}\n\nfunction removeArtifactAtIndex(state: UiState, index: number) {\n const next = state.artifacts.filter((_: PreviewTarget, i: number) => i !== index)\n let nextActive = state.activeArtifactIndex\n\n if (next.length === 0) {\n return { artifacts: [], activeArtifactIndex: -1, rightPanelCollapsed: true }\n }\n\n if (index < nextActive) {\n nextActive -= 1\n } else if (index === nextActive) {\n nextActive = Math.min(index, next.length - 1)\n }\n\n return { artifacts: next, activeArtifactIndex: nextActive }\n}\n\nfunction upsertArtifactState(state: UiState, target: PreviewTarget, options?: UpsertArtifactOptions) {\n const reveal = options?.reveal ?? true\n const activate = options?.activate ?? true\n const targetKey = target.key ?? target.title\n const applyUiState = (partial: {\n artifacts: PreviewTarget[]\n activeArtifactIndex?: number\n }) => ({\n ...partial,\n ...(reveal ? { rightPanelCollapsed: false, activeRightTab: \"preview\" as const } : {}),\n })\n\n const existing = state.artifacts.findIndex((artifact) => targetKey && (artifact.key ?? artifact.title) === targetKey)\n if (existing >= 0) {\n const updated = [...state.artifacts]\n updated[existing] = target\n return applyUiState({\n artifacts: updated,\n activeArtifactIndex: activate ? existing : state.activeArtifactIndex,\n })\n }\n\n const next = [...state.artifacts, target]\n return applyUiState({\n artifacts: next,\n activeArtifactIndex: activate ? next.length - 1 : state.activeArtifactIndex >= 0 ? state.activeArtifactIndex : 0,\n })\n}\n\nexport const useUiStore = create<UiState>()((set) => ({\n ...createClientActions(set),\n leftPanelSize: 20,\n rightPanelSize: 25,\n leftPanelCollapsed: false,\n rightPanelCollapsed: false,\n activeRightTab: \"situation\",\n artifacts: [],\n activeArtifactIndex: -1,\n theme: storedTheme,\n\n setLeftPanelSize: (size) => set({ leftPanelSize: size }),\n setRightPanelSize: (size) => set({ rightPanelSize: size }),\n setLeftPanelCollapsed: (collapsed) => set({ leftPanelCollapsed: collapsed }),\n setRightPanelCollapsed: (collapsed) => set({ rightPanelCollapsed: collapsed }),\n toggleLeftPanel: () => set((s) => ({ leftPanelCollapsed: !s.leftPanelCollapsed })),\n toggleRightPanel: () => set((s) => ({ rightPanelCollapsed: !s.rightPanelCollapsed })),\n setActiveRightTab: (tab) => set({ activeRightTab: tab }),\n\n pushArtifact: (target) => set((state) => upsertArtifactState(state, target)),\n\n upsertArtifact: (target, options) => set((state) => upsertArtifactState(state, target, options)),\n\n setActiveArtifact: (index) => set({ activeArtifactIndex: index }),\n\n closeArtifact: (index) => set((state) => removeArtifactAtIndex(state, index)),\n\n removeArtifactByKey: (key) =>\n set((state) => {\n const index = state.artifacts.findIndex((artifact) => (artifact.key ?? artifact.title) === key)\n if (index < 0) return state\n return removeArtifactAtIndex(state, index)\n }),\n\n clearArtifacts: () => set({ artifacts: [], activeArtifactIndex: -1 }),\n\n setPreviewTarget: (target: PreviewTarget | null) =>\n set(() => {\n if (target === null) {\n return { artifacts: [], activeArtifactIndex: -1 }\n }\n // Push as single artifact\n return {\n artifacts: [target],\n activeArtifactIndex: 0,\n rightPanelCollapsed: false,\n activeRightTab: \"preview\",\n }\n }),\n\n setTheme: (theme: ThemeValue) => {\n localStorage.setItem(\"blade-theme\", theme)\n applyTheme(theme)\n set({ theme })\n },\n}))\n","import { create } from \"zustand\"\nimport type { Task } from \"../schemas/task\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nconst EMPTY_TASKS: Task[] = []\n\ninterface TaskState extends ClientAwareState {\n tasks: Record<string, Task[]>\n setTasks: (sessionId: string, tasks: Task[]) => void\n getTasks: (sessionId: string) => Task[]\n}\n\nexport const useTaskStore = create<TaskState>()((set, get) => ({\n ...createClientActions(set),\n tasks: {},\n\n setTasks: (sessionId, tasks) => {\n set((state) => ({\n tasks: { ...state.tasks, [sessionId]: tasks },\n }))\n },\n\n getTasks: (sessionId) => {\n return get().tasks[sessionId] ?? EMPTY_TASKS\n },\n}))\n","import { create } from \"zustand\"\nimport type { BackgroundTask } from \"../schemas/background\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\ninterface BackgroundState extends ClientAwareState {\n tasks: Record<string, BackgroundTask[]>\n selectedTaskId: Record<string, string | null>\n setTasks: (sessionId: string, tasks: BackgroundTask[]) => void\n upsertTask: (sessionId: string, task: BackgroundTask) => void\n selectTask: (sessionId: string, taskId: string | null) => void\n}\n\nexport const useBackgroundStore = create<BackgroundState>()((set) => ({\n ...createClientActions(set),\n tasks: {},\n selectedTaskId: {},\n\n setTasks: (sessionId, tasks) =>\n set((state) => ({\n tasks: { ...state.tasks, [sessionId]: tasks },\n selectedTaskId: {\n ...state.selectedTaskId,\n [sessionId]: state.selectedTaskId[sessionId] ?? tasks[0]?.id ?? null,\n },\n })),\n\n upsertTask: (sessionId, task) =>\n set((state) => {\n const existing = state.tasks[sessionId] ?? []\n const index = existing.findIndex((item) => item.id === task.id)\n const next = [...existing]\n if (index >= 0) {\n next[index] = { ...next[index], ...task }\n } else {\n next.unshift(task)\n }\n return {\n tasks: { ...state.tasks, [sessionId]: next },\n selectedTaskId: {\n ...state.selectedTaskId,\n [sessionId]: state.selectedTaskId[sessionId] ?? task.id,\n },\n }\n }),\n\n selectTask: (sessionId, taskId) =>\n set((state) => ({\n selectedTaskId: { ...state.selectedTaskId, [sessionId]: taskId },\n })),\n}))\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\ninterface CardStateStore extends ClientAwareState {\n states: Record<string, unknown>\n getCardState: <T>(cardId: string) => T | undefined\n setCardState: <T>(cardId: string, state: T) => void\n removeCardState: (cardId: string) => void\n clearAllStates: () => void\n}\n\nexport const useCardStateStore = create<CardStateStore>((set, get) => ({\n ...createClientActions(set),\n states: {},\n\n getCardState: <T,>(cardId: string): T | undefined => {\n return get().states[cardId] as T | undefined\n },\n\n setCardState: <T,>(cardId: string, state: T) => {\n set((prev) => ({\n states: { ...prev.states, [cardId]: state },\n }))\n },\n\n removeCardState: (cardId: string) => {\n set((prev) => {\n const { [cardId]: _, ...rest } = prev.states\n return { states: rest }\n })\n },\n\n clearAllStates: () => {\n set({ states: {} })\n },\n}))\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nexport type ConnectionStatus = \"connecting\" | \"connected\" | \"disconnected\"\n\nexport interface ConnectionState extends ClientAwareState {\n status: ConnectionStatus\n reconnectAttempt: number\n lastConnectedAt: number | null\n lastDisconnectedAt: number | null\n hasEverConnected: boolean\n markConnecting: (attempt?: number) => void\n markConnected: () => void\n markDisconnected: () => void\n reset: () => void\n}\n\nconst initialConnectionState = {\n status: \"disconnected\" as ConnectionStatus,\n reconnectAttempt: 0,\n lastConnectedAt: null,\n lastDisconnectedAt: null,\n hasEverConnected: false,\n}\n\nexport const useConnectionStore = create<ConnectionState>()((set) => ({\n ...createClientActions(set),\n ...initialConnectionState,\n\n markConnecting: (attempt = 0) =>\n set({\n status: \"connecting\",\n reconnectAttempt: attempt,\n }),\n\n markConnected: () =>\n set({\n status: \"connected\",\n reconnectAttempt: 0,\n lastConnectedAt: Date.now(),\n hasEverConnected: true,\n }),\n\n markDisconnected: () =>\n set({\n status: \"disconnected\",\n reconnectAttempt: 0,\n lastDisconnectedAt: Date.now(),\n }),\n\n reset: () => set(initialConnectionState),\n}))\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nexport interface RuntimeEvent {\n id: string\n sessionId: string\n type: string\n title: string\n status: \"info\" | \"running\" | \"done\" | \"error\"\n timestamp: string\n loopName?: string\n detail?: string\n}\n\ninterface RuntimeState extends ClientAwareState {\n events: Record<string, RuntimeEvent[]>\n addEvent: (sessionId: string, event: Omit<RuntimeEvent, \"id\" | \"sessionId\" | \"timestamp\">) => void\n clearSession: (sessionId: string) => void\n}\n\nexport const useRuntimeStore = create<RuntimeState>()((set) => ({\n ...createClientActions(set),\n events: {},\n\n addEvent: (sessionId, event) =>\n set((state) => {\n const current = state.events[sessionId] ?? []\n const nextEvent: RuntimeEvent = {\n ...event,\n id: `${Date.now()}-${current.length}`,\n sessionId,\n timestamp: new Date().toISOString(),\n }\n return {\n events: {\n ...state.events,\n [sessionId]: [...current.slice(-59), nextEvent],\n },\n }\n }),\n\n clearSession: (sessionId) =>\n set((state) => ({\n events: { ...state.events, [sessionId]: [] },\n })),\n}))\n","import { create } from \"zustand\"\nimport type { GisGoal, GisMapCommand, GisResource, GisTarget } from \"../schemas/gis\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nconst EMPTY_GOALS: GisGoal[] = []\nconst EMPTY_RESOURCES: GisResource[] = []\nconst EMPTY_TARGETS: GisTarget[] = []\nconst EMPTY_COMMANDS: GisMapCommand[] = []\n\ninterface GisStateStore extends ClientAwareState {\n goalsBySession: Record<string, GisGoal[]>\n resourcesBySession: Record<string, GisResource[]>\n targetsBySession: Record<string, GisTarget[]>\n pendingMapCommandsBySession: Record<string, GisMapCommand[]>\n setGoals: (sessionId: string, goals: GisGoal[]) => void\n setResources: (sessionId: string, resources: GisResource[]) => void\n setTargets: (sessionId: string, targets: GisTarget[]) => void\n pushMapCommand: (\n sessionId: string,\n command: Omit<GisMapCommand, \"id\" | \"createdAt\">,\n ) => void\n consumeMapCommand: (sessionId: string, commandId: string) => void\n getGoals: (sessionId: string) => GisGoal[]\n getResources: (sessionId: string) => GisResource[]\n getTargets: (sessionId: string) => GisTarget[]\n getPendingMapCommands: (sessionId: string) => GisMapCommand[]\n}\n\nfunction newCommandId() {\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n return globalThis.crypto?.randomUUID?.() ?? `gis-map-${Date.now()}-${Math.random()}`\n }\n return `gis-map-${Date.now()}-${Math.random()}`\n}\n\nexport const useGisStore = create<GisStateStore>()((set, get) => ({\n ...createClientActions(set),\n goalsBySession: {},\n resourcesBySession: {},\n targetsBySession: {},\n pendingMapCommandsBySession: {},\n\n setGoals: (sessionId, goals) => {\n set((state) => ({\n goalsBySession: { ...state.goalsBySession, [sessionId]: goals },\n }))\n },\n\n setResources: (sessionId, resources) => {\n set((state) => ({\n resourcesBySession: { ...state.resourcesBySession, [sessionId]: resources },\n }))\n },\n\n setTargets: (sessionId, targets) => {\n set((state) => ({\n targetsBySession: { ...state.targetsBySession, [sessionId]: targets },\n }))\n },\n\n pushMapCommand: (sessionId, command) => {\n set((state) => ({\n pendingMapCommandsBySession: {\n ...state.pendingMapCommandsBySession,\n [sessionId]: [\n ...(state.pendingMapCommandsBySession[sessionId] ?? EMPTY_COMMANDS),\n {\n ...command,\n id: newCommandId(),\n createdAt: Date.now(),\n },\n ],\n },\n }))\n },\n\n consumeMapCommand: (sessionId, commandId) => {\n set((state) => ({\n pendingMapCommandsBySession: {\n ...state.pendingMapCommandsBySession,\n [sessionId]: (state.pendingMapCommandsBySession[sessionId] ?? EMPTY_COMMANDS).filter(\n (command) => command.id !== commandId,\n ),\n },\n }))\n },\n\n getGoals: (sessionId) => get().goalsBySession[sessionId] ?? EMPTY_GOALS,\n getResources: (sessionId) => get().resourcesBySession[sessionId] ?? EMPTY_RESOURCES,\n getTargets: (sessionId) => get().targetsBySession[sessionId] ?? EMPTY_TARGETS,\n getPendingMapCommands: (sessionId) =>\n get().pendingMapCommandsBySession[sessionId] ?? EMPTY_COMMANDS,\n}))\n","import { create } from \"zustand\"\nimport type { AskUserAnswerData } from \"../components/chat/AskUserQuestionBlock\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nexport type AnswerCallback = (\n answer: string,\n toolCallId: string,\n answerData: AskUserAnswerData,\n) => void\n\ninterface AnswerCallbackState extends ClientAwareState {\n callbacks: Record<string, AnswerCallback | undefined>\n setAnswerCallback: (sessionId: string, callback?: AnswerCallback) => void\n}\n\nexport const useAnswerCallbackStore = create<AnswerCallbackState>()((set) => ({\n ...createClientActions(set),\n callbacks: {},\n setAnswerCallback: (sessionId, callback) => {\n set((state) => ({\n callbacks: {\n ...state.callbacks,\n [sessionId]: callback,\n },\n }))\n },\n}))\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nexport type AsrProvider = \"volcengine\" | \"qwen\"\n\ninterface RuntimeFeaturesState extends ClientAwareState {\n asrEnabled: boolean\n asrProvider: AsrProvider\n publicSharingEnabled: boolean\n memoryEnabled: boolean\n setFeatures: (features: {\n asrEnabled?: boolean\n asrProvider?: AsrProvider\n publicSharingEnabled?: boolean\n memoryEnabled?: boolean\n }) => void\n}\n\n/**\n * 运行期特性开关(由后端 /api/config 下发)。默认全部关闭,main.tsx 启动时 fetch 一次填充。\n */\nexport const useRuntimeFeaturesStore = create<RuntimeFeaturesState>((set) => ({\n ...createClientActions(set),\n asrEnabled: false,\n asrProvider: \"volcengine\",\n publicSharingEnabled: false,\n memoryEnabled: false,\n setFeatures: (features) =>\n set((prev) => ({\n asrEnabled: features.asrEnabled ?? prev.asrEnabled,\n asrProvider: features.asrProvider ?? prev.asrProvider,\n publicSharingEnabled:\n features.publicSharingEnabled ?? prev.publicSharingEnabled,\n memoryEnabled: features.memoryEnabled ?? prev.memoryEnabled,\n })),\n}))\n","import { BladeClient, type BladeClientOptions } from \"../client\"\nimport { attachHostBridgeListener } from \"./lib/parent-bridge\"\nimport { bridgeSocketEvents } from \"./sockets/event-bridge\"\nimport { useAnswerCallbackStore } from \"./stores/answer-callback-store\"\nimport { useAuthStore } from \"./stores/auth-store\"\nimport { useBackgroundStore } from \"./stores/background-store\"\nimport { useCardStateStore } from \"./stores/card-state-store\"\nimport { useChatStore } from \"./stores/chat-store\"\nimport { useConnectionStore } from \"./stores/connection-store\"\nimport { useGisStore } from \"./stores/gis-store\"\nimport { useRuntimeFeaturesStore } from \"./stores/runtime-features-store\"\nimport { useRuntimeStore } from \"./stores/runtime-store\"\nimport { useSessionStore } from \"./stores/session-store\"\nimport { useTaskStore } from \"./stores/task-store\"\nimport { useUiBridgeStore } from \"./stores/ui-bridge-store\"\nimport { useUiStore } from \"./stores/ui-store\"\n\nlet bootstrappedClient: BladeClient | null = null\nlet detachHostBridgeListener: (() => void) | null = null\n\nconst stores = {\n answerCallback: useAnswerCallbackStore,\n auth: useAuthStore,\n background: useBackgroundStore,\n cardState: useCardStateStore,\n chat: useChatStore,\n connection: useConnectionStore,\n gis: useGisStore,\n runtime: useRuntimeStore,\n runtimeFeatures: useRuntimeFeaturesStore,\n session: useSessionStore,\n task: useTaskStore,\n ui: useUiStore,\n uiBridge: useUiBridgeStore,\n}\n\nexport function attachClientToStores(client: BladeClient): void {\n for (const store of Object.values(stores)) {\n const state = (store as { getState: () => { setClient: (client: BladeClient) => void } }).getState()\n state.setClient(client)\n }\n bridgeSocketEvents(client, stores)\n detachHostBridgeListener?.()\n detachHostBridgeListener = attachHostBridgeListener(() => {\n const activeSessionId = useSessionStore.getState().activeSessionId\n return {\n sessionId: activeSessionId,\n activeSessionId,\n isStreaming: activeSessionId\n ? (useChatStore.getState().isStreaming[activeSessionId] ?? false)\n : false,\n }\n })\n}\n\nexport function bootstrapBladeClient(options: BladeClientOptions): BladeClient {\n const client = new BladeClient(withStoreAuth(options))\n if (options.token === undefined) {\n client._attachStoreRestTokenResolver(() => useAuthStore.getState().token)\n client._attachStoreSocketTokenResolver(() => {\n const auth = useAuthStore.getState()\n return auth.token ?? auth.socketAuthToken\n })\n }\n attachClientToStores(client)\n bootstrappedClient = client\n return client\n}\n\nexport function getBootstrappedClient(): BladeClient {\n if (!bootstrappedClient) {\n throw new Error(\"bootstrapBladeClient() must be called before any SDK usage\")\n }\n return bootstrappedClient\n}\n\nfunction withStoreAuth(options: BladeClientOptions): BladeClientOptions {\n if (options.token !== undefined) {\n return options\n }\n return {\n ...options,\n onRefreshSuccess: async () => {\n await options.onRefreshSuccess?.()\n useAuthStore.setState({ token: null })\n },\n }\n}\n","import type { BladeClient, BladeClientOptions } from \"../../client\"\nimport { getBootstrappedClient } from \"../bootstrap\"\n\nexport function getBaseUrl(): string {\n return getClient().options.baseUrl\n}\n\nexport function getAuthedUrl(path: string): string {\n return getClient().buildAuthedUrl(path)\n}\n\nexport async function apiFetch<T>(path: string, init?: RequestInit): Promise<T> {\n return getClient().jsonFromInit<T>(path, init)\n}\n\nexport async function apiFetchText(path: string, init?: RequestInit): Promise<string> {\n return getClient().textFromInit(path, init)\n}\n\nexport async function apiFetchResponse(path: string, init?: RequestInit): Promise<Response> {\n return getClient().responseFromInit(path, init)\n}\n\nexport function getClient(): BladeClient {\n return getBootstrappedClient()\n}\n\nexport type { BladeClientOptions }\n","import type { SessionsResource } from \"../../client/resources/sessions\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/sessions\"\n\nconst r = (): SessionsResource => getClient().sessions\n\nexport const listSessions = (...args: Parameters<SessionsResource[\"listSessions\"]>) => r().listSessions(...args)\nexport const listSessionsPaginated = (...args: Parameters<SessionsResource[\"listSessionsPaginated\"]>) => r().listSessionsPaginated(...args)\nexport const listSessionsWithSkillData = (...args: Parameters<SessionsResource[\"listSessionsWithSkillData\"]>) => r().listSessionsWithSkillData(...args)\nexport const createSession = (...args: Parameters<SessionsResource[\"createSession\"]>) => r().createSession(...args)\nexport const createSessionWithRequest = (...args: Parameters<SessionsResource[\"createSessionWithRequest\"]>) => r().createSessionWithRequest(...args)\nexport const getSession = (...args: Parameters<SessionsResource[\"getSession\"]>) => r().getSession(...args)\nexport const updateSession = (...args: Parameters<SessionsResource[\"updateSession\"]>) => r().updateSession(...args)\nexport const pinSession = (...args: Parameters<SessionsResource[\"pinSession\"]>) => r().pinSession(...args)\nexport const startReplaySession = (...args: Parameters<SessionsResource[\"startReplaySession\"]>) => r().startReplaySession(...args)\nexport const updateReplaySession = (...args: Parameters<SessionsResource[\"updateReplaySession\"]>) => r().updateReplaySession(...args)\nexport const updateSharing = (...args: Parameters<SessionsResource[\"updateSharing\"]>) => r().updateSharing(...args)\nexport const updateSessionMemory = (...args: Parameters<SessionsResource[\"updateSessionMemory\"]>) => r().updateSessionMemory(...args)\nexport const createShare = (...args: Parameters<SessionsResource[\"createShare\"]>) => r().createShare(...args)\nexport const revokeShare = (...args: Parameters<SessionsResource[\"revokeShare\"]>) => r().revokeShare(...args)\nexport const getSharedSession = (...args: Parameters<SessionsResource[\"getSharedSession\"]>) => r().getSharedSession(...args)\nexport const getSessionTasks = (...args: Parameters<SessionsResource[\"getSessionTasks\"]>) => r().getSessionTasks(...args)\nexport const getSessionTurns = (...args: Parameters<SessionsResource[\"getSessionTurns\"]>) => r().getSessionTurns(...args)\nexport const getSessionContextStats = (...args: Parameters<SessionsResource[\"getSessionContextStats\"]>) => r().getSessionContextStats(...args)\nexport const getSessionHistory = (...args: Parameters<SessionsResource[\"getSessionHistory\"]>) => r().getSessionHistory(...args)\nexport const tokenizePrompt = (...args: Parameters<SessionsResource[\"tokenizePrompt\"]>) => r().tokenizePrompt(...args)\nexport const tokenizeMessages = (...args: Parameters<SessionsResource[\"tokenizeMessages\"]>) => r().tokenizeMessages(...args)\nexport const getSessionCheckpoints = (...args: Parameters<SessionsResource[\"getSessionCheckpoints\"]>) => r().getSessionCheckpoints(...args)\nexport const checkoutSession = (...args: Parameters<SessionsResource[\"checkoutSession\"]>) => r().checkoutSession(...args)\nexport const rewindSession = (...args: Parameters<SessionsResource[\"rewindSession\"]>) => r().rewindSession(...args)\nexport const switchBranch = (...args: Parameters<SessionsResource[\"switchBranch\"]>) => r().switchBranch(...args)\nexport const deleteSession = (...args: Parameters<SessionsResource[\"deleteSession\"]>) => r().deleteSession(...args)\nexport const listBackgroundTasks = (...args: Parameters<SessionsResource[\"listBackgroundTasks\"]>) => r().listBackgroundTasks(...args)\nexport const getBackgroundTask = (...args: Parameters<SessionsResource[\"getBackgroundTask\"]>) => r().getBackgroundTask(...args)\nexport const stopBackgroundTask = (...args: Parameters<SessionsResource[\"stopBackgroundTask\"]>) => r().stopBackgroundTask(...args)\nexport const listDir = (...args: Parameters<SessionsResource[\"listDir\"]>) => r().listDir(...args)\nexport const uploadFiles = (...args: Parameters<SessionsResource[\"uploadFiles\"]>) => r().uploadFiles(...args)\nexport const deleteFile = (...args: Parameters<SessionsResource[\"deleteFile\"]>) => r().deleteFile(...args)\nexport const writeFile = (...args: Parameters<SessionsResource[\"writeFile\"]>) => r().writeFile(...args)\nexport const renameFile = (...args: Parameters<SessionsResource[\"renameFile\"]>) => r().renameFile(...args)\nexport const copyFile = (...args: Parameters<SessionsResource[\"copyFile\"]>) => r().copyFile(...args)\nexport const shareFile = (...args: Parameters<SessionsResource[\"shareFile\"]>) => r().shareFile(...args)\nexport const getDownloadDirUrl = (...args: Parameters<SessionsResource[\"getDownloadDirUrl\"]>) => r().getDownloadDirUrl(...args)\nexport const exportSession = (...args: Parameters<SessionsResource[\"exportSession\"]>) => r().exportSession(...args)\nexport const previewImport = (...args: Parameters<SessionsResource[\"previewImport\"]>) => r().previewImport(...args)\nexport const importSession = (...args: Parameters<SessionsResource[\"importSession\"]>) => r().importSession(...args)\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport async function copyToClipboard(text: string): Promise<boolean> {\n if (navigator.clipboard) {\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch {\n // fall through to textarea fallback\n }\n }\n // Fallback for insecure contexts (HTTP non-localhost)\n const textarea = document.createElement(\"textarea\")\n textarea.value = text\n textarea.style.position = \"fixed\"\n textarea.style.opacity = \"0\"\n document.body.appendChild(textarea)\n textarea.select()\n try {\n return document.execCommand(\"copy\")\n } finally {\n document.body.removeChild(textarea)\n }\n}\n","import * as sessionsApi from \"../../api/sessions\"\nimport { cn } from \"../../lib/utils\"\nimport type { SessionInfo } from \"../../schemas/session\"\nimport { useChatStore } from \"../../stores/chat-store\"\nimport { useSessionStore } from \"../../stores/session-store\"\nimport * as Tooltip from \"@radix-ui/react-tooltip\"\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\"\nimport { HelpCircle } from \"lucide-react\"\nimport { useEffect, useMemo, useRef, useState } from \"react\"\n\ntype CheckpointTree = Awaited<ReturnType<typeof sessionsApi.getSessionCheckpoints>>\ntype CheckpointNode = CheckpointTree[\"nodes\"][number]\n\nconst ROW_HEIGHT = 32\nconst SVG_WIDTH = 44\n\ninterface LayoutNode {\n id: string\n column: number\n row: number\n parentRow: number | null\n parentColumn: number | null\n isActive: boolean\n isCurrent: boolean\n isVirtual: boolean\n preview: string\n content: string\n}\n\ninterface LayoutGraph {\n nodes: LayoutNode[]\n hasCycle: boolean\n maxColumn: number\n maxRow: number\n}\n\nexport function SessionDetailTrigger({\n onClick,\n showReplayDot = false,\n}: {\n onClick: () => void\n showReplayDot?: boolean\n}) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex items-center gap-1.5 text-[10px] font-medium tracking-[0.18em] text-[hsl(var(--muted-foreground))] uppercase transition-colors hover:text-[hsl(var(--foreground))]\"\n >\n <span>历史回溯</span>\n <HelpCircle size={12} />\n </button>\n {showReplayDot ? (\n <Tooltip.Provider delayDuration={150}>\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <span\n className=\"h-[5px] w-[5px] shrink-0 rounded-full bg-amber-400\"\n aria-label=\"当前属于回放模式\"\n />\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content\n side=\"top\"\n className=\"z-[60] rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--popover))] px-2 py-1 text-[11px] text-[hsl(var(--popover-foreground))] shadow-lg\"\n >\n 当前属于回放模式\n <Tooltip.Arrow className=\"fill-[hsl(var(--popover))]\" />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n </Tooltip.Provider>\n ) : null}\n </div>\n )\n}\n\nexport function SessionDetail({ session }: { session: SessionInfo }) {\n const [pendingNodeId, setPendingNodeId] = useState<string | null>(null)\n const isStreaming = useChatStore((state) => state.isStreaming[session.id] ?? false)\n const setRewindDraft = useSessionStore((state) => state.setRewindDraft)\n const setActiveSession = useSessionStore((state) => state.setActiveSession)\n const queryClient = useQueryClient()\n const { data: tree } = useQuery({\n queryKey: [\"checkpoints\", session.id],\n queryFn: ({ signal }) => sessionsApi.getSessionCheckpoints(session.id, { signal }),\n })\n const prevStreamingRef = useRef(isStreaming)\n useEffect(() => {\n if (prevStreamingRef.current && !isStreaming) {\n void queryClient.invalidateQueries({ queryKey: [\"checkpoints\", session.id] })\n }\n prevStreamingRef.current = isStreaming\n }, [isStreaming, queryClient, session.id])\n\n const hasHistory = (tree?.nodes.length ?? 0) > 0\n const layout = useMemo(() => buildLayoutNodes(tree), [tree])\n const nodeMap = useMemo(\n () => new Map((tree?.nodes ?? []).map((node) => [node.id, node])),\n [tree],\n )\n const isBusy = isStreaming || pendingNodeId !== null\n const graphHeight = Math.max((layout.maxRow + 1) * ROW_HEIGHT, ROW_HEIGHT)\n const graphWidth = Math.max(SVG_WIDTH, getColumnX(layout.maxColumn) + 12)\n\n async function checkoutNode(node: CheckpointNode, position: \"before\" | \"turn_end\") {\n if (isBusy) {\n return\n }\n\n setPendingNodeId(node.id)\n\n try {\n const result = await sessionsApi.checkoutSession(session.id, node.id, position)\n if (result.position === \"before\" && result.content.trim()) {\n setRewindDraft(session.id, result.content)\n } else {\n // turn_end: clear input by setting empty string (null = no-op in ChatInput)\n setRewindDraft(session.id, \"\")\n }\n setActiveSession(session.id)\n await queryClient.invalidateQueries({ queryKey: [\"checkpoints\", session.id] })\n } finally {\n setPendingNodeId(null)\n }\n }\n\n async function handleVirtualClick(node: LayoutNode) {\n if (isBusy || !node.isVirtual) return\n const leafId = node.content\n if (!leafId) return\n if (node.isActive) return\n const sourceNode = nodeMap.get(leafId)\n if (!sourceNode) return\n await checkoutNode(sourceNode, \"turn_end\")\n }\n\n async function handleNodeSelect(node: LayoutNode) {\n if (isBusy) {\n return\n }\n\n const sourceNode = nodeMap.get(node.id)\n if (!sourceNode) {\n return\n }\n\n await checkoutNode(sourceNode, \"before\")\n }\n\n if (!hasHistory) return null\n\n return (\n <Tooltip.Provider delayDuration={200}>\n <div className=\"flex max-h-52 justify-center overflow-x-auto overflow-y-auto\">\n <div className=\"relative\" style={{ height: graphHeight, width: graphWidth }}>\n <svg\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute left-0 top-0 z-10 overflow-visible\"\n width={graphWidth}\n height={graphHeight}\n viewBox={`0 0 ${graphWidth} ${graphHeight}`}\n fill=\"none\"\n >\n {layout.nodes.map((node) => {\n if (node.parentRow == null || node.parentColumn == null) {\n return null\n }\n\n const childStroke = node.isActive\n ? \"hsl(var(--primary))\"\n : \"hsl(var(--muted-foreground))\"\n\n return (\n <path\n key={`path-${node.id}`}\n d={buildEdgePath(\n getColumnX(node.parentColumn),\n getRowY(node.parentRow),\n getColumnX(node.column),\n getRowY(node.row),\n )}\n stroke={childStroke}\n strokeOpacity={node.isActive ? 0.95 : 0.45}\n strokeWidth={node.isActive ? 1.8 : 1.4}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray={node.isVirtual ? \"3 3\" : undefined}\n />\n )\n })}\n </svg>\n\n <div className=\"relative z-0 h-full\">\n {layout.nodes.map((node) => {\n const isPendingNode = pendingNodeId === node.id\n const color = node.isActive\n ? \"hsl(var(--primary))\"\n : \"hsl(var(--muted-foreground))\"\n const previewText = node.isVirtual\n ? isPendingNode\n ? \"切换中...\"\n : \"\"\n : isPendingNode\n ? \"切换中...\"\n : node.preview\n const shouldShowTooltip = !node.isVirtual || Boolean(previewText)\n const button = (\n <button\n type=\"button\"\n onClick={() =>\n void (node.isVirtual ? handleVirtualClick(node) : handleNodeSelect(node))\n }\n disabled={isBusy}\n aria-current={!node.isVirtual && node.isCurrent ? \"step\" : undefined}\n aria-label={node.isVirtual ? \"切换到该分支\" : node.preview}\n className={cn(\n \"absolute z-20 h-8 w-6 overflow-visible\",\n isBusy ? \"cursor-not-allowed opacity-60\" : \"cursor-pointer\",\n )}\n style={{\n top: node.row * ROW_HEIGHT,\n left: getColumnX(node.column) - 12,\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"absolute left-0 top-0 h-8 w-6\"\n >\n <svg\n aria-hidden=\"true\"\n role=\"img\"\n className=\"pointer-events-none absolute left-0 top-0 h-full w-full overflow-visible\"\n width={24}\n height={ROW_HEIGHT}\n viewBox={`0 0 24 ${ROW_HEIGHT}`}\n fill=\"none\"\n >\n {node.isVirtual ? (\n <circle\n cx={12}\n cy={ROW_HEIGHT / 2}\n r={3.5}\n fill=\"none\"\n stroke={color}\n strokeWidth={1.2}\n strokeDasharray=\"2 2\"\n opacity={0.7}\n />\n ) : (\n <g>\n {node.isCurrent ? (\n <circle\n cx={12}\n cy={ROW_HEIGHT / 2}\n r={9}\n fill={color}\n opacity={0.18}\n />\n ) : null}\n <circle\n cx={12}\n cy={ROW_HEIGHT / 2}\n r={node.isCurrent ? 5.5 : 4}\n fill={color}\n />\n </g>\n )}\n </svg>\n </span>\n </button>\n )\n\n if (!shouldShowTooltip) {\n return <div key={node.id}>{button}</div>\n }\n\n return (\n <Tooltip.Root key={node.id}>\n <Tooltip.Trigger asChild>{button}</Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content\n side=\"right\"\n sideOffset={8}\n className={cn(\n \"rounded-md border border-border bg-popover px-2 py-1 text-xs text-foreground shadow-md\",\n !node.isVirtual && node.isCurrent && \"font-semibold\",\n )}\n >\n {previewText}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )\n })}\n </div>\n </div>\n </div>\n </Tooltip.Provider>\n )\n}\n\nfunction buildLayoutNodes(tree: CheckpointTree | undefined): LayoutGraph {\n if (!tree || tree.nodes.length === 0) {\n return { nodes: [], hasCycle: false, maxColumn: 0, maxRow: 0 }\n }\n\n const nodeMap = new Map(tree.nodes.map((node) => [node.id, node]))\n const order = new Map(tree.nodes.map((node, index) => [node.id, index]))\n const childrenMap = new Map<string | null, CheckpointNode[]>()\n\n for (const node of tree.nodes) {\n const parentId = node.parent_id && nodeMap.has(node.parent_id) ? node.parent_id : null\n const siblings = childrenMap.get(parentId) ?? []\n siblings.push(node)\n childrenMap.set(parentId, siblings)\n }\n\n const activeIds = new Set<string>()\n const activeVisited = new Set<string>()\n const leafId = tree.leaf_id\n let current = tree.leaf_id\n\n while (current && nodeMap.has(current) && !activeVisited.has(current)) {\n activeIds.add(current)\n activeVisited.add(current)\n current = nodeMap.get(current)?.parent_id ?? null\n }\n\n const layoutNodes: LayoutNode[] = []\n const placed = new Set<string>()\n const visiting = new Set<string>()\n let nextColumn = 1\n let maxColumn = 0\n let maxRow = 0\n let hasCycle = false\n\n const rootSort = (a: CheckpointNode, b: CheckpointNode) =>\n (order.get(a.id) ?? 0) - (order.get(b.id) ?? 0)\n\n const childSort = (a: CheckpointNode, b: CheckpointNode) =>\n (order.get(a.id) ?? 0) - (order.get(b.id) ?? 0)\n\n const allocateColumn = () => {\n const fresh = nextColumn\n nextColumn += 1\n return fresh\n }\n\n function walk(node: CheckpointNode, parent: LayoutNode | null, column: number, row: number) {\n if (visiting.has(node.id)) {\n hasCycle = true\n return\n }\n\n if (placed.has(node.id)) {\n return\n }\n\n visiting.add(node.id)\n maxColumn = Math.max(maxColumn, column)\n maxRow = Math.max(maxRow, row)\n\n const layoutNode: LayoutNode = {\n id: node.id,\n column,\n row,\n parentRow: parent?.row ?? null,\n parentColumn: parent?.column ?? null,\n isActive: activeIds.has(node.id),\n isCurrent: node.id === leafId,\n isVirtual: false,\n preview: formatPreview(node.content_preview),\n content: node.content,\n }\n\n layoutNodes.push(layoutNode)\n placed.add(node.id)\n\n const children = [...(childrenMap.get(node.id) ?? [])].sort(childSort)\n\n if (children.length === 0) {\n const virtualRow = row + 1\n maxRow = Math.max(maxRow, virtualRow)\n layoutNodes.push({\n id: `__virtual__${node.id}`,\n column,\n row: virtualRow,\n parentRow: layoutNode.row,\n parentColumn: layoutNode.column,\n isActive: activeIds.has(node.id),\n isCurrent: false,\n isVirtual: true,\n preview: \"\",\n content: node.id,\n })\n } else {\n for (const [index, child] of children.entries()) {\n if (visiting.has(child.id)) {\n hasCycle = true\n continue\n }\n\n const childColumn = index === 0 ? column : allocateColumn()\n walk(child, layoutNode, childColumn, row + 1)\n }\n }\n\n visiting.delete(node.id)\n }\n\n const roots = [...(childrenMap.get(null) ?? [])].sort(rootSort)\n for (const [index, root] of roots.entries()) {\n const rootColumn = index === 0 ? 0 : allocateColumn()\n walk(root, null, rootColumn, 0)\n }\n\n for (const node of [...tree.nodes].sort(rootSort)) {\n if (!placed.has(node.id)) {\n hasCycle = true\n const rootColumn = layoutNodes.length === 0 ? 0 : allocateColumn()\n walk(node, null, rootColumn, 0)\n }\n }\n\n return {\n nodes: layoutNodes,\n hasCycle,\n maxColumn,\n maxRow,\n }\n}\n\nfunction formatPreview(preview: string): string {\n const normalized = preview.replace(/\\s+/g, \" \").trim()\n return normalized.length > 0 ? normalized : \"(空消息)\"\n}\n\nfunction getColumnX(column: number): number {\n return 12 + column * 24\n}\n\nfunction getRowY(row: number): number {\n return row * ROW_HEIGHT + ROW_HEIGHT / 2\n}\n\nfunction buildEdgePath(fromX: number, fromY: number, toX: number, toY: number): string {\n if (fromX === toX || fromY === toY) {\n return `M ${fromX} ${fromY} L ${toX} ${toY}`\n }\n\n // Branch line: horizontal from parent to child column, then vertical down\n const r = Math.min(5, Math.abs(toX - fromX), Math.abs(toY - fromY))\n const dx = toX > fromX ? 1 : -1\n\n return [\n `M ${fromX} ${fromY}`,\n `H ${toX - dx * r}`,\n `A ${r} ${r} 0 0 ${dx > 0 ? 1 : 0} ${toX} ${fromY + r}`,\n `V ${toY}`,\n ].join(\" \")\n}\n","import { Plus } from \"lucide-react\"\nimport { useState } from \"react\"\nimport type { SessionInfo } from \"../../schemas/session\"\nimport { useSession } from \"../../hooks/use-session\"\nimport { SessionListItem } from \"./SessionListItem\"\nimport { shouldShowSessionInHistory } from \"./session-utils\"\n\nexport interface SessionListProps {\n sessions: SessionInfo[]\n /** Called after a new session is created; defaults to no-op. */\n onSessionCreated?: (sessionId: string) => void\n /** Called when user selects a session. */\n onSessionSelect: (sessionId: string) => void\n}\n\nexport function SessionList({ sessions, onSessionCreated, onSessionSelect }: SessionListProps) {\n const { createSession, activeSessionId } = useSession()\n const [error, setError] = useState<string | null>(null)\n\n const handleCreateSession = async () => {\n setError(null)\n try {\n const sessionId = await createSession()\n onSessionCreated?.(sessionId)\n onSessionSelect(sessionId)\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n setError(`创建对话失败: ${message}`)\n setTimeout(() => setError(null), 5000)\n }\n }\n\n return (\n <div className=\"flex flex-col pt-1\">\n <button\n type=\"button\"\n onClick={handleCreateSession}\n className=\"mx-2 mt-1.5 flex items-center gap-2 rounded-md border border-dashed border-[hsl(var(--border))] px-3 py-2 text-sm text-[hsl(var(--muted-foreground))] transition-all hover:border-[hsl(var(--ring))] hover:text-[hsl(var(--primary))]\"\n >\n <Plus size={13} />\n 新建会话\n </button>\n {error ? (\n <p className=\"mx-2 mt-2 rounded-lg bg-[hsl(var(--destructive)/0.1)] px-3 py-2 text-sm text-[hsl(var(--destructive))]\">\n {error}\n </p>\n ) : null}\n <SessionListEntries\n sessions={sessions}\n activeSessionId={activeSessionId}\n onSessionSelect={onSessionSelect}\n />\n </div>\n )\n}\n\nfunction SessionListEntries({\n sessions,\n activeSessionId,\n onSessionSelect,\n}: {\n sessions: SessionInfo[]\n activeSessionId: string | null\n onSessionSelect: (sessionId: string) => void\n}) {\n return (\n <div className=\"mt-2 flex flex-col gap-0.5 px-1.5\">\n {sessions.filter(shouldShowSessionInHistory).map((session) => (\n <SessionListItem\n key={session.id}\n session={session}\n active={session.id === activeSessionId}\n onClick={() => onSessionSelect(session.id)}\n />\n ))}\n </div>\n )\n}\n","import { useSessionStore } from \"../stores/session-store\"\n\nexport function useSession() {\n const sessions = useSessionStore((s) => s.sessions)\n const activeSessionId = useSessionStore((s) => s.activeSessionId)\n const loading = useSessionStore((s) => s.loading)\n const fetchSessions = useSessionStore((s) => s.fetchSessions)\n const createSession = useSessionStore((s) => s.createSession)\n const setActiveSession = useSessionStore((s) => s.setActiveSession)\n const deleteSession = useSessionStore((s) => s.deleteSession)\n\n const activeSession = sessions.find((s) => s.id === activeSessionId) ?? null\n\n return {\n sessions,\n activeSessionId,\n activeSession,\n loading,\n fetchSessions,\n createSession,\n setActiveSession,\n deleteSession,\n }\n}\n","import { Loader2 } from \"lucide-react\"\nimport { cn } from \"../../lib/utils\"\nimport type { SessionInfo } from \"../../schemas/session\"\nimport { StatusBadge } from \"./StatusBadge\"\nimport { getDisplaySessionStatus, getSessionLabel, isReplaySession } from \"./session-utils\"\n\ninterface Props {\n session: SessionInfo\n active: boolean\n onClick: () => void\n}\n\nexport function SessionListItem({ session, active, onClick }: Props) {\n const isReplay = isReplaySession(session)\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"flex w-full flex-col gap-1 rounded-md border-l-2 px-3 py-2 text-left text-sm transition-all hover:bg-[hsl(var(--accent))]\",\n active ? \"border-l-[hsl(var(--primary))] bg-[hsl(var(--accent))]\" : \"border-l-transparent\",\n )}\n >\n <div className=\"flex items-center gap-2\">\n {session.status === \"running\" && (\n <Loader2 size={11} className=\"shrink-0 animate-spin text-blue-400\" />\n )}\n <span className=\"truncate text-[13px] font-medium leading-snug\">{getSessionLabel(session)}</span>\n {isReplay ? (\n <span\n className=\"h-[5px] w-[5px] shrink-0 rounded-full bg-amber-400\"\n title=\"当前属于回放模式\"\n aria-label=\"当前属于回放模式\"\n />\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusBadge status={getDisplaySessionStatus(session)} />\n <span className=\"font-mono text-[10px] text-[hsl(var(--muted-foreground))]\">\n {session.id.slice(0, 8)}\n </span>\n </div>\n </button>\n )\n}\n","import { cn } from \"../../lib/utils\"\n\nconst statusConfig: Record<string, { className: string; label: string }> = {\n created: {\n className: \"bg-[hsl(var(--muted))] text-[hsl(var(--muted-foreground))]\",\n label: \"已创建\",\n },\n running: { className: \"bg-blue-500/15 text-blue-400\", label: \"运行中\" },\n completed: { className: \"bg-emerald-500/15 text-emerald-400\", label: \"已完成\" },\n failed: {\n className: \"bg-[hsl(var(--destructive)/0.15)] text-[hsl(var(--destructive))]\",\n label: \"失败\",\n },\n interrupted: { className: \"bg-amber-500/15 text-amber-400\", label: \"已中断\" },\n waiting_for_input: { className: \"bg-violet-500/15 text-violet-400\", label: \"等待输入\" },\n pending: {\n className: \"bg-[hsl(var(--muted))] text-[hsl(var(--muted-foreground))]\",\n label: \"待处理\",\n },\n in_progress: { className: \"bg-blue-500/15 text-blue-400\", label: \"进行中\" },\n done: { className: \"bg-emerald-500/15 text-emerald-400\", label: \"完成\" },\n info: {\n className: \"bg-[hsl(var(--muted))] text-[hsl(var(--muted-foreground))]\",\n label: \"信息\",\n },\n error: {\n className: \"bg-[hsl(var(--destructive)/0.15)] text-[hsl(var(--destructive))]\",\n label: \"错误\",\n },\n skipped: {\n className: \"bg-[hsl(var(--muted)/0.5)] text-[hsl(var(--muted-foreground)/0.6)]\",\n label: \"已跳过\",\n },\n example: {\n className: \"bg-[hsl(var(--muted))] text-[hsl(var(--muted-foreground))]\",\n label: \"示例\",\n },\n}\n\nconst defaultConfig = {\n className: \"bg-[hsl(var(--muted))] text-[hsl(var(--muted-foreground))]\",\n label: \"\",\n}\n\nexport function StatusBadge({ status }: { status: string }) {\n const config = statusConfig[status] ?? defaultConfig\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium tracking-wide\",\n config.className,\n )}\n >\n {config.label || status}\n </span>\n )\n}\n","import type { SessionInfo } from \"../../schemas/session\"\n\nexport type SessionGroupKey = \"today\" | \"yesterday\" | \"week\" | \"older\"\n\nexport const SESSION_GROUPS: SessionGroupKey[] = [\"today\", \"yesterday\", \"week\", \"older\"]\n\nexport const SESSION_GROUP_LABELS: Record<SessionGroupKey, string> = {\n today: \"今天\",\n yesterday: \"昨天\",\n week: \"本周\",\n older: \"更早\",\n}\n\nexport const RELATIVE_TIME_FORMATTER = new Intl.RelativeTimeFormat(\"zh-CN\", {\n numeric: \"auto\",\n})\n\nexport function getSessionTimestamp(session: SessionInfo) {\n const value = Date.parse(session.updated_at || session.created_at)\n return Number.isNaN(value) ? 0 : value\n}\n\nexport function getSessionLabel(session: SessionInfo, fallback = \"未命名对话\") {\n const normalized = session.intent?.trim()\n return normalized ? normalized : fallback\n}\n\nexport function shouldShowSessionInHistory(session: SessionInfo) {\n return !(session.status === \"created\" && !session.intent.trim())\n}\n\nexport function isReplaySession(session: SessionInfo) {\n return session.replay_state?.status === \"replay\"\n}\n\nexport function getDisplaySessionStatus(session: SessionInfo): SessionInfo[\"status\"] {\n if (\n session.replay_state?.status === \"autonomous\" &&\n session.replay_state.autonomous_reason === \"completed\"\n ) {\n return \"completed\"\n }\n return session.status\n}\n\nexport function startOfDay(date: Date) {\n const copy = new Date(date)\n copy.setHours(0, 0, 0, 0)\n return copy\n}\n\nexport function startOfWeek(date: Date) {\n const copy = startOfDay(date)\n const day = copy.getDay()\n const diff = day === 0 ? 6 : day - 1\n copy.setDate(copy.getDate() - diff)\n return copy\n}\n\nexport function getSessionGroup(timestamp: number, now = new Date()): SessionGroupKey {\n if (!timestamp) {\n return \"older\"\n }\n\n const sessionDate = new Date(timestamp)\n const today = startOfDay(now)\n const yesterday = new Date(today)\n yesterday.setDate(yesterday.getDate() - 1)\n const thisWeek = startOfWeek(now)\n\n if (sessionDate >= today) {\n return \"today\"\n }\n\n if (sessionDate >= yesterday) {\n return \"yesterday\"\n }\n\n if (sessionDate >= thisWeek) {\n return \"week\"\n }\n\n return \"older\"\n}\n\nexport function formatRelativeTime(timestamp: number, now = Date.now()) {\n if (!timestamp) {\n return \"时间未知\"\n }\n\n const diffSeconds = Math.round((timestamp - now) / 1000)\n const absSeconds = Math.abs(diffSeconds)\n\n if (absSeconds < 60) {\n return \"刚刚\"\n }\n\n const units: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n [\"minute\", 60],\n [\"hour\", 60 * 60],\n [\"day\", 60 * 60 * 24],\n [\"week\", 60 * 60 * 24 * 7],\n [\"month\", 60 * 60 * 24 * 30],\n [\"year\", 60 * 60 * 24 * 365],\n ]\n\n for (let index = 0; index < units.length; index += 1) {\n const [unit, threshold] = units[index]\n const nextThreshold = units[index + 1]?.[1]\n\n if (!nextThreshold || absSeconds < nextThreshold) {\n return RELATIVE_TIME_FORMATTER.format(Math.round(diffSeconds / threshold), unit)\n }\n }\n\n return RELATIVE_TIME_FORMATTER.format(Math.round(diffSeconds / (60 * 60 * 24 * 365)), \"year\")\n}\n\nexport function getStatusMeta(status: SessionInfo[\"status\"]) {\n switch (status) {\n case \"running\":\n return {\n dotClass: \"bg-emerald-400\",\n toneClass: \"border-emerald-500/20 bg-emerald-500/8 text-emerald-300\",\n label: \"运行中\",\n }\n case \"failed\":\n return {\n dotClass: \"bg-rose-400\",\n toneClass: \"border-rose-500/20 bg-rose-500/8 text-rose-300\",\n label: \"异常\",\n }\n case \"waiting_for_input\":\n return {\n dotClass: \"bg-violet-400\",\n toneClass: \"border-violet-500/20 bg-violet-500/8 text-violet-300\",\n label: \"待补充\",\n }\n case \"completed\":\n return {\n dotClass: \"bg-sky-400\",\n toneClass: \"border-sky-500/20 bg-sky-500/8 text-sky-300\",\n label: \"已完成\",\n }\n case \"interrupted\":\n return {\n dotClass: \"bg-amber-400\",\n toneClass: \"border-amber-500/20 bg-amber-500/8 text-amber-300\",\n label: \"已中断\",\n }\n default:\n return {\n dotClass: \"bg-[hsl(var(--muted-foreground))]\",\n toneClass:\n \"border-[hsl(var(--border))] bg-[hsl(var(--accent))] text-[hsl(var(--muted-foreground))]\",\n label: \"准备中\",\n }\n }\n}\n"],"mappings":"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","names":["type","create","create","create","create","create","toolCall","create","create","create","extractModeFromBlocks","create","create","create","create","create","create","create","create","create","create","create","create","create","create","create","create","r","r","r","r","r","r","r","r","r","useState","createSession","deleteSession","jsx","jsx","jsxs","jsx","jsxs","createSession","useState"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface WorkspaceFilesPanelProps {
|
|
5
|
+
sessionId: string | null;
|
|
6
|
+
enableEditor?: boolean;
|
|
7
|
+
className?: string;
|
|
8
|
+
treeContainerClassName?: string;
|
|
9
|
+
title?: string;
|
|
10
|
+
rootPath?: string;
|
|
11
|
+
readOnly?: boolean;
|
|
12
|
+
onShareFile?: (path: string, name: string) => Promise<void>;
|
|
13
|
+
onSync?: () => Promise<void>;
|
|
14
|
+
allowDelete?: boolean;
|
|
15
|
+
/** Optional slot above the file tree (e.g. phase progress in host app). */
|
|
16
|
+
topSlot?: ReactNode;
|
|
17
|
+
/** Custom file open handler; used when enableEditor is false if provided. */
|
|
18
|
+
onOpenFile?: (path: string, name: string) => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
declare function WorkspaceFilesPanel({ sessionId, enableEditor, className, treeContainerClassName, title, rootPath, readOnly, onShareFile, onSync, allowDelete, topSlot, onOpenFile, }: WorkspaceFilesPanelProps): react_jsx_runtime.JSX.Element;
|
|
21
|
+
|
|
22
|
+
interface FileTreeProps {
|
|
23
|
+
sessionId: string | null;
|
|
24
|
+
checkActiveSession?: boolean;
|
|
25
|
+
enableEditor?: boolean;
|
|
26
|
+
onExpandedDirsChange?: (dirs: Set<string>) => void;
|
|
27
|
+
rootPath?: string;
|
|
28
|
+
readOnly?: boolean;
|
|
29
|
+
onShareFile?: (path: string, name: string) => Promise<void>;
|
|
30
|
+
allowDelete?: boolean;
|
|
31
|
+
onOpenFile?: (path: string, name: string) => Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
declare function FileTree({ sessionId, checkActiveSession, enableEditor, onExpandedDirsChange, rootPath, readOnly, onShareFile, allowDelete, onOpenFile, }: FileTreeProps): react_jsx_runtime.JSX.Element;
|
|
34
|
+
|
|
35
|
+
export { FileTree, WorkspaceFilesPanel };
|