11import { Text } from "@components/text" ;
2+ import type {
3+ CloudTaskQueuedMessage ,
4+ CloudTaskQueueMoveDirection ,
5+ } from "@posthog/core/sessions/cloudTaskQueue" ;
26import {
37 countUserMessages ,
48 getSessionActivityPhase ,
@@ -45,17 +49,18 @@ import {
4549 useQueuedCount ,
4650 useToggleMessagingMode ,
4751} from "@/features/tasks/hooks/useMessagingMode" ;
52+ import { useTaskMessageQueue } from "@/features/tasks/hooks/useTaskMessageQueue" ;
4853import { taskKeys } from "@/features/tasks/hooks/useTasks" ;
49- import {
50- type MoveDirection ,
51- type QueuedMessage ,
52- useMessageQueueStore ,
53- } from "@/features/tasks/stores/messageQueueStore" ;
54+ import { taskMessageQueue } from "@/features/tasks/lib/taskMessageQueue" ;
55+ import { taskSessionActions } from "@/features/tasks/services/taskSessionService" ;
5456import {
5557 pendingTaskPromptStoreApi ,
5658 usePendingTaskPrompt ,
5759} from "@/features/tasks/stores/pendingTaskPromptStore" ;
58- import { useTaskSessionStore } from "@/features/tasks/stores/taskSessionStore" ;
60+ import {
61+ getTaskSession ,
62+ useTaskSessionStore ,
63+ } from "@/features/tasks/stores/taskSessionStore" ;
5964import { useTaskStore } from "@/features/tasks/stores/taskStore" ;
6065import { confirmStopRun } from "@/features/tasks/utils/archiveGuard" ;
6166import { useScreenInsets } from "@/hooks/useScreenInsets" ;
@@ -69,6 +74,7 @@ import { getPostHogApiClient } from "@/lib/posthogApiClient";
6974import { useThemeColors } from "@/lib/theme" ;
7075
7176const log = logger . scope ( "task-detail" ) ;
77+ type QueuedMessage = CloudTaskQueuedMessage < PendingAttachment > ;
7278
7379function getFirstParam ( value ?: string | string [ ] ) : string | undefined {
7480 return Array . isArray ( value ) ? value [ 0 ] : value ;
@@ -107,12 +113,13 @@ export default function TaskDetailScreen() {
107113 sendInterrupting,
108114 sendPermissionResponse,
109115 setConfigOption,
110- getSessionForTask,
111- setFocusedTaskId,
112116 steerQueuedMessage,
113117 flushQueuedMessagesIfIdle,
114118 stopRun,
115- } = useTaskSessionStore ( ) ;
119+ } = taskSessionActions ;
120+ const setFocusedTaskId = useTaskSessionStore (
121+ ( state ) => state . setFocusedTaskId ,
122+ ) ;
116123
117124 useEffect ( ( ) => {
118125 if ( ! taskId ) return ;
@@ -127,7 +134,7 @@ export default function TaskDetailScreen() {
127134 // Cleared when the screen unmounts. Matches the desktop super-property.
128135 useActiveTaskAnalyticsContext ( task ?. signal_report ?? null ) ;
129136
130- const session = taskId ? getSessionForTask ( taskId ) : undefined ;
137+ const session = taskId ? getTaskSession ( taskId ) : undefined ;
131138
132139 // Optimistic echo set by the new-task screen (or the terminal-resume path
133140 // below) so the user's prompt appears in the thread immediately, before
@@ -176,9 +183,7 @@ export default function TaskDetailScreen() {
176183
177184 const messagingMode = useMessagingMode ( taskId ) ;
178185 const queuedCount = useQueuedCount ( taskId ) ;
179- const editingQueuedId = useMessageQueueStore ( ( s ) =>
180- taskId ? s . editingByTaskId [ taskId ] : undefined ,
181- ) ;
186+ const { editingId : editingQueuedId } = useTaskMessageQueue ( taskId ) ;
182187 const toggleMessagingMode = useToggleMessagingMode ( taskId ) ;
183188 const analytics = useAnalytics ( ) ;
184189
@@ -369,11 +374,13 @@ export default function TaskDetailScreen() {
369374 // Saving an in-place edit: overwrite the queued message and release the
370375 // drain hold. If the turn already ended while editing, flush now — the
371376 // turn-end drain won't fire again on its own.
372- const queue = useMessageQueueStore . getState ( ) ;
373- const editingId = queue . editingByTaskId [ taskId ] ;
377+ const editingId = taskMessageQueue . getSnapshot ( ) . editingByTaskId [ taskId ] ;
374378 if ( editingId ) {
375- queue . update ( taskId , editingId , { content : text , attachments } ) ;
376- queue . clearEditing ( taskId ) ;
379+ taskMessageQueue . update ( taskId , editingId , {
380+ content : text ,
381+ attachments,
382+ } ) ;
383+ taskMessageQueue . clearEditing ( taskId ) ;
377384 flushQueuedMessagesIfIdle ( taskId ) ;
378385 return ;
379386 }
@@ -395,7 +402,7 @@ export default function TaskDetailScreen() {
395402 // Steer interrupts the turn and resends right away.
396403 if ( session ?. isPromptPending ) {
397404 if ( messagingMode === "queue" ) {
398- useMessageQueueStore . getState ( ) . enqueue ( taskId , text , attachments ) ;
405+ taskMessageQueue . enqueue ( taskId , text , attachments ) ;
399406 return ;
400407 }
401408 sendInterrupting ( taskId , text , attachments )
@@ -448,7 +455,7 @@ export default function TaskDetailScreen() {
448455 const handleEditQueued = useCallback (
449456 ( message : QueuedMessage ) => {
450457 if ( ! taskId ) return ;
451- useMessageQueueStore . getState ( ) . setEditing ( taskId , message . id ) ;
458+ taskMessageQueue . setEditing ( taskId , message . id ) ;
452459 setRestoredDraft ( {
453460 text : message . content ,
454461 attachments : message . attachments ,
@@ -459,16 +466,16 @@ export default function TaskDetailScreen() {
459466
460467 const handleCancelEdit = useCallback ( ( ) => {
461468 if ( ! taskId ) return ;
462- useMessageQueueStore . getState ( ) . clearEditing ( taskId ) ;
469+ taskMessageQueue . clearEditing ( taskId ) ;
463470 setRestoredDraft ( { text : "" , attachments : [ ] } ) ;
464471 flushQueuedMessagesIfIdle ( taskId ) ;
465472 } , [ taskId , flushQueuedMessagesIfIdle ] ) ;
466473
467474 const handleMoveQueued = useCallback (
468- ( message : QueuedMessage , direction : MoveDirection ) => {
475+ ( message : QueuedMessage , direction : CloudTaskQueueMoveDirection ) => {
469476 if ( ! taskId ) return ;
470477 Haptics . selectionAsync ( ) ;
471- useMessageQueueStore . getState ( ) . move ( taskId , message . id , direction ) ;
478+ taskMessageQueue . move ( taskId , message . id , direction ) ;
472479 } ,
473480 [ taskId ] ,
474481 ) ;
@@ -477,8 +484,8 @@ export default function TaskDetailScreen() {
477484 ( message : QueuedMessage ) => {
478485 if ( ! taskId ) return ;
479486 const wasEditing =
480- useMessageQueueStore . getState ( ) . editingByTaskId [ taskId ] === message . id ;
481- useMessageQueueStore . getState ( ) . remove ( taskId , message . id ) ;
487+ taskMessageQueue . getSnapshot ( ) . editingByTaskId [ taskId ] === message . id ;
488+ taskMessageQueue . remove ( taskId , message . id ) ;
482489 if ( wasEditing ) setRestoredDraft ( { text : "" , attachments : [ ] } ) ;
483490 } ,
484491 [ taskId ] ,
@@ -525,7 +532,7 @@ export default function TaskDetailScreen() {
525532 const handleStopRun = useCallback ( ( ) => {
526533 if ( ! taskId ) return ;
527534 confirmStopRun ( ( ) => {
528- const promptsSent = countUserMessages ( getSessionForTask ( taskId ) ?. events ) ;
535+ const promptsSent = countUserMessages ( getTaskSession ( taskId ) ?. events ) ;
529536 stopRun ( taskId )
530537 . then ( ( ok ) => {
531538 if ( ok ) {
@@ -543,7 +550,7 @@ export default function TaskDetailScreen() {
543550 } )
544551 . catch ( ( ) => { } ) ;
545552 } ) ;
546- } , [ taskId , stopRun , analytics , getSessionForTask ] ) ;
553+ } , [ taskId , stopRun , analytics ] ) ;
547554
548555 const canStopRun =
549556 ! ! task &&
0 commit comments