Member Junction
    Preparing search index...

    Reusable message input box component (presentational) Now uses MentionEditorComponent for rich

    functionality with chips

    Handles:

    • Text input with keyboard shortcuts via MentionEditorComponent

    autocomplete with visual chips (contentEditable)

    • Send button

    Does NOT handle:

    • Saving messages to database
    • Agent invocation
    • Artifact creation
    • Conversation management
    Index

    Constructors

    Properties

    AcceptedFileTypes: string = 'image/*'
    AfterSkillsOpened: EventEmitter<void> = ...

    Fired AFTER the dropdown actually opened. Not emitted on the canceled path, and not emitted when no active provider owns the trigger — so a host counting this counts dropdowns the user saw, rather than clicks.

    AttachmentClicked: EventEmitter<PendingAttachment> = ...
    AttachmentError: EventEmitter<string> = ...
    AttachmentsChanged: EventEmitter<PendingAttachment[]> = ...
    BeforeSkillsOpened: EventEmitter<BeforeSkillsOpenedEventArgs> = ...

    Fired BEFORE the Skills button opens the dropdown. Flip Cancel to veto — a host gating skills by entitlement, or surfacing them elsewhere, blocks it here.

    A pair rather than a lone emitter because this is an ACTION a host might reasonably refuse (UI_LAYERING_GUIDE section 6, rule 1). Handlers must be synchronous; Cancel travels back through EventEmitter's synchronous dispatch.

    Blurred: EventEmitter<void> = ...

    Composer lost focus — hosts persist drafts on this.

    CanStartRealtime: boolean = true

    Whether a voice session can be started right now (mic Disabled when false).

    CurrentUser?: UserInfo
    Disabled: boolean = false
    EnableAttachments: boolean = true
    EnableMentions: boolean = true

    Master switch for all mention/command triggers (pass-through to the mention editor).

    EnablePlanMode: boolean = false

    Shows the in-composer Plan Mode toggle button when true.

    EnableRealtime: boolean = false

    Shows the in-composer mic button when true.

    EnableSkills: boolean = false

    Shows the in-composer Skills button when true.

    Gated separately from EnableMentions because a host can have the / trigger active and still not want the button — but the common case is that a composer offering skill commands should advertise them, since / is otherwise invisible.

    ExcludedTriggerKeys: string[] = []

    Discovery-mode filter: provider Keys to skip (pass-through to the mention editor).

    MaxAttachments: number = 10
    MaxAttachmentSizeBytes: number = ...
    mentionEditor?: MentionEditorComponent
    Placeholder: string = 'Type your message to start a new conversation...'
    PlanModeActive: boolean = false

    Current Plan Mode toggle state (renders the button in its active state).

    PlanModeToggle: EventEmitter<void> = ...

    Emitted when the user clicks the in-composer Plan Mode toggle button.

    Provider: IMetadataProvider | null = null

    Optional metadata provider scoping this composer (pass-through to the mention editor).

    Rows: number = 3
    ShowCharacterCount: boolean = false
    TextSubmitted: EventEmitter<string> = ...
    TriggerProviders: ComposerTriggerProvider[] | null = null

    Explicit trigger-provider list (pass-through to the mention editor; explicit list wins over discovery).

    Value: string = ''
    ValueChange: EventEmitter<string> = ...
    VoiceActive: boolean = false

    Whether a realtime voice session is currently active (mic renders in its active state).

    VoiceOptionsRequested: EventEmitter<void> = ...

    Emitted when the user clicks the small caret next to the phone button — the host opens the voice agent/model picker so call options (which agent, which voice model) stay reachable without adding friction to the plain phone click's instant-start path.

    VoiceRequested: EventEmitter<void> = ...

    Emitted when the user clicks the mic button to start/stop a voice session.

    Accessors

    • get SkillsActive(): boolean

      True while the skill dropdown is open, driving the button's expanded state.

      Note the ARIA differs from Plan Mode next to it, deliberately: Plan Mode is a toggle BUTTON (a mode that stays on), so aria-pressed is right there. This one opens a popup, so it is aria-expanded + aria-haspopup. Using aria-pressed here would have a screen reader announce "pressed" for something that actually just revealed a list.

      DERIVED, not an @Input, and this is the difference from Plan Mode. Plan Mode's active state is a persisted user preference the host owns and threads down. "Is the skill dropdown open" is intrinsic to this composer, so an

      Returns boolean

      would be an API the host cannot meaningfully answer and would leave the button permanently unpressed if nobody bound it.

    Methods

    • Add an artifact as a pending attachment (called by parent after artifact selection)

      Parameters

      • artifact: {
            artifactVersionId?: string;
            fileID: string;
            fileName: string;
            mimeType: string;
            sizeBytes: number;
        }

      Returns PendingAttachment | undefined

    • Get mention chip data including configuration presets

      Returns {
          id: string;
          name: string;
          presetId?: string;
          presetName?: string;
          type: string;
      }[]

    • Handle clicks on the container - focus the mention editor Only moves cursor to end if clicking outside the contentEditable area

      Parameters

      • event: MouseEvent

      Returns void

    • NOTE: the template pairs this with (mousedown)="$event.preventDefault(); $event.stopPropagation()", and BOTH halves are load-bearing.

      preventDefault — a

      Parameters

      • Optionalevent: Event

      Returns void