MCPcopy Index your code
hub / github.com/docker/docker-agent / userMessageOrdinalToItemIndex

Function userMessageOrdinalToItemIndex

pkg/server/session_manager.go:443–471  ·  view source on GitHub ↗

userMessageOrdinalToItemIndex maps a 0-based user-message ordinal into an index in the parent's Session.Messages Item slice. Returns ErrForkOutOfRange or ErrForkInSubSession on invalid input.

(s *session.Session, ordinal int)

Source from the content-addressed store, hash-verified

441// into an index in the parent's Session.Messages Item slice. Returns
442// ErrForkOutOfRange or ErrForkInSubSession on invalid input.
443func userMessageOrdinalToItemIndex(s *session.Session, ordinal int) (int, error) {
444 if ordinal < 0 {
445 return 0, fmt.Errorf("%w: %d", ErrForkOutOfRange, ordinal)
446 }
447 seen := 0
448 for i, item := range s.Messages {
449 switch {
450 case item.IsMessage():
451 // Mirror GetAllMessages: system messages don't count.
452 if item.Message.Message.Role == chat.MessageRoleSystem {
453 continue
454 }
455 if item.Message.Message.Role != chat.MessageRoleUser {
456 continue
457 }
458 if seen == ordinal {
459 return i, nil
460 }
461 seen++
462 case item.IsSubSession():
463 subCount := countUserMessages(item.SubSession.GetAllMessages())
464 if subCount > 0 && ordinal-seen < subCount {
465 return 0, fmt.Errorf("%w at ordinal %d", ErrForkInSubSession, ordinal)
466 }
467 seen += subCount
468 }
469 }
470 return 0, fmt.Errorf("%w: %d", ErrForkOutOfRange, ordinal)
471}
472
473func countUserMessages(msgs []session.Message) int {
474 n := 0

Callers 2

ForkSessionMethod · 0.85

Calls 4

countUserMessagesFunction · 0.85
IsMessageMethod · 0.80
GetAllMessagesMethod · 0.80
IsSubSessionMethod · 0.45

Tested by 1