Show the terminal immediately when opening the Terminal tab

This commit is contained in:
Ian Gulliver
2026-10-21 15:05:09 -07:00
parent 47b62763ce
commit 4b4763779d
8 changed files with 420 additions and 414 deletions
+19 -12
View File
@@ -738,24 +738,22 @@ paths:
"404": { $ref: "#/components/responses/Error" }
"409": { $ref: "#/components/responses/Error" }
/api/tasks/{taskId}/terminals:
parameters:
- { name: taskId, in: path, required: true, schema: { type: string } }
/api/terminals:
get:
operationId: listTaskTerminals
operationId: listTerminals
description: >
The task's running terminals, login shells in its worktree, oldest first. A terminals.changed event with the
task's id is broadcast whenever one starts or ends.
Every task's running terminals, login shells in its worktree, each task's oldest first. Whenever one starts or
ends, a terminals.changed event with the task's id is broadcast, whose payload is that task's TerminalList.
responses:
"200":
description: The terminals.
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/TaskTerminal" }
"404": { $ref: "#/components/responses/Error" }
"409": { $ref: "#/components/responses/Error" }
schema: { $ref: "#/components/schemas/TerminalList" }
/api/tasks/{taskId}/terminals:
parameters:
- { name: taskId, in: path, required: true, schema: { type: string } }
post:
operationId: startTaskTerminal
description: >
@@ -2091,12 +2089,21 @@ components:
TaskTerminal:
type: object
required: [id, name, started_at]
required: [id, task_id, name, started_at]
properties:
id: { type: string }
task_id: { type: string }
name: { type: string, description: "Shell, or the name of the saved command it was started with." }
started_at: { type: string, format: date-time }
TerminalList:
type: object
required: [terminals]
properties:
terminals:
type: array
items: { $ref: "#/components/schemas/TaskTerminal" }
TerminalStart:
type: object
properties:
+330 -335
View File
@@ -1513,6 +1513,7 @@ type TaskTerminal struct {
// Name Shell, or the name of the saved command it was started with.
Name string `json:"name"`
StartedAt time.Time `json:"started_at"`
TaskId string `json:"task_id"`
}
// TaskWorkflow The workflow a task froze when it was created, as it was then.
@@ -1534,6 +1535,11 @@ type TeamMember struct {
Prompt string `json:"prompt"`
}
// TerminalList defines model for TerminalList.
type TerminalList struct {
Terminals []TaskTerminal `json:"terminals"`
}
// TerminalSize defines model for TerminalSize.
type TerminalSize struct {
Cols int `json:"cols"`
@@ -2117,9 +2123,6 @@ type ServerInterface interface {
// (PUT /api/tasks/{taskId}/summary-read)
MarkSummaryRead(w http.ResponseWriter, r *http.Request, taskId string)
// (GET /api/tasks/{taskId}/terminals)
ListTaskTerminals(w http.ResponseWriter, r *http.Request, taskId string)
// (POST /api/tasks/{taskId}/terminals)
StartTaskTerminal(w http.ResponseWriter, r *http.Request, taskId string)
@@ -2135,6 +2138,9 @@ type ServerInterface interface {
// (GET /api/tasks/{taskId}/workflow/run)
GetWorkflowRun(w http.ResponseWriter, r *http.Request, taskId string)
// (GET /api/terminals)
ListTerminals(w http.ResponseWriter, r *http.Request)
// (GET /api/workflows)
ListWorkflows(w http.ResponseWriter, r *http.Request)
@@ -3987,32 +3993,6 @@ func (siw *ServerInterfaceWrapper) MarkSummaryRead(w http.ResponseWriter, r *htt
handler.ServeHTTP(w, r)
}
// ListTaskTerminals operation middleware
func (siw *ServerInterfaceWrapper) ListTaskTerminals(w http.ResponseWriter, r *http.Request) {
var err error
_ = err
// ------------- Path parameter "taskId" -------------
var taskId string
err = runtime.BindStyledParameterWithOptions("simple", "taskId", r.PathValue("taskId"), &taskId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true, Type: "string", Format: "", ValueIsUnescaped: true})
if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "taskId", Err: err})
return
}
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
siw.Handler.ListTaskTerminals(w, r, taskId)
}))
for _, middleware := range siw.HandlerMiddlewares {
handler = middleware(handler)
}
handler.ServeHTTP(w, r)
}
// StartTaskTerminal operation middleware
func (siw *ServerInterfaceWrapper) StartTaskTerminal(w http.ResponseWriter, r *http.Request) {
@@ -4190,6 +4170,20 @@ func (siw *ServerInterfaceWrapper) GetWorkflowRun(w http.ResponseWriter, r *http
handler.ServeHTTP(w, r)
}
// ListTerminals operation middleware
func (siw *ServerInterfaceWrapper) ListTerminals(w http.ResponseWriter, r *http.Request) {
handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
siw.Handler.ListTerminals(w, r)
}))
for _, middleware := range siw.HandlerMiddlewares {
handler = middleware(handler)
}
handler.ServeHTTP(w, r)
}
// ListWorkflows operation middleware
func (siw *ServerInterfaceWrapper) ListWorkflows(w http.ResponseWriter, r *http.Request) {
@@ -4461,7 +4455,7 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/diff", wrapper.GetTaskDiff)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/dir", wrapper.GetTaskDir)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/file", wrapper.GetTaskFile)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/terminals", wrapper.ListTaskTerminals)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/terminals", wrapper.ListTerminals)
m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/api/tasks/{taskId}/terminals", wrapper.StartTaskTerminal)
m.HandleFunc(http.MethodDelete+" "+options.BaseURL+"/api/tasks/{taskId}/terminals/{terminalId}", wrapper.CloseTaskTerminal)
m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/api/tasks/{taskId}/terminals/{terminalId}", wrapper.GetTaskTerminal)
@@ -4508,61 +4502,61 @@ 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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",
@@ -4571,99 +4565,99 @@ var swaggerSpec = []string{
"caV7oHQaXQnH/PQ7IBN0LdnSYYZgE6y40O/mLBa0J6LVfqO9Vy3Zljp1EcCcFDHutXIrJa6lA01pyaDi",
"QFVG8DCY4MclSNj9sFzen7ctL3KIB8mNct8tM4DTzlWIT6vgBV6ggvyD27pwuxgoI3aJEH9HdFqv1kFs",
"pVHCr+21f1ZuT2xIGg+60onBCHV39/PbAHAm/eWZPN/rMHnGE5iY3846b6P3MK0aVF+Zc/vuVVBVd2/U",
"IWhg1QxjqfSXqi20CuQ84C8X+GdFF/lQPOdEVwVfN1wMWpjeBfH4tXSXoBbONqHl2uolesFiRIb04m9H",
"4rF4ghfS38Qx/vlv8c+tXl4eWYMi5N+OxF/Er2W7v7z7tWwHLrnorYzs15MmQbQRFmfmxWMll2ueAzqh",
"vwtobbOuVe5JIzZ9F/QWbAnB9eTWH7t+0ginQA2CHrniMSxmIx3sEK/pEfb3pBEy+UV68rG4K9frlLfd",
"1R03KX004TU2iHI6iENFdE33UIVTPYgCYS9Mf+7ApqMWqoBT/rQiXJUMfPRyHTiy5sVPnktaaFu7bz8K",
"cKwQB8Zem1f0+TdjWE7cgbdOt8YfFOh38IwLV97KPt+HZrSq01fKfRpKg/6vFYMb+GQK3frBTR+JJ3nN",
"eiFBcPW6jWICwQ3IZwLNzoBjCEDLqdPKxGUA61s7TN6zZvo6AscYbhYZkaS3IXcxH6xtxd97H4aSEC0R",
"bQ1gElHtADbpRiMTV9op4n1YFZ2HRlcncQ5zulRmfkc+n9WPBx8XUMbBh71X7kAqETeHP0rqOsaaZnAi",
"bpXwa4f3M5yxKRS35FhlHV9ipMxJF168407EeTwLaHcgqy6cj+ZrORyjdW1p2swUeGXiLQ2Rp3IZ0NVQ",
"cRhLYgSKO53YAlQzFo1KoNxtGRGHK/CnaUKDXWBGJ5iNBCVZabGLIHZKrPSVMnMRF03/y04YGxRTL9yJ",
"AaNUwKSujr3f2RofoXR6sL9bj8QZj5pCfwlSk/r5+P3pOOrLbpXB2B1/rRxpWqIUhqEnW+W8aqv6lWb2",
"o5LtT7Z2ND8lgztg0/aLNQbjjCFQXHkR7EBqkPQWVaa5CYc8cSf1HZ4iq6ylvcMiq3FE0P2IUyp6rqEC",
"SsLfy2XwEwoIycIyX1gU1ok3SIfaZtOKtb0WF9IJDZroc6VMjOpsycTvA5xpDLJFw1uOeMHPkQ3f9uQf",
"mnySsxY0iKU0gpRz0OIxB+MqlIQbIdPV1qSAyOT707DXBihOrBNreaXRInZBcrSI2AqfohgG7gRkOGii",
"ow/AKseSinMnDdAHe8XDs74d7ZKtMgHDxWC62qxSDOYcHSMXFwBqWlzDcaLM6rLTGfpM5F1p2BvZCxZ1",
"AAoNJwEwKinr+ZYn91Bq1dYcwrcAlqXeymoo5FmUTdnrL0dED8OU0BkIv4N4UxPQ1MlXUQYfwrvFeCcg",
"GAzrzJ9wPDP5FoMy5UkW3hjftGPHdO4UAnkRkEiBGSh4c0RXGJontnFxEYOdkeKFPZJ9WFun2qPzG1iM",
"7pQjaB1087/JQKxdPISCi6Xtp+IqTL85pzVSW59/LiIy1xkzbkSuQ9NWhXQOdvtlt6O6jjh2T6ejgiGs",
"f6pN+JHns6batCwikU6Bupp1anvXFUOG77WwnCRj7+Ji+4mtyYkCgvIhs824FFK8S4zNRxu4eExYjZ6K",
"l01W5zx5Jp4mRx/yJB0pm4rV9wYRtl2QX0YF7uRH5AfEkwlRCWN+PSRVt4yJfhG1ne4UbyDEESpXhA7D",
"h+JcegU5CaIva8t0J4dETw0crwe2uPi91rEsI9E0ihBm3iLqTp53SlQOz5Q5YQfmOyCpTnUXjUYHfgeX",
"x4d295Q1Q7Jcv6eR/k3JL7cK1B8hRABXcTfO+wDfQO3pEkftvAzKYTD9XERfy529Hnn7NeXDMp1DkprT",
"zUU3ZD3mFUKXp7hB9FXn5CFp0vBFkyOE6Lih3/VvveoVMUT4dxw/MTJ5SsDxuNbvZRFHoLtdGLldiz1l",
"HPvJBn3B+ZDeOHVRPY8YFwBUh9dj4KMbAgq5DfDNK5c/nwJXvKvPbrVfSleBNvJH/Hbh+9WKknvQSHVa",
"jp61lYnG1Aj4Ps7Vku1hoitizLbOnneq5gVecG8+2O2WN7l4TImW+FS3jtrsm30UaCuj/d/xFfhlQFhY",
"TGFS7cjJoBadrt8ZERa5kWoPA4lTsr2ZgAS+27s6drCunCq0yfTO8L2iTBtZNN9vNtLdiMfwek46eXzF",
"L05EcL16Uh8QbogLyG4xMeX4fpH4k+npjw5N3qm8roR9Q/hHsDUJ0Xdwq5xq7SS+kUZNmOpaJy9ClTU6",
"c70CnUWnhCSdBjDb2oytX2SC7w1Rfibqu8BEtyHV7h0nJI/8a21ae40OYvhh8r3kboSiZDJCe6FNVkyl",
"aR2wB3FGTQZCHXiZK98Fn/bbTt4sJh05VzosMPRm8m38tJacJXl0IylcS2QTMRx4IHw8I98rDORdqSCM",
"TdLHXVyCR/ChZs1wjcWcy8VVAafcRk9k8WpVYJhMOCcgB9bqtnBGID4nap8lshl0Q4uJpDV10JJKRl/J",
"5Y1YOQkSs++XGHZ3unRKGfEWL9Ihw1/e7iHUpRjo+d0RqG7U3N/4oDZbpy6UU2apPKQjiUIADvvIi1Ns",
"JE65xzHm1jyQhiP2ZrlWS7AuJlQJg7hj15u8vOd9sBsK57AX4mcHP+jk0W8SQwphJ+rgcL7k8AQ7itxn",
"Gvp2xyZGl+TYxLtfgLKKP3TzfRrV3eQBBdpbs7PD85F64ryzy8tGeOXQoT+IdQjbk+NjCrADh33QYUjd",
"GRXE2vqAL9QJvYcO6cHx/ONcE7OFkwGLa7jVYvGGVE678JR9q8MiXiF1tI5vKS7B9Sa5eufEVaRsh1BW",
"VPDBVjR10ZFCTAlRQUoqXYuNFTihOh/7AHlSeGoLmtrhqVT2IJVTGxumXm3tYtJnjpm9/XtBjfKWkL7P",
"B+Tc+SUpjcd2wax1RC5tBHb69NDsUox7eT07kExw2Jc7arziZoyOe1B5Smzdsy/TwK/TrPzFnnn8UmzX",
"cCbTG/lceAlkJLZAvWa5HYd4EN0GpGCXtptweL/LCXISVwDqKU6OSupTytkw7dAVnXdiFFS17+SnGHZv",
"2v3pUatBMnFc0Bv2XSc6ZVZhPQiW2aW9hyY95XbNMPspIzKug4DFk7t1W3wtULDfm5Og5gs98uWnHL4A",
"BE600sptUC5zBVvpPEc8499OLe3KQEzRbvBZIy7VDaUS4QDLmqsS5VGq70aRaAnVMU0k/ohE84PV4wN8",
"/nCLbwyDMc2sthVvE4MxnPTPhsnpLt0c0d4mu+FFpRG1QMOQyZpDSEGzjknSbvfHmyL6qDjipoOwT3+p",
"t9uJbAL3uTMnQoyJB4e8CPU0AKx7XAycoabw+ACH1NKtbDe95o7DbjS7kQGHJ0MCP82oXQQbFaQFYuvg",
"hTaQqFHDBmLKFm7ln+Fb1gnTACCe1pN9xPWjd9nHLj55w9VXTt6esm2d8n605oPXlk2WxgbKCoUmQ7tV",
"ZmqFqOv4FIbzCYXud4ehdU7WM04FYTjfQ3lm+vONDqxMyxlbTrKGKDqhPqF0wgyhhsBKOiNgqjAL6VIG",
"tcKIuaBDpxpBEk1D0SbwPRDfKvyGHl21XGbVvJYVvo8SfK8UKUvjWoWTh1MGX/eL508IiAUF80FtoxUY",
"GEa0Z2DmMWMHEyhlx2yvgI2ZNbNkr+BhDvSGJ2I9Ss9bPHxJvRdPvo8DFc9O45gHZ0G/B27uT8ZaYEDc",
"7qqv6k6y1uiySrR5xEePKE+NFNeuwFNgQl/kFEW7SQuquYsScwcdtkKbYJOXQVBuo42EzEiYvuguGW4m",
"OPc98kec4m2Lg997F7jR5kdkFUu/292Z7W1WlyH2TpF2/EsY4LbObrb3NcHVnKA227oX0qc0hw3MX8Uy",
"9hi/RpvCE61uRmHCv0/MBOoyFn4ta+IevUWO0ikFrZKjjmNNdmmWfuTFD989fzlI6jf2rP1IFu+K1vTb",
"XtdiZnwI3knJmBQLMC0WFGJCHxVtAhTn70Nal+i3OdfwAWGBU0Rid8JvrEcua6Sxi9P0DR2UbyiKyKkL",
"SsF14Y9B1DmG5pCniGj0h2P47vi9+XBXRV0zi3s78VKvVrXoa7BOLZRpTzjlE+sSlWmP7MURvGX0mccs",
"IgBuOWR+OSyfArgxJoiSp7GzqLxU2QmIGdmTgVM4PSuM4xxPpJyq+YfPof/Lk4wUg9lcYH2JwrkPJoGa",
"A0CEYG03z14t5bpFdvwoz0M080iTP0PiwacIB9FenKu1ZlvRUOfYDNbK5uCY9ZDmTA4oOght5qJ0wKEI",
"+DRsQiu0kxvM7ZZ9EyOJepw75mSKYESjhZZeyQALXAkEI8EfC/gDh4Sj68AkpqRLLox5dKQHwOPHGG/I",
"GEQ0MHJfPJlZk3Bs1szSILNmllbFSX/drJklHEt+t3ReLw9k1SIdPSN8f53mMHpx1jvznWkrL6ztXtD8",
"Rm+e+8sfeLbjb3jyo8dvi7WM+4pLGz3/Hld6CxdXYdjMbHAHFMSgJLaZDNyqsT8F5vB5CGqzrdxJUxml",
"sGYNJTktswLGAGnMEM/2aln3X2FDc1KZj9O/81tE0SXYVlW76LdACazIb0Gtjwc6JgzBplPpKemzW5z0",
"XlKr8tZJlmEmAKDOWnbWq1bcqElb9J6KOkWUp4Y7DKGPI9JnSB53kokjYFMZHv6qulJttv2Ukyx/55mm",
"0Sb6ImsVDk52lq1yTExwbBTlgVStMebHc4WBR/5g/Rpi2yuYXY3zm0r2e7aO+LRglRk2zEDxPEsdxEqN",
"g4py+jt/FwGVZcqTwkFYe7HRLd6Vc6HbTp1wSvcmyvN5imxIJ3YqnYb8AfTKyyC2ksi6A+fnjOAn+We8",
"VZJT+HxwLnI7AkVqhmk68Yy0VqUsdK4HfzR2PcaMt+mKpRTdg1PMwaO74jaXy4nLi24j7aw44ECD0kQP",
"raJDSDoulFM8jWV1ikff51mUj1/HGZUPXxazK5+/oJn+eXur9I5ambsYUumDLGIX5Cid2EkKTWemFni/",
"qpuhDk9Cw9qB+MHEFELNs4eQeQGfTlgN6ArjlKM1KfM7NCJis5SZFLFVo6/+8hJRGPAsF4IqnXQPi3cr",
"ixnWokopn2hldqCYS+ULt1ty/iLRA05wLQt0TmDYCNu1ZIHGN6nGzsETH6d8rMy9PV+g0enANChFkbzD",
"MxpB1MNiqgjV83LvlBfL3jmqd7Hr0l70yfaOCbzZsiFmkb0lD7bb+Ip74X1U5H9GjvJDU8OJVGyNZdee",
"4kZGZqwmp5rEBinzObyK5Q+sUQ07G6X6b/CJ6i444etAAZhPJYN3gW6JlVsTHifkNfY6oeOg3tPBuAj9",
"vVUXNRz0Xi2KM1TVOLu76g4qlUDrFdAwWlGmlaIoCyGQK5tgLIdFR/kqxZSoPWYf81R4tI6q/7Cbc10j",
"XqeRInH6hTgFGFYYKzqsoEQng3gEOTosSOo4B3baFusO3pT/D6d2q6WygH9BMXaoQXEqmyFxH+5xpphD",
"2jDGybGX6fg2yKCtb/cuHajeTmReeatkRb08qXvy6rcUGZgdd6MOCr1dqF+SBNb22hykUqrkeKtN+ox8",
"uGqeUmG94KpTu7MGBz+8gyjBPYV7thjkRl52OgijVJvS+6fKlmGt3LX2dd+/tfVh2pMxvs3DIcdIEhEu",
"I+LsTsfWaXYEHXbL2qd1CFsvqFEOEMIud8vU4chrrFywVI4d/5Vo7UZqcxfW/ow7A387ubxUVAomqBPx",
"k0UusBE/AQx/BADy79dyudZGPe/DuhGn5EwPPzhPu3Xi7c5tN81xIQOYdrqAf4JYHWf85YRrXX2Ro7hP",
"FtJBvQXf0L++GURm2QsipfBDB1+4JdA30TJYqdk69srP+5D99/bHS0UFW5zhIy7d6KIVkmRmGaJ4lXWQ",
"MgRloEtxo8IJkNMcn4/O7YsL6xakfbNOUJCFtxj9+xg7ID9WyrxubuL688D+CcUEAxuYI4JzZi6cHIfz",
"OCT2QDSw1aYP2cbwJoZqy/OifIySrVipQBeBXhnZ+ZQura5hOJdeLbh43i7Epx0NSXOxPxk3qVOlZ4mU",
"3HhYYjo8L/TSdjX75iv2FGBR9M+v2FdQbGWnQsASLFzjQwYqAYKpCqTADgFCdDfRV8iNU1CVNRxShPsC",
"fAE6VKxs/V5/CEfPh9ExcUZmvpBiXfVrqZH4pGy5BQfUxL/Q6a8FyIxGEOcKGju1sVdTQbV3LludYlBz",
"aOtAsSUngoPvoC6DpexTld1GjCarR4/jofbtIKfhAxiUn+zblRz9W43Rtaxs2RfpNaWOxbfRl+K3XvpE",
"66uu0eNk/o4AGmPwg6VjX4VekQvgNt60SNCQPqRQw2niw3BFf85YKZsDhEze2GiCSzn6mFJps0qoYM1S",
"FSG/eMy8iCX1YwaCteruQNBoDUnzU8FSeJWOwGAnaGUbealiZSfEaPwg8zjRzy/4tGD2Cwo0rp/clVto",
"ToZsSXH4Hs36SR18oi8lBUnFoYlPhm+jmobWiQ23Pf5grb310faFsWyTiA0CA1wHCzJT71vFJmf00Ohx",
"xejALsPUwQh/It3jl7xkvtl0mNbh0weL25M1krxAe8cXRKZVUVdOc0VgEr9R8DTQIPnak24Wnt+Jrm2t",
"CwtgCqYU6M4PeJUYbQLPtlhW5nHqAuvkxD/+HcpfbSU6ADKcoytkmzxxYJlvfn57tlfZM51lEBg03JH6",
"5PHVsMR5kORTuMPcUfS19CXhOxGxjjvmfsluEAlTlU+AabAumTZ9bKxpqcT0ZU4Z3BfF81g1A2iUsTvT",
"wXn6uXgVUo4BNLJy8GiOS21EPZa4KdosQJGOKV+SlT2im3WUqiQ9QEl2UKqcIcDVeGF9B7vFyfYG6ceL",
"3Ef5MPa2X+Sy5PIc1IALAQnrUm0DaM1CSrnDBN6j1Omk8VQOBbaVwk4ImISPmFcHgES948pryWeYgaeT",
"kDW5JzUul+4P4sCe8YGtnNAmGzrThQMiS3zaZJ0QYgga5XckiwGxVZ1XqPB+JjI3+QxEndyNDiQIG8TC",
"JOo8i7dgCqp9HQWeSDrHpFJ7zmVzLW/oc7WASzEN5NPNwZ4V6WKKHZZXcexiwBQNJ7PLNOWu4X96+Gwa",
"cKRsKq1xlK8HaSy/5I+fFa7ycRY8KMSXxdeLLWVkEucqXCtlBOVpIvcYPPu4YdlLdZSqCcYnbpodNp8x",
"HQg2i5w7Jzub3CJRS1lBduRV/mjBnXC9KSIuzzIORk8uWFyJsIRrdE2NzZRko3zGKGfsgv1JuCtWTqIq",
"U65GNGWfJXAI2vSAfkeGZWQGq1oP45TIk6RoiIg6q7LuzWy4AbnLDP8DqR9oXUaGyPSIrZDp78IEmT/D",
"Gb1JYBi9GD18nQCTHr0sITRoqNpKu+HDn+xzhl169DwCcdjXDwTM4cPnANS3EabF1GV7c2ZfM2jHUzjN",
"IK6XNkDxvb7fd9uU3j+PfeVHO6DpfYYNzogE6cVByuGBj+Kuqngn00PKnpQOj1EHaY4Lm3LNITwLCQMn",
"OARJcsHLckIzdJpDnjjyBoXpqZ7JxbZ2oavZwXeknLOfX/4837SY6no4WulPcidOdjqi8fupe5i1D3KT",
"5pUaaaxv9w9VKpPE45UKgB0xrDK5tCzt9uYJ5GrLfUcSGHNsFsWkWLH6mP7P7xYpSCNq6ahOCmzkk2c7",
"IWhg1QxjqfSXqi20CuQ84C8X+GdFF/lQPOdEVwVfN1wMWpjeBfH4tXSXoBbONqHl2uolesFiRIb04u9H",
"4rF4ghfS38Ux/vlv8c+tXl4eWYMi5N+PxF/E38p2f3n3t7IduOSitzKyX0+aBNFGWJyZF4+VXK55DuiE",
"/i6gtc26Vrknjdj0XdBbsCUE15Nbf+z6SSOcAjUIeuSKx7CYjXSwQ7ymR9jfk0bI5BfpycfirlyvU952",
"V3fcpPTRhNfYIMrpIA4V0TXdQxVO9SAKhL0w/bkDm45aqAJO+dOKcFUy8NHLdeDImhc/eS5poW3tvv0o",
"wLFCHBh7bV7R59+MYTlxB9463Rp/UKDfwTMuXHkr+3wfmtGqTl8p92koDfq/Vgxu4JMpdOsHN30knuQ1",
"64UEwdXrNooJBDcgnwk0OwOOIQAtp04rE5cBrG/tMHnPmunrCBxjuFlkRJLehtzFfLC2Ff/ofRhKQrRE",
"tDWASUS1A9ikG41MXGmniPdhVXQeGl2dxDnM6VKZ+R35fFY/HnxcQBkHH/ZeuQOpRNwc/iip6xhrmsGJ",
"uFXCrx3ez3DGplDckmOVdXyJkTInXXjxjjsR5/EsoN2BrLpwPpqv5XCM1rWlaTNT4JWJtzREnsplQFdD",
"xWEsiREo7nRiC1DNWDQqgXK3ZUQcrsCfpgkNdoEZnWA2EpRkpcUugtgpsdJXysxFXDT9LzthbFBMvXAn",
"BoxSAZO6OvZ+Z2t8hNLpwf5uPRJnPGoK/SVITern4/en46gvu1UGY3f8tXKkaYlSGIaebJXzqq3qV5rZ",
"j0q2P9na0fyUDO6ATdsv1hiMM4ZAceVFsAOpQdJbVJnmJhzyxJ3Ud3iKrLKW9g6LrMYRQfcjTqnouYYK",
"KAl/L5fBTyggJAvLfGFRWCfeIB1qm00r1vZaXEgnNGiiz5UyMaqzJRO/D3CmMcgWDW854gU/RzZ825N/",
"aPJJzlrQIJbSCFLOQYvHHIyrUBJuhExXW5MCIpPvT8NeG6A4sU6s5ZVGi9gFydEiYit8imIYuBOQ4aCJ",
"jj4AqxxLKs6dNEAf7BUPz/p2tEu2ygQMF4PparNKMZhzdIxcXACoaXENx4kyq8tOZ+gzkXelYW9kL1jU",
"ASg0nATAqKSs51ue3EOpVVtzCN8CWJZ6K6uhkGdRNmWvvxwRPQxTQmcg/A7iTU1AUydfRRl8CO8W452A",
"YDCsM3/C8czkWwzKlCdZeGN8044d07lTCORFQCIFZqDgzRFdYWie2MbFRQx2RooX9kj2YW2dao/Ob2Ax",
"ulOOoHXQzf8mA7F28RAKLpa2n4qrMP3mnNZIbX3+uYjIXGfMuBG5Dk1bFdI52O2X3Y7qOuLYPZ2OCoaw",
"/qk24Ueez5pq07KIRDoF6mrWqe1dVwwZvtfCcpKMvYuL7Se2JicKCMqHzDbjUkjxLjE2H23g4jFhNXoq",
"XjZZnfPkmXiaHH3Ik3SkbCpW3xtE2HZBfhkVuJMfkR8QTyZEJYz59ZBU3TIm+kXUdrpTvIEQR6hcEToM",
"H4pz6RXkJIi+rC3TnRwSPTVwvB7Y4uL3WseyjETTKEKYeYuoO3neKVE5PFPmhB2Y74CkOtVdNBod+B1c",
"Hh/a3VPWDMly/Z5G+jclv9wqUH+EEAFcxd047wN8A7WnSxy18zIoh8H0cxF9LXf2euTt15QPy3QOSWpO",
"NxfdkPWYVwhdnuIG0Vedk4ekScMXTY4QouOGfte/9qpXxBDh33H8xMjkKQHH41q/l0Ucge52YeR2LfaU",
"cewnG/QF50N649RF9TxiXABQHV6PgY9uCCjkNsA3r1z+fApc8a4+u9V+KV0F2sgf8duF71crSu5BI9Vp",
"OXrWViYaUyPg+zhXS7aHia6IMds6e96pmhd4wb35YLdb3uTiMSVa4lPdOmqzb/ZRoK2M9n/HV+CXAWFh",
"MYVJtSMng1p0un5nRFjkRqo9DCROyfZmAhL4bu/q2MG6cqrQJtM7w/eKMm1k0Xy/2Uh3Ix7D6znp5PEV",
"vzgRwfXqSX1AuCEuILvFxJTj+0XiT6anPzo0eafyuhL2DeEfwdYkRN/BrXKqtZP4Rho1YaprnbwIVdbo",
"zPUKdBadEpJ0GsBsazO2fpEJvjdE+Zmo7wIT3YZUu3eckDzyr7Vp7TU6iOGHyfeSuxGKkskI7YU2WTGV",
"pnXAHsQZNRkIdeBlrnwXfNpvO3mzmHTkXOmwwNCbybfx01pyluTRjaRwLZFNxHDggfDxjHyvMJB3pYIw",
"Nkkfd3EJHsGHmjXDNRZzLhdXBZxyGz2RxatVgWEy4ZyAHFir28IZgficqH2WyGbQDS0mktbUQUsqGX0l",
"lzdi5SRIzL5fYtjd6dIpZcRbvEiHDH95u4dQl2Kg53dHoLpRc3/jg9psnbpQTpml8pCOJAoBOOwjL06x",
"kTjlHseYW/NAGo7Ym+VaLcG6mFAlDOKOXW/y8p73wW4onMNeiJ8d/KCTR79JDCmEnaiDw/mSwxPsKHKf",
"aejbHZsYXZJjE+9+Acoq/tDN92lUd5MHFGhvzc4Oz0fqifPOLi8b4ZVDh/4g1iFsT46PKcAOHPZBhyF1",
"Z1QQa+sDvlAn9B46pAfH849zTcwWTgYsruFWi8UbUjntwlP2rQ6LeIXU0Tq+pbgE15vk6p0TV5GyHUJZ",
"UcEHW9HURUcKMSVEBSmpdC02VuCE6nzsA+RJ4aktaGqHp1LZg1RObWyYerW1i0mfOWb29u8FNcpbQvo+",
"H5Bz55ekNB7bBbPWEbm0Edjp00OzSzHu5fXsQDLBYV/uqPGKmzE67kHlKbF1z75MA79Os/IXe+bxS7Fd",
"w5lMb+Rz4SWQkdgC9ZrldhziQXQbkIJd2m7C4f0uJ8hJXAGopzg5KqlPKWfDtENXdN6JUVDVvpOfYti9",
"afenR60GycRxQW/Yd53olFmF9SBYZpf2Hpr0lNs1w+ynjMi4DgIWT+7WbfG1QMF+b06Cmi/0yJefcvgC",
"EDjRSiu3QbnMFWyl8xzxjH87tbQrAzFFu8FnjbhUN5RKhAMsa65KlEepvhtFoiVUxzSR+CMSzQ9Wjw/w",
"+cMtvjEMxjSz2la8TQzGcNI/Gyanu3RzRHub7IYXlUbUAg1DJmsOIQXNOiZJu90fb4roo+KImw7CPv2l",
"3m4nsgnc586cCDEmHhzyItTTALDucTFwhprC4wMcUku3st30mjsOu9HsRgYcngwJ/DSjdhFsVJAWiK2D",
"F9pAokYNG4gpW7iVf4ZvWSdMA4B4Wk/2EdeP3mUfu/jkDVdfOXl7yrZ1yvvRmg9eWzZZGhsoKxSaDO1W",
"makVoq7jUxjOJxS63x2G1jlZzzgVhOF8D+WZ6c83OrAyLWdsOckaouiE+oTSCTOEGgIr6YyAqcIspEsZ",
"1Aoj5oIOnWoESTQNRZvA90B8q/AbenTVcplV81pW+D5K8L1SpCyNaxVOHk4ZfN0vnj8hIBYUzAe1jVZg",
"YBjRnoGZx4wdTKCUHbO9AjZm1sySvYKHOdAbnoj1KD1v8fAl9V48+T4OVDw7jWMenAX9Hri5PxlrgQFx",
"u6u+qjvJWqPLKtHmER89ojw1Uly7Ak+BCX2RUxTtJi2o5i5KzB102Aptgk1eBkG5jTYSMiNh+qK7ZLiZ",
"4Nz3yB9xirctDn7vXeBGmx+RVSz9bndntrdZXYbYO0Xa8S9hgNs6u9ne1wRXc4LabOteSJ/SHDYwfxXL",
"2GP8Gm0KT7S6GYUJ/z4xE6jLWPi1rIl79BY5SqcUtEqOOo412aVZ+pEXP3z3/OUgqd/Ys/YjWbwrWtOv",
"e12LmfEheCclY1IswLRYUIgJfVS0CVCcvw9pXaLf5lzDB4QFThGJ3Qm/sR65rJHGLk7TN3RQvqEoIqcu",
"KAXXhT8GUecYmkOeIqLRH47hu+P35sNdFXXNLO7txEu9WtWir8E6tVCmPeGUT6xLVKY9shdH8JbRZx6z",
"iAC45ZD55bB8CuDGmCBKnsbOovJSZScgZmRPBk7h9KwwjnM8kXKq5h8+h/4vTzJSDGZzgfUlCuc+mARq",
"DgARgrXdPHu1lOsW2fGjPA/RzCNN/gyJB58iHER7ca7Wmm1FQ51jM1grm4Nj1kOaMzmg6CC0mYvSAYci",
"4NOwCa3QTm4wt1v2TYwk6nHumJMpghGNFlp6JQMscCUQjAR/LOAPHBKOrgOTmJIuuTDm0ZEeAI8fY7wh",
"YxDRwMh98WRmTcKxWTNLg8yaWVoVJ/11s2aWcCz53dJ5vTyQVYt09Izw/XWaw+jFWe/Md6atvLC2e0Hz",
"G7157i9/4NmOv+HJjx6/LdYy7isubfT8e1zpLVxchWEzs8EdUBCDkthmMnCrxv4UmMPnIajNtnInTWWU",
"wpo1lOS0zAoYA6QxQzzbq2Xdf4UNzUllPk7/zm8RRZdgW1Xtot8CJbAivwW1Ph7omDAEm06lp6TPbnHS",
"e0mtylsnWYaZAIA6a9lZr1pxoyZt0Xsq6hRRnhruMIQ+jkifIXncSSaOgE1lePir6kq12fZTTrL8nWea",
"Rpvoi6xVODjZWbbKMTHBsVGUB1K1xpgfzxUGHvmD9WuIba9gdjXObyrZ79k64tOCVWbYMAPF8yx1ECs1",
"DirK6e/8XQRUlilPCgdh7cVGt3hXzoVuO3XCKd2bKM/nKbIhndipdBryB9ArL4PYSiLrDpyfM4Kf5J/x",
"VklO4fPBucjtCBSpGabpxDPSWpWy0Lke/NHY9Rgz3qYrllJ0D04xB4/uittcLicuL7qNtLPigAMNShM9",
"tIoOIem4UE7xNJbVKR59n2dRPn4dZ1Q+fFnMrnz+gmb65+2t0jtqZe5iSKUPsohdkKN0YicpNJ2ZWuD9",
"qm6GOjwJDWsH4gcTUwg1zx5C5gV8OmE1oCuMU47WpMzv0IiIzVJmUsRWjb76y0tEYcCzXAiqdNI9LN6t",
"LGZYiyqlfKKV2YFiLpUv3G7J+YtEDzjBtSzQOYFhI2zXkgUa36QaOwdPfJzysTL39nyBRqcD06AURfIO",
"z2gEUQ+LqSJUz8u9U14se+eo3sWuS3vRJ9s7JvBmy4aYRfaWPNhu4yvuhfdRkf8ZOcoPTQ0nUrE1ll17",
"ihsZmbGanGoSG6TM5/Aqlj+wRjXsbJTqv8EnqrvghK8DBWA+lQzeBbolVm5NeJyQ19jrhI6Dek8H4yL0",
"91Zd1HDQe7UozlBV4+zuqjuoVAKtV0DDaEWZVoqiLIRArmyCsRwWHeWrFFOi9ph9zFPh0Tqq/mY357pG",
"vE4jReL0C3EKMKwwVnRYQYlOBvEIcnRYkNRxDuy0LdYdvCn/H07tVktlAf+CYuxQg+JUNkPiPtzjTDGH",
"tGGMk2Mv0/FtkEFb3+5dOlC9nci88lbJinp5Uvfk1a8pMjA77kYdFHq7UL8kCazttTlIpVTJ8Vab9Bn5",
"cNU8pcJ6wVWndmcNDn54B1GCewr3bDHIjbzsdBBGqTal90+VLcNauWvt675/a+vDtCdjfJuHQ46RJCJc",
"RsTZnY6t0+wIOuyWtU/rELZeUKMcIIRd7papw5HXWLlgqRw7/ivR2o3U5i6s/Rl3Bv52cnmpqBRMUCfi",
"J4tcYCN+Ahj+CADk36/lcq2Net6HdSNOyZkefnCeduvE253bbprjQgYw7XQB/wSxOs74ywnXuvoiR3Gf",
"LKSDegu+oX99M4jMshdESuGHDr5wS6BvomWwUrN17JWf9yH77+2Pl4oKtjjDR1y60UUrJMnMMkTxKusg",
"ZQjKQJfiRoUTIKc5Ph+d2xcX1i1I+2adoCALbzH69zF2QH6slHnd3MT154H9E4oJBjYwRwTnzFw4OQ7n",
"cUjsgWhgq00fso3hTQzVludF+RglW7FSgS4CvTKy8yldWl3DcC69WnDxvF2ITzsakuZifzJuUqdKzxIp",
"ufGwxHR4Xuil7Wr2zVfsKcCi6J9fsa+g2MpOhYAlWLjGhwxUAgRTFUiBHQKE6G6ir5Abp6AqazikCPcF",
"+AJ0qFjZ+r3+EI6eD6Nj4ozMfCHFuurXUiPxSdlyCw6oiX+h018LkBmNIM4VNHZqY6+mgmrvXLY6xaDm",
"0NaBYktOBAffQV0GS9mnKruNGE1Wjx7HQ+3bQU7DBzAoP9m3Kzn6txqja1nZsi/Sa0odi2+jL8WvvfSJ",
"1lddo8fJ/B0BNMbgB0vHvgq9IhfAbbxpkaAhfUihhtPEh+GK/pyxUjYHCJm8sdEEl3L0MaXSZpVQwZql",
"KkJ+8Zh5EUvqxwwEa9XdgaDRGpLmp4Kl8CodgcFO0Mo28lLFyk6I0fhB5nGin1/wacHsFxRoXD+5K7fQ",
"nAzZkuLwPZr1kzr4RF9KCpKKQxOfDN9GNQ2tExtue/zBWnvro+0LY9kmERsEBrgOFmSm3reKTc7oodHj",
"itGBXYapgxH+RLrHL3nJfLPpMK3Dpw8WtydrJHmB9o4viEyroq6c5orAJH6j4GmgQfK1J90sPL8TXdta",
"FxbAFEwp0J0f8Cox2gSebbGszOPUBdbJiX/8O5S/2kp0AGQ4R1fINnniwDLf/Pz2bK+yZzrLIDBouCP1",
"yeOrYYnzIMmncIe5o+hr6UvCdyJiHXfM/ZLdIBKmKp8A02BdMm362FjTUonpy5wyuC+K57FqBtAoY3em",
"g/P0c/EqpBwDaGTl4NEcl9qIeixxU7RZgCIdU74kK3tEN+soVUl6gJLsoFQ5Q4Cr8cL6DnaLk+0N0o8X",
"uY/yYextv8hlyeU5qAEXAhLWpdoG0JqFlHKHCbxHqdNJ46kcCmwrhZ0QMAkfMa8OAIl6x5XXks8wA08n",
"IWtyT2pcLt0fxIE94wNbOaFNNnSmCwdElvi0yTohxBA0yu9IFgNiqzqvUOH9TGRu8hmIOrkbHUgQNoiF",
"SdR5Fm/BFFT7Ogo8kXSOSaX2nMvmWt7Q52oBl2IayKebgz0r0sUUOyyv4tjFgCkaTmaXacpdw//08Nk0",
"4EjZVFrjKF8P0lh+yR8/K1zl4yx4UIgvi68XW8rIJM5VuFbKCMrTRO4xePZxw7KX6ihVE4xP3DQ7bD5j",
"OhBsFjl3TnY2uUWilrKC7Mir/NGCO+F6U0RcnmUcjJ5csLgSYQnX6JoamynJRvmMUc7YBfuTcFesnERV",
"plyNaMo+S+AQtOkB/Y4My8gMVrUeximRJ0nREBF1VmXdm9lwA3KXGf4HUj/QuowMkekRWyHT34UJMn+G",
"M3qTwDB6MXr4OgEmPXpZQmjQULWVdsOHP9nnDLv06HkE4rCvHwiYw4fPAahvI0yLqcv25sy+ZtCOp3Ca",
"QVwvbYDie32/77YpvX8e+8qPdkDT+wwbnBEJ0ouDlMMDH8VdVfFOpoeUPSkdHqMO0hwXNuWaQ3gWEgZO",
"cAiS5IKX5YRm6DSHPHHkDQrTUz2Ti23tQlezg+9IOWc/v/x5vmkx1fVwtNKf5E6c7HRE4/dT9zBrH+Qm",
"zSs10ljf7jdVKpPE45UKgB0xrDK5tCzt9uYJ5GrLfUcSGHNsFsWkWLH6mP7P7xYpSCNq6ahOCmzkk2c7",
"1790qpQR2FakQ+RMI2txI8Brby3R4yQp53CfWWUZ1mqT3Eie3x3ki4nYkO/HEgvqicuN2N0Bas230TMx",
"lKaiL3IG853nmwB9rxTe7I1RivRJbTruv1C2lnJW1HAWaQemg5Cj1n/PzTeWgydutpJ6DXTrQ+3MlAXh",
"Rc5cNqrdMik7RmWSI9drkCSkYzpykpUsR9DDQB3O50NOeMtiJGhSL2xhhbYfMFow3kQUYHeHNOhF+aBa",
@@ -4672,170 +4666,171 @@ var swaggerSpec = []string{
"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",
"FNp+voIgOyRuwpwUMAxxxJp8NQrtDx/+1wA=",
"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",
"uAkTUcDQwhEz+dUoqT98+F8DAA==",
}
// decodeSpec returns the embedded OpenAPI spec as raw JSON bytes,
+2
View File
@@ -41,6 +41,8 @@ type Server struct {
usersMu sync.Mutex
users map[string]string
terminalsMu sync.Mutex
}
type ctxKey struct{}
+21 -16
View File
@@ -10,6 +10,7 @@ import (
"github.com/coder/websocket"
"g.fc.run/ai/byre/internal/api"
"g.fc.run/ai/byre/internal/store"
"g.fc.run/ai/byre/internal/terminal"
)
@@ -21,23 +22,27 @@ const (
var newTerminalSize = api.TerminalSize{Cols: 80, Rows: 24}
func (s *Server) terminalsChanged(taskID string) {
s.store.Broadcast(api.Event{Kind: "terminals.changed", TaskId: &taskID, Actor: "byre", Payload: map[string]any{}})
}
func taskTerminal(term *terminal.Terminal) api.TaskTerminal {
return api.TaskTerminal{Id: term.ID, Name: term.Name, StartedAt: term.Started().UTC()}
}
func (s *Server) ListTaskTerminals(w http.ResponseWriter, r *http.Request, taskID string) {
_, ok := s.activeTask(w, r, taskID)
if !ok {
return
}
out := []api.TaskTerminal{}
s.terminalsMu.Lock()
defer s.terminalsMu.Unlock()
list := api.TerminalList{Terminals: []api.TaskTerminal{}}
for _, term := range s.terminals.List(taskID) {
out = append(out, taskTerminal(term))
list.Terminals = append(list.Terminals, taskTerminal(taskID, term))
}
writeJSON(w, http.StatusOK, out)
s.store.Broadcast(api.Event{Kind: "terminals.changed", TaskId: &taskID, Actor: "byre", Payload: store.ToPayload(list)})
}
func taskTerminal(taskID string, term *terminal.Terminal) api.TaskTerminal {
return api.TaskTerminal{Id: term.ID, TaskId: taskID, Name: term.Name, StartedAt: term.Started().UTC()}
}
func (s *Server) ListTerminals(w http.ResponseWriter, r *http.Request) {
list := api.TerminalList{Terminals: []api.TaskTerminal{}}
for taskID, terms := range s.terminals.All() {
for _, term := range terms {
list.Terminals = append(list.Terminals, taskTerminal(taskID, term))
}
}
writeJSON(w, http.StatusOK, list)
}
func (s *Server) StartTaskTerminal(w http.ResponseWriter, r *http.Request, taskID string) {
@@ -64,7 +69,7 @@ func (s *Server) StartTaskTerminal(w http.ResponseWriter, r *http.Request, taskI
writeError(w, http.StatusInternalServerError, err)
return
}
writeJSON(w, http.StatusCreated, taskTerminal(term))
writeJSON(w, http.StatusCreated, taskTerminal(taskID, term))
}
func (s *Server) CloseTaskTerminal(w http.ResponseWriter, r *http.Request, taskID, terminalID string) {
+10
View File
@@ -109,6 +109,16 @@ func (ts *Terminals) List(taskID string) []*Terminal {
return slices.Clone(ts.byTask[taskID])
}
func (ts *Terminals) All() map[string][]*Terminal {
ts.mu.Lock()
defer ts.mu.Unlock()
out := map[string][]*Terminal{}
for taskID, terms := range ts.byTask {
out[taskID] = slices.Clone(terms)
}
return out
}
func (ts *Terminals) Get(taskID, id string) *Terminal {
ts.mu.Lock()
defer ts.mu.Unlock()
+2 -1
View File
@@ -236,7 +236,8 @@ final class Connection {
async let inbox: Void = store.loadInbox()
async let lead: Void = store.loadLeadSessions()
async let reads: Void = store.loadSummaryReads()
_ = try await (me, projects, inbox, lead, reads)
async let terminals: Void = store.loadTerminals()
_ = try await (me, projects, inbox, lead, reads, terminals)
try await store.loadFocus()
guard !stopped else {
await store.stop()
+23
View File
@@ -60,6 +60,7 @@ final class Store {
var tasks: [String: [ByreTask]] = [:]
var sessions: [String: [AgentSession]] = [:]
var inbox: [InboxItem] = []
private(set) var terminals: [String: [TaskTerminal]] = [:]
private(set) var selectedTaskId: String?
var pinned: Int?
var connected = false
@@ -85,6 +86,7 @@ final class Store {
private var taskFeeds: [String: Feed] = [:]
@ObservationIgnored private var historyLoads: Set<ObjectIdentifier> = []
@ObservationIgnored private var requestSeqs: [String: Int] = [:]
@ObservationIgnored private var terminalChanges = 0
@ObservationIgnored private var globalStream: EventStream?
@ObservationIgnored private var leadStream: EventStream?
@ObservationIgnored private var stopped = false
@@ -367,6 +369,20 @@ final class Store {
drafts?.prune(self)
}
func loadTerminals() async throws {
let latest = claimRequest("terminals")
let changes = terminalChanges
let list = try await api.client.listTerminals().ok.body.json
if !latest() {
return
}
if changes != terminalChanges {
try await loadTerminals()
return
}
terminals = Dictionary(grouping: list.terminals, by: \.taskId)
}
func loadLeadSessions() async throws {
leadSessions = try await api.client.listLeadSessions().ok.body.json
}
@@ -607,6 +623,9 @@ final class Store {
}, onState: { [weak self] up in
self?.connected = up
if up {
self?.spawn("load terminals") {
try await self?.loadTerminals()
}
self?.paneFocus.reconnected()
reconnected()
}
@@ -632,6 +651,10 @@ final class Store {
taskFeeds[taskId]?.push(ev)
confirmSend(taskId, ev)
}
if ev.kind == "terminals.changed", let taskId = ev.taskId {
terminalChanges += 1
terminals[taskId] = try! decodePayload(ev.payload, as: TerminalList.self).terminals
}
if ev.seq == 0 {
events.send(ev)
return
+13 -50
View File
@@ -7,6 +7,7 @@ let exitedCode = 4000
private let retryAfter = Duration.seconds(2)
typealias TaskTerminal = Components.Schemas.TaskTerminal
typealias TerminalList = Components.Schemas.TerminalList
typealias SavedCommand = Components.Schemas.SavedCommand
@MainActor
@@ -17,24 +18,23 @@ func terminalFocused() -> Bool {
struct TerminalTab: View {
@Environment(Store.self) private var store
@Environment(Overlays.self) private var overlays
@ViewState private var list: [TaskTerminal]?
@ViewState private var commands: [SavedCommand] = []
@ViewState private var selected: String?
@ViewState private var status = ""
@ViewState private var failure: String?
@ViewState private var started = false
@ViewState private var loads = 0
@ViewState private var starting = false
@ViewState private var off: (() -> Void)?
var body: some View {
let taskId = store.selectedTaskId
let task = taskId.flatMap { store.findTask($0) }
let current = list?.first { $0.id == selected }?.id ?? list?.first?.id
let list = taskId.flatMap { store.terminals[$0] } ?? []
let current = list.first { $0.id == selected }?.id ?? list.first?.id
VStack(spacing: 0) {
HStack(alignment: .firstTextBaseline, spacing: 12) {
ScrollView(.horizontal, showsIndicators: false) {
HStack(alignment: .firstTextBaseline, spacing: 4) {
ForEach(list ?? [], id: \.id) { term in
ForEach(list, id: \.id) { term in
HStack(alignment: .firstTextBaseline, spacing: 0) {
RangeTabButton(label: term.name, active: term.id == current, help: "Show this terminal") {
selected = term.id
@@ -77,13 +77,11 @@ struct TerminalTab: View {
store?.findTask(taskId)?.status == .active
}, show: { text in
status = text
}, lost: {
load()
})
.id("\(taskId) \(current)")
} else if let failure {
EmptyText(text: failure, error: true)
} else if list != nil {
} else if !starting {
EmptyText(text: "No terminals are open in this task.")
}
} else if taskId == nil {
@@ -98,23 +96,16 @@ struct TerminalTab: View {
.background(Palette.bg)
}
.onChange(of: "\(taskId ?? "") \(task?.status.rawValue ?? "")", initial: true) {
list = nil
selected = nil
status = ""
failure = nil
started = false
load()
}
.onChange(of: store.connected) {
if store.connected {
load()
starting = false
if task?.status == .active && list.isEmpty {
start(nil)
}
}
.onAppear {
off = store.events.add { ev in
if ev.kind == "terminals.changed" && ev.taskId == store.selectedTaskId {
load()
}
if ev.kind == "command.saved" || ev.kind == "command.deleted" {
loadCommands()
}
@@ -124,30 +115,6 @@ struct TerminalTab: View {
.onDisappear {
off?()
off = nil
loads += 1
}
}
private func load() {
guard let taskId = store.selectedTaskId, store.findTask(taskId)?.status == .active else {
return
}
loads += 1
let n = loads
Task {
do {
let loaded = try await store.api.client.listTaskTerminals(path: .init(taskId: taskId)).ok.body.json
if n != loads {
return
}
list = loaded
failure = nil
if loaded.isEmpty && !started {
start(nil)
}
} catch {
failure = errorText(error)
}
}
}
@@ -165,17 +132,17 @@ struct TerminalTab: View {
guard let taskId = store.selectedTaskId else {
return
}
started = true
starting = true
Task {
do {
let term = try await store.api.client.startTaskTerminal(path: .init(taskId: taskId), body: .json(.init(commandId: commandId))).created.body.json
if store.selectedTaskId == taskId {
selected = term.id
load()
}
} catch {
failure = errorText(error)
}
starting = false
}
}
@@ -199,11 +166,10 @@ struct TerminalHost: NSViewRepresentable {
let terminalId: String
let active: @MainActor () -> Bool
let show: @MainActor (String) -> Void
let lost: @MainActor () -> Void
@Environment(\.colorScheme) private var scheme
func makeCoordinator() -> TerminalSession {
TerminalSession(api: api, taskId: taskId, terminalId: terminalId, active: active, show: show, lost: lost)
TerminalSession(api: api, taskId: taskId, terminalId: terminalId, active: active, show: show)
}
func makeNSView(context: Context) -> TerminalView {
@@ -261,20 +227,18 @@ final class TerminalSession: NSObject, TerminalViewDelegate, URLSessionWebSocket
let terminalId: String
let active: @MainActor () -> Bool
let show: @MainActor (String) -> Void
let lost: @MainActor () -> Void
weak var view: TerminalView?
var scheme: ColorScheme?
private var ws: URLSessionWebSocketTask?
private var retry: Task<Void, Never>?
private var done = false
init(api: API, taskId: String, terminalId: String, active: @escaping @MainActor () -> Bool, show: @escaping @MainActor (String) -> Void, lost: @escaping @MainActor () -> Void) {
init(api: API, taskId: String, terminalId: String, active: @escaping @MainActor () -> Bool, show: @escaping @MainActor (String) -> Void) {
self.api = api
self.taskId = taskId
self.terminalId = terminalId
self.active = active
self.show = show
self.lost = lost
}
func connect() {
@@ -345,7 +309,6 @@ final class TerminalSession: NSObject, TerminalViewDelegate, URLSessionWebSocket
return
}
show("disconnected, reconnecting…")
lost()
retry = Task {
try? await Task.sleep(for: retryAfter)
if !Task.isCancelled {