Add ask_human and the inbox with batched responses and delivery to agents

This commit is contained in:
Ian Gulliver
2026-10-14 07:02:56 -07:00
parent 09951e64e7
commit befd476598
16 changed files with 1962 additions and 129 deletions
+408 -28
View File
@@ -72,6 +72,141 @@ func (e AgentSessionVendor) Valid() bool {
}
}
// Defines values for AttachmentKind.
const (
AttachmentKindDiagram AttachmentKind = "diagram"
AttachmentKindDiff AttachmentKind = "diff"
AttachmentKindFile AttachmentKind = "file"
AttachmentKindImage AttachmentKind = "image"
AttachmentKindSnapshot AttachmentKind = "snapshot"
AttachmentKindTask AttachmentKind = "task"
AttachmentKindUrl AttachmentKind = "url"
)
// Valid indicates whether the value is a known member of the AttachmentKind enum.
func (e AttachmentKind) Valid() bool {
switch e {
case AttachmentKindDiagram:
return true
case AttachmentKindDiff:
return true
case AttachmentKindFile:
return true
case AttachmentKindImage:
return true
case AttachmentKindSnapshot:
return true
case AttachmentKindTask:
return true
case AttachmentKindUrl:
return true
default:
return false
}
}
// Defines values for InboxItemKind.
const (
InboxItemKindQuestion InboxItemKind = "question"
InboxItemKindReport InboxItemKind = "report"
InboxItemKindSessionError InboxItemKind = "session_error"
)
// Valid indicates whether the value is a known member of the InboxItemKind enum.
func (e InboxItemKind) Valid() bool {
switch e {
case InboxItemKindQuestion:
return true
case InboxItemKindReport:
return true
case InboxItemKindSessionError:
return true
default:
return false
}
}
// Defines values for InboxItemPriority.
const (
Blocked InboxItemPriority = "blocked"
Fyi InboxItemPriority = "fyi"
Gate InboxItemPriority = "gate"
Review InboxItemPriority = "review"
)
// Valid indicates whether the value is a known member of the InboxItemPriority enum.
func (e InboxItemPriority) Valid() bool {
switch e {
case Blocked:
return true
case Fyi:
return true
case Gate:
return true
case Review:
return true
default:
return false
}
}
// Defines values for InboxResponseType.
const (
InboxResponseTypeDismiss InboxResponseType = "dismiss"
InboxResponseTypeFreeForm InboxResponseType = "free_form"
InboxResponseTypeOption InboxResponseType = "option"
InboxResponseTypeQuestion InboxResponseType = "question"
InboxResponseTypeRedirect InboxResponseType = "redirect"
InboxResponseTypeSnooze InboxResponseType = "snooze"
)
// Valid indicates whether the value is a known member of the InboxResponseType enum.
func (e InboxResponseType) Valid() bool {
switch e {
case InboxResponseTypeDismiss:
return true
case InboxResponseTypeFreeForm:
return true
case InboxResponseTypeOption:
return true
case InboxResponseTypeQuestion:
return true
case InboxResponseTypeRedirect:
return true
case InboxResponseTypeSnooze:
return true
default:
return false
}
}
// Defines values for InboxState.
const (
Answered InboxState = "answered"
Dismissed InboxState = "dismissed"
Open InboxState = "open"
Redirected InboxState = "redirected"
Superseded InboxState = "superseded"
)
// Valid indicates whether the value is a known member of the InboxState enum.
func (e InboxState) Valid() bool {
switch e {
case Answered:
return true
case Dismissed:
return true
case Open:
return true
case Redirected:
return true
case Superseded:
return true
default:
return false
}
}
// Defines values for TaskStatus.
const (
TaskStatusActive TaskStatus = "active"
@@ -114,6 +249,32 @@ type AgentSessionState string
// AgentSessionVendor defines model for AgentSession.Vendor.
type AgentSessionVendor string
// Attachment defines model for Attachment.
type Attachment struct {
Caption *string `json:"caption,omitempty"`
EndLine *int `json:"end_line,omitempty"`
// Image image: data URL.
Image *string `json:"image,omitempty"`
Kind AttachmentKind `json:"kind"`
// Mermaid diagram: Mermaid source.
Mermaid *string `json:"mermaid,omitempty"`
// Path file: repo-relative path.
Path *string `json:"path,omitempty"`
// Ref diff: git revision range.
Ref *string `json:"ref,omitempty"`
SnapshotId *string `json:"snapshot_id,omitempty"`
StartLine *int `json:"start_line,omitempty"`
TaskId *string `json:"task_id,omitempty"`
Url *string `json:"url,omitempty"`
}
// AttachmentKind defines model for Attachment.Kind.
type AttachmentKind string
// Error defines model for Error.
type Error struct {
Message string `json:"message"`
@@ -131,6 +292,74 @@ type Event struct {
TaskId *string `json:"task_id,omitempty"`
}
// InboxItem defines model for InboxItem.
type InboxItem struct {
AgentSessionId string `json:"agent_session_id"`
Blocking bool `json:"blocking"`
CreatedAt time.Time `json:"created_at"`
Id string `json:"id"`
Kind InboxItemKind `json:"kind"`
// Payload question: question, why_blocked, options, recommended_option, attachments. report: done, open_questions, next_steps, risks, deviations. session_error: error.
Payload map[string]interface{} `json:"payload"`
Priority InboxItemPriority `json:"priority"`
ProjectId string `json:"project_id"`
ResolvedAt *time.Time `json:"resolved_at,omitempty"`
ResolvedBy *string `json:"resolved_by,omitempty"`
Responses []InboxResponse `json:"responses"`
SnoozedUntil *time.Time `json:"snoozed_until,omitempty"`
State InboxState `json:"state"`
TaskId string `json:"task_id"`
ThreadId string `json:"thread_id"`
}
// InboxItemKind defines model for InboxItem.Kind.
type InboxItemKind string
// InboxItemPriority defines model for InboxItem.Priority.
type InboxItemPriority string
// InboxRespond defines model for InboxRespond.
type InboxRespond struct {
Responses []InboxResponseCreate `json:"responses"`
}
// InboxResponse defines model for InboxResponse.
type InboxResponse struct {
Attachments []Attachment `json:"attachments"`
CreatedAt time.Time `json:"created_at"`
DeliveredAt *time.Time `json:"delivered_at,omitempty"`
Id string `json:"id"`
ItemId string `json:"item_id"`
Option *string `json:"option,omitempty"`
SnoozeUntil *time.Time `json:"snooze_until,omitempty"`
Text *string `json:"text,omitempty"`
Type InboxResponseType `json:"type"`
User string `json:"user"`
}
// InboxResponseCreate defines model for InboxResponseCreate.
type InboxResponseCreate struct {
Attachments *[]Attachment `json:"attachments,omitempty"`
ItemId string `json:"item_id"`
// Option option: one of the question's options.
Option *string `json:"option,omitempty"`
// SnoozeUntil snooze: when the item reappears.
SnoozeUntil *time.Time `json:"snooze_until,omitempty"`
// Text Required for free_form, redirect, question; an optional note on option.
Text *string `json:"text,omitempty"`
Type InboxResponseType `json:"type"`
}
// InboxResponseType defines model for InboxResponseType.
type InboxResponseType string
// InboxState defines model for InboxState.
type InboxState string
// MessageCreate defines model for MessageCreate.
type MessageCreate struct {
Text string `json:"text"`
@@ -214,6 +443,17 @@ type StreamEventsParams struct {
LastEventID *int64 `json:"Last-Event-ID,omitempty"`
}
// ListInboxParams defines parameters for ListInbox.
type ListInboxParams struct {
ProjectId *string `form:"project_id,omitempty" json:"project_id,omitempty"`
TaskId *string `form:"task_id,omitempty" json:"task_id,omitempty"`
State *InboxState `form:"state,omitempty" json:"state,omitempty"`
IncludeSnoozed *bool `form:"include_snoozed,omitempty" json:"include_snoozed,omitempty"`
}
// RespondInboxJSONRequestBody defines body for RespondInbox for application/json ContentType.
type RespondInboxJSONRequestBody = InboxRespond
// UpdateMeJSONRequestBody defines body for UpdateMe for application/json ContentType.
type UpdateMeJSONRequestBody = UserUpdate
@@ -238,6 +478,15 @@ type ServerInterface interface {
// (GET /api/events)
StreamEvents(w http.ResponseWriter, r *http.Request, params StreamEventsParams)
// (GET /api/inbox)
ListInbox(w http.ResponseWriter, r *http.Request, params ListInboxParams)
// (POST /api/inbox/responses)
RespondInbox(w http.ResponseWriter, r *http.Request)
// (GET /api/inbox/{itemId})
GetInboxItem(w http.ResponseWriter, r *http.Request, itemId string)
// (GET /api/me)
GetMe(w http.ResponseWriter, r *http.Request)
@@ -358,6 +607,118 @@ func (siw *ServerInterfaceWrapper) StreamEvents(w http.ResponseWriter, r *http.R
handler.ServeHTTP(w, r)
}
// ListInbox operation middleware
func (siw *ServerInterfaceWrapper) ListInbox(w http.ResponseWriter, r *http.Request) {
var err error
_ = err
// Parameter object where we will unmarshal all parameters from the context
var params ListInboxParams
// ------------- Optional query parameter "project_id" -------------
err = runtime.BindQueryParameterWithOptions("form", true, false, "project_id", r.URL.Query(), &params.ProjectId, runtime.BindQueryParameterOptions{Type: "string", Format: ""})
if err != nil {
var requiredError *runtime.RequiredParameterError
if errors.As(err, &requiredError) {
siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "project_id"})
} else {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "project_id", Err: err})
}
return
}
// ------------- Optional query parameter "task_id" -------------
err = runtime.BindQueryParameterWithOptions("form", true, false, "task_id", r.URL.Query(), &params.TaskId, runtime.BindQueryParameterOptions{Type: "string", Format: ""})
if err != nil {
var requiredError *runtime.RequiredParameterError
if errors.As(err, &requiredError) {
siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "task_id"})
} else {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "task_id", Err: err})
}
return
}
// ------------- Optional query parameter "state" -------------
err = runtime.BindQueryParameterWithOptions("form", true, false, "state", r.URL.Query(), &params.State, runtime.BindQueryParameterOptions{Type: "string", Format: ""})
if err != nil {
var requiredError *runtime.RequiredParameterError
if errors.As(err, &requiredError) {
siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "state"})
} else {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "state", Err: err})
}
return
}
// ------------- Optional query parameter "include_snoozed" -------------
err = runtime.BindQueryParameterWithOptions("form", true, false, "include_snoozed", r.URL.Query(), &params.IncludeSnoozed, runtime.BindQueryParameterOptions{Type: "boolean", Format: ""})
if err != nil {
var requiredError *runtime.RequiredParameterError
if errors.As(err, &requiredError) {
siw.ErrorHandlerFunc(w, r, &RequiredParamError{ParamName: "include_snoozed"})
} else {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "include_snoozed", Err: err})
}
return
}
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
siw.Handler.ListInbox(w, r, params)
}))
for _, middleware := range siw.HandlerMiddlewares {
handler = middleware(handler)
}
handler.ServeHTTP(w, r)
}
// RespondInbox operation middleware
func (siw *ServerInterfaceWrapper) RespondInbox(w http.ResponseWriter, r *http.Request) {
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
siw.Handler.RespondInbox(w, r)
}))
for _, middleware := range siw.HandlerMiddlewares {
handler = middleware(handler)
}
handler.ServeHTTP(w, r)
}
// GetInboxItem operation middleware
func (siw *ServerInterfaceWrapper) GetInboxItem(w http.ResponseWriter, r *http.Request) {
var err error
_ = err
// ------------- Path parameter "itemId" -------------
var itemId string
err = runtime.BindStyledParameterWithOptions("simple", "itemId", r.PathValue("itemId"), &itemId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true})
if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "itemId", Err: err})
return
}
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
siw.Handler.GetInboxItem(w, r, itemId)
}))
for _, middleware := range siw.HandlerMiddlewares {
handler = middleware(handler)
}
handler.ServeHTTP(w, r)
}
// GetMe operation middleware
func (siw *ServerInterfaceWrapper) GetMe(w http.ResponseWriter, r *http.Request) {
@@ -808,6 +1169,9 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/sessions/{sessionId}", wrapper.GetSession)
m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/sessions/{sessionId}/messages", wrapper.SendMessage)
m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/sessions/{sessionId}/interrupt", wrapper.InterruptSession)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/inbox", wrapper.ListInbox)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/inbox/{itemId}", wrapper.GetInboxItem)
m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/inbox/responses", wrapper.RespondInbox)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/events", wrapper.StreamEvents)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/admin/status", wrapper.GetStatus)
@@ -819,34 +1183,50 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H
// const string: with thousands of chunks the chained `+` fold is several
// times slower for the Go compiler than parsing a slice literal.
var swaggerSpec = []string{
"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",
"02eeHPYpZ7Yv6HfHP0wlW6//DgAA//8=",
"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",
"ncOYdGbqgm51/M1kst3ufwEAAP//",
}
// decodeSpec returns the embedded OpenAPI spec as raw JSON bytes,