MingaEditor.State.InlineAsk (Minga v0.1.0)

Copy Markdown View Source

Ephemeral inline ask overlays keyed by buffer.

Inline asks are presentation state only. They are not persisted and they do not create workspaces until explicitly promoted.

The shared per-buffer store mechanics (active/2, put/2, dismiss/2, session?/2) and prompt-input mechanics (append_input/2, backspace/1, scroll/2) live in MingaEditor.InlineOverlay.Store and MingaEditor.InlineOverlay.Prompt and are reused here. This module owns only the ask-specific shape and transitions: the read-only response accumulation and the :answered terminal state.

Summary

Types

phase()

@type phase() ::
  :input
  | {:running, pid(), String.t()}
  | {:answered, String.t()}
  | {:failed, String.t()}

store()

@type store() :: %{required(pid()) => t()}

t()

@type t() :: %MingaEditor.State.InlineAsk{
  anchor_line: non_neg_integer(),
  buffer_pid: pid(),
  context_text: String.t(),
  file_label: String.t(),
  file_ref: Minga.Project.FileRef.t(),
  phase: phase(),
  prompt: String.t(),
  scroll: non_neg_integer(),
  selection_range: {non_neg_integer(), non_neg_integer()} | nil
}

Functions

active(store, buffer_pid)

@spec active(store(), pid() | nil) :: t() | nil

agent_prompt(ask)

@spec agent_prompt(t()) :: String.t()

Builds the read-only prompt sent to the ephemeral agent session.

answered(ask)

@spec answered(t()) :: t()

Marks the ask as answered.

answered?(ask)

@spec answered?(t()) :: boolean()

append_input(ask, text)

@spec append_input(t(), String.t()) :: t()

append_response(ask, delta)

@spec append_response(t(), String.t()) :: t()

Appends response text.

backspace(ask)

@spec backspace(t()) :: t()

dismiss(store, buffer_pid)

@spec dismiss(store(), pid() | nil) :: {store(), pid() | nil}

fail(ask, message)

@spec fail(t(), String.t()) :: t()

Marks the ask as failed.

failed?(ask)

@spec failed?(t()) :: boolean()

header(inline_ask)

@spec header(t()) :: String.t()

Returns the prompt header.

input?(ask)

@spec input?(t()) :: boolean()

new(buffer_pid, file_ref, file_label, anchor_line, selection_range \\ nil, context_text \\ "")

Creates a new ask for a buffer.

phase(inline_ask)

@spec phase(t()) :: phase()

put(store, ask)

@spec put(store(), t()) :: store()

response(inline_ask)

@spec response(t()) :: String.t()

running?(ask)

@spec running?(t()) :: boolean()

scroll(ask, delta)

@spec scroll(t(), integer()) :: t()

scrollable?(ask)

@spec scrollable?(t()) :: boolean()

session?(store, session_pid)

@spec session?(store(), pid()) :: boolean()

session_pid(arg1)

@spec session_pid(t() | term()) :: pid() | nil

thinking(ask, session_pid)

@spec thinking(t(), pid()) :: t()

Marks the ask as thinking.