Add expose_port previews with a Preview tab; leave setup to AGENTS.md

This commit is contained in:
Ian Gulliver
2026-10-15 13:15:49 -07:00
parent 86e4e772ed
commit f95a0e5332
32 changed files with 1042 additions and 431 deletions
+16 -25
View File
@@ -62,10 +62,6 @@ type Manager struct {
snapMu sync.Mutex
snaps map[string]*snapState
setupMu sync.Mutex
setups map[string]bool
setupFailures map[string]string
mergeMu sync.Mutex
mergeHolders map[string]string
@@ -102,21 +98,19 @@ type live struct {
func New(st *store.Store, limits Limits, worktreeRoot, leadRoot string) *Manager {
m := &Manager{
store: st,
limits: limits,
worktreeRoot: worktreeRoot,
leadRoot: leadRoot,
live: map[string]*live{},
rateLimits: map[api.AgentSessionVendor]map[string]any{},
leadAnswered: map[string]bool{},
paneFocused: map[string]bool{},
signals: make(chan api.Event, 1024),
snaps: map[string]*snapState{},
setups: map[string]bool{},
setupFailures: map[string]string{},
mergeHolders: map[string]string{},
bad: newBadLines(),
watchStop: make(chan struct{}),
store: st,
limits: limits,
worktreeRoot: worktreeRoot,
leadRoot: leadRoot,
live: map[string]*live{},
rateLimits: map[api.AgentSessionVendor]map[string]any{},
leadAnswered: map[string]bool{},
paneFocused: map[string]bool{},
signals: make(chan api.Event, 1024),
snaps: map[string]*snapState{},
mergeHolders: map[string]string{},
bad: newBadLines(),
watchStop: make(chan struct{}),
}
go m.signalLoop()
return m
@@ -422,7 +416,7 @@ func (m *Manager) turn(ctx context.Context, sess api.AgentSession, task api.Task
return api.AgentSession{}, err
}
if room && !m.settingUp(task.Id) {
if room {
return m.start(ctx, sess, task, actor, text, images, api.AgentSessionStateIdle)
}
@@ -516,9 +510,6 @@ func (m *Manager) drain(ctx context.Context) error {
}
for _, q := range queued {
if m.settingUp(q.TaskID) {
continue
}
room, err := m.hasRoom(ctx, q.Vendor)
if err != nil {
return err
@@ -669,9 +660,9 @@ func (m *Manager) ensureLive(ctx context.Context, sess api.AgentSession, task ap
if err != nil {
return nil, err
}
tools := []mcp.Tool{m.askTool(l), m.cancelQuestionTool(l), m.createTaskTool(l), m.setMergeTitleTool(l)}
tools := []mcp.Tool{m.askTool(l), m.cancelQuestionTool(l), m.createTaskTool(l), m.setMergeTitleTool(l), m.exposePortTool(l)}
hooks := map[string][]claude.HookMatcher{
"UserPromptSubmit": {{Func: m.remindTaskGuidance(l, g)}},
"UserPromptSubmit": {{Func: remindGuidance(g)}},
"Stop": {{Func: m.bounceProseQuestion(l)}},
"PostToolUse": {{Func: m.afterTool(l)}},
}