@band-app/server 0.46.0 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/client/_shell.html +0 -0
  2. package/dist/client/assets/{TerminalPanel-pkSSHqjB.js → TerminalPanel-DkQbk-aU.js} +1 -1
  3. package/dist/client/assets/{_basePickBy-30wa-B3K.js → _basePickBy-Dpp3dGrC.js} +1 -1
  4. package/dist/client/assets/{_baseUniq-DYFc8VYN.js → _baseUniq-CL7CCXzw.js} +1 -1
  5. package/dist/client/assets/{arc-aFj-W69O.js → arc-Dgc_RxlI.js} +1 -1
  6. package/dist/client/assets/{architectureDiagram-VXUJARFQ-CUH4fJYm.js → architectureDiagram-VXUJARFQ-CgG43jHE.js} +1 -1
  7. package/dist/client/assets/{blockDiagram-VD42YOAC-CRkquXXQ.js → blockDiagram-VD42YOAC-Bt7XXELu.js} +1 -1
  8. package/dist/client/assets/{c4Diagram-YG6GDRKO-CD-EJ5GA.js → c4Diagram-YG6GDRKO-BQwG7Gi0.js} +1 -1
  9. package/dist/client/assets/channel-BhaORH-2.js +1 -0
  10. package/dist/client/assets/{chunk-4BX2VUAB-VhYl9M0k.js → chunk-4BX2VUAB-BwFghqiW.js} +1 -1
  11. package/dist/client/assets/{chunk-55IACEB6-BQC_5pzd.js → chunk-55IACEB6-C7yjJLc1.js} +1 -1
  12. package/dist/client/assets/{chunk-B4BG7PRW-C1FqesKA.js → chunk-B4BG7PRW-BaJd9PuL.js} +1 -1
  13. package/dist/client/assets/{chunk-DI55MBZ5-DYC7fpTc.js → chunk-DI55MBZ5-CElPgENm.js} +1 -1
  14. package/dist/client/assets/{chunk-FMBD7UC4-DwHYZG2m.js → chunk-FMBD7UC4-D3qe2ywl.js} +1 -1
  15. package/dist/client/assets/{chunk-QN33PNHL-QrOgqJ2x.js → chunk-QN33PNHL-DStfzqTU.js} +1 -1
  16. package/dist/client/assets/{chunk-QZHKN3VN-BfeDvyyD.js → chunk-QZHKN3VN-B1rMgEw-.js} +1 -1
  17. package/dist/client/assets/{chunk-TZMSLE5B-DqbFla-p.js → chunk-TZMSLE5B-BEcRDS9V.js} +1 -1
  18. package/dist/client/assets/classDiagram-2ON5EDUG-iB9V-fQK.js +1 -0
  19. package/dist/client/assets/classDiagram-v2-WZHVMYZB-iB9V-fQK.js +1 -0
  20. package/dist/client/assets/clone-UwjnYJkb.js +1 -0
  21. package/dist/client/assets/{cose-bilkent-S5V4N54A-Dtr68WKY.js → cose-bilkent-S5V4N54A-DQnvhn8W.js} +1 -1
  22. package/dist/client/assets/{dagre-6UL2VRFP-DeO-jAE4.js → dagre-6UL2VRFP-Y6UFkfVj.js} +1 -1
  23. package/dist/client/assets/{diagram-PSM6KHXK-DIoKKrik.js → diagram-PSM6KHXK-Cn_p_oe9.js} +1 -1
  24. package/dist/client/assets/{diagram-QEK2KX5R-YSmrv8Ap.js → diagram-QEK2KX5R-CWHFM00-.js} +1 -1
  25. package/dist/client/assets/{diagram-S2PKOQOG-Bkn85uc6.js → diagram-S2PKOQOG-C0TgWCYA.js} +1 -1
  26. package/dist/client/assets/{erDiagram-Q2GNP2WA-BwNSRuDm.js → erDiagram-Q2GNP2WA-BP1po3AK.js} +1 -1
  27. package/dist/client/assets/{flowDiagram-NV44I4VS-Bi4yldps.js → flowDiagram-NV44I4VS-B5oUkhMT.js} +1 -1
  28. package/dist/client/assets/{ganttDiagram-JELNMOA3-BArJltql.js → ganttDiagram-JELNMOA3-C7DXX2RL.js} +1 -1
  29. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-DL2anp1a.js → gitGraphDiagram-V2S2FVAM-Dn30v3Fe.js} +1 -1
  30. package/dist/client/assets/{graph-CA6szdeU.js → graph-E5kkHB_s.js} +1 -1
  31. package/dist/client/assets/{highlighted-body-B3W2YXNL-Ce8JER1R.js → highlighted-body-B3W2YXNL-B2bPrtWU.js} +1 -1
  32. package/dist/client/assets/{index-C5m9KGZf.js → index-A7maATW7.js} +1 -1
  33. package/dist/client/assets/{index-Czi_pJOK.js → index-B-miY5Sp.js} +1 -1
  34. package/dist/client/assets/{index-DDvAHSPZ.js → index-B2f2Xih0.js} +1 -1
  35. package/dist/client/assets/{index-CSQuqpCk.js → index-BScD8646.js} +1 -1
  36. package/dist/client/assets/{index-DpxJvU7W.js → index-BlpyLCQK.js} +1 -1
  37. package/dist/client/assets/{index-8yx33Rgn.js → index-BuqiLymH.js} +1 -1
  38. package/dist/client/assets/{index-DeSewZzo.js → index-CVOnvTFc.js} +1 -1
  39. package/dist/client/assets/{index-BeG__tJz.js → index-CYUAdSi5.js} +1 -1
  40. package/dist/client/assets/{index-Cro4_Zyl.js → index-D50A2A_K.js} +1 -1
  41. package/dist/client/assets/{index-D757VVMZ.js → index-D6MDOO4K.js} +1 -1
  42. package/dist/client/assets/{index-BhEFhSvO.js → index-DKIwN46L.js} +1 -1
  43. package/dist/client/assets/{index-D-zrg5eL.js → index-DOWIe80D.js} +1 -1
  44. package/dist/client/assets/{index-4MpV9Rhm.js → index-DzUf0Wwy.js} +1 -1
  45. package/dist/client/assets/{infoDiagram-HS3SLOUP-opriBuJD.js → infoDiagram-HS3SLOUP-CoxVQgxs.js} +1 -1
  46. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-t3TBG9zd.js → journeyDiagram-XKPGCS4Q-BUPqESWB.js} +1 -1
  47. package/dist/client/assets/{kanban-definition-3W4ZIXB7-D1KUbYAi.js → kanban-definition-3W4ZIXB7-DDooJc-Z.js} +1 -1
  48. package/dist/client/assets/{layout-BaSYphI5.js → layout-DQ2tNoC7.js} +1 -1
  49. package/dist/client/assets/{main-Bqsm7w7O.js → main-BbHA32iD.js} +274 -274
  50. package/dist/client/assets/main-Bump8gDQ.css +1 -0
  51. package/dist/client/assets/{mindmap-definition-VGOIOE7T-ChEtbA0z.js → mindmap-definition-VGOIOE7T-BBoouni0.js} +1 -1
  52. package/dist/client/assets/{pieDiagram-ADFJNKIX-D-2g15uY.js → pieDiagram-ADFJNKIX-DAO1Cf3O.js} +1 -1
  53. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-3I1XUOAj.js → quadrantDiagram-AYHSOK5B-CjJp6wOV.js} +1 -1
  54. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-rSbxWkaA.js → requirementDiagram-UZGBJVZJ-CX3MPDiG.js} +1 -1
  55. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-C4ZbxfZu.js → sankeyDiagram-TZEHDZUN-Cqnsrnu8.js} +1 -1
  56. package/dist/client/assets/{sequenceDiagram-WL72ISMW-Bjrx7GQ9.js → sequenceDiagram-WL72ISMW-CTJ2qJj_.js} +1 -1
  57. package/dist/client/assets/{stateDiagram-FKZM4ZOC-DmItUmdi.js → stateDiagram-FKZM4ZOC-Cy-jjqJZ.js} +1 -1
  58. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CT80STo9.js +1 -0
  59. package/dist/client/assets/{timeline-definition-IT6M3QCI-C0WtBwwx.js → timeline-definition-IT6M3QCI-Bbb0ib0X.js} +1 -1
  60. package/dist/client/assets/{treemap-GDKQZRPO-B_sR8-qR.js → treemap-GDKQZRPO-DUB2cMCc.js} +1 -1
  61. package/dist/client/assets/{worktree._worktreeId-XB6R8O1k.js → worktree._worktreeId-CZWwGpYU.js} +1 -1
  62. package/dist/client/assets/{worktree._worktreeId-Dx83Amei.js → worktree._worktreeId-DSiEfzZW.js} +1 -1
  63. package/dist/client/assets/{xychartDiagram-PRI3JC2R-BgnyoF2_.js → xychartDiagram-PRI3JC2R-CI6Pnd76.js} +1 -1
  64. package/dist/migrations/20261012171800_follow_the_work/migration.sql +3 -0
  65. package/dist/migrations/20261012171800_follow_the_work/snapshot.json +4409 -0
  66. package/dist/migrations/20261012190000_agent_status_states/migration.sql +4 -0
  67. package/dist/migrations/20261012190000_agent_status_states/snapshot.json +4409 -0
  68. package/dist/openapi.json +1883 -187
  69. package/dist/start-server.mjs +12982 -11047
  70. package/dist/terminal-daemon.mjs +149 -55
  71. package/package.json +6 -6
  72. package/dist/client/assets/channel-i7vnUKiG.js +0 -1
  73. package/dist/client/assets/classDiagram-2ON5EDUG-QKheXL6H.js +0 -1
  74. package/dist/client/assets/classDiagram-v2-WZHVMYZB-QKheXL6H.js +0 -1
  75. package/dist/client/assets/clone-C6EEluIC.js +0 -1
  76. package/dist/client/assets/main-BXb3TLCw.css +0 -1
  77. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CABlMyog.js +0 -1
package/dist/openapi.json CHANGED
@@ -187,6 +187,7 @@
187
187
  "/hooks.check": {
188
188
  "get": {
189
189
  "operationId": "hooks.check",
190
+ "description": "The hub's own host.",
190
191
  "tags": [
191
192
  "hooks"
192
193
  ],
@@ -220,6 +221,79 @@
220
221
  "default": {
221
222
  "$ref": "#/components/responses/Error"
222
223
  }
224
+ },
225
+ "parameters": [
226
+ {
227
+ "name": "input",
228
+ "in": "query",
229
+ "required": true,
230
+ "style": "deepObject",
231
+ "content": {
232
+ "application/json": {
233
+ "schema": {
234
+ "type": "object",
235
+ "properties": {
236
+ "hostId": {
237
+ "type": "string"
238
+ }
239
+ },
240
+ "additionalProperties": false
241
+ }
242
+ }
243
+ }
244
+ }
245
+ ]
246
+ }
247
+ },
248
+ "/hooks.hosts": {
249
+ "get": {
250
+ "operationId": "hooks.hosts",
251
+ "description": "Every host with its hooks status.",
252
+ "tags": [
253
+ "hooks"
254
+ ],
255
+ "responses": {
256
+ "200": {
257
+ "description": "Successful response",
258
+ "content": {
259
+ "application/json": {
260
+ "schema": {
261
+ "type": "object",
262
+ "properties": {
263
+ "result": {
264
+ "type": "object",
265
+ "properties": {
266
+ "data": {
267
+ "type": "object",
268
+ "properties": {
269
+ "hosts": {
270
+ "type": "array",
271
+ "items": {
272
+ "$ref": "#/components/schemas/HostHooksView"
273
+ }
274
+ }
275
+ },
276
+ "required": [
277
+ "hosts"
278
+ ],
279
+ "additionalProperties": false
280
+ }
281
+ },
282
+ "required": [
283
+ "data"
284
+ ]
285
+ }
286
+ },
287
+ "required": [
288
+ "result"
289
+ ]
290
+ }
291
+ }
292
+ }
293
+ },
294
+ "default": {
295
+ "$ref": "#/components/responses/Error"
296
+ }
223
297
  }
224
298
  }
225
299
  },
@@ -268,6 +342,87 @@
268
342
  "default": {
269
343
  "$ref": "#/components/responses/Error"
270
344
  }
345
+ },
346
+ "requestBody": {
347
+ "required": true,
348
+ "content": {
349
+ "application/json": {
350
+ "schema": {
351
+ "type": "object",
352
+ "properties": {
353
+ "hostId": {
354
+ "type": "string"
355
+ }
356
+ },
357
+ "additionalProperties": false
358
+ }
359
+ }
360
+ }
361
+ }
362
+ }
363
+ },
364
+ "/hooks.remove": {
365
+ "post": {
366
+ "operationId": "hooks.remove",
367
+ "description": "Removes Band's entries and leaves every other hook and setting.",
368
+ "tags": [
369
+ "hooks"
370
+ ],
371
+ "responses": {
372
+ "200": {
373
+ "description": "Successful response",
374
+ "content": {
375
+ "application/json": {
376
+ "schema": {
377
+ "type": "object",
378
+ "properties": {
379
+ "result": {
380
+ "type": "object",
381
+ "properties": {
382
+ "data": {
383
+ "type": "object",
384
+ "properties": {
385
+ "ok": {
386
+ "type": "boolean"
387
+ }
388
+ },
389
+ "required": [
390
+ "ok"
391
+ ],
392
+ "additionalProperties": false
393
+ }
394
+ },
395
+ "required": [
396
+ "data"
397
+ ]
398
+ }
399
+ },
400
+ "required": [
401
+ "result"
402
+ ]
403
+ }
404
+ }
405
+ }
406
+ },
407
+ "default": {
408
+ "$ref": "#/components/responses/Error"
409
+ }
410
+ },
411
+ "requestBody": {
412
+ "required": true,
413
+ "content": {
414
+ "application/json": {
415
+ "schema": {
416
+ "type": "object",
417
+ "properties": {
418
+ "hostId": {
419
+ "type": "string"
420
+ }
421
+ },
422
+ "additionalProperties": false
423
+ }
424
+ }
425
+ }
271
426
  }
272
427
  }
273
428
  },
@@ -673,6 +828,58 @@
673
828
  ]
674
829
  }
675
830
  },
831
+ "/hosts.forAgents": {
832
+ "get": {
833
+ "operationId": "hosts.forAgents",
834
+ "description": "The host list as an agent may see it: id, name, status, OS and architecture, agents,\ncapabilities and labels. No roots, home, tool versions, tokens or runner settings. The MCP\nendpoint lists this one and not `hosts.list`.",
835
+ "tags": [
836
+ "hosts"
837
+ ],
838
+ "responses": {
839
+ "200": {
840
+ "description": "Successful response",
841
+ "content": {
842
+ "application/json": {
843
+ "schema": {
844
+ "type": "object",
845
+ "properties": {
846
+ "result": {
847
+ "type": "object",
848
+ "properties": {
849
+ "data": {
850
+ "type": "object",
851
+ "properties": {
852
+ "hosts": {
853
+ "type": "array",
854
+ "items": {
855
+ "$ref": "#/components/schemas/AgentHostView"
856
+ }
857
+ }
858
+ },
859
+ "required": [
860
+ "hosts"
861
+ ],
862
+ "additionalProperties": false
863
+ }
864
+ },
865
+ "required": [
866
+ "data"
867
+ ]
868
+ }
869
+ },
870
+ "required": [
871
+ "result"
872
+ ]
873
+ }
874
+ }
875
+ }
876
+ },
877
+ "default": {
878
+ "$ref": "#/components/responses/Error"
879
+ }
880
+ }
881
+ }
882
+ },
676
883
  "/hosts.browse": {
677
884
  "get": {
678
885
  "operationId": "hosts.browse",
@@ -2939,11 +3146,12 @@
2939
3146
  ]
2940
3147
  }
2941
3148
  },
2942
- "/runners.list": {
3149
+ "/follow.offer": {
2943
3150
  "get": {
2944
- "operationId": "runners.list",
3151
+ "operationId": "follow.offer",
3152
+ "description": "Who could take the work, what will not carry over, or why it cannot continue.",
2945
3153
  "tags": [
2946
- "runners"
3154
+ "follow"
2947
3155
  ],
2948
3156
  "responses": {
2949
3157
  "200": {
@@ -2957,33 +3165,7 @@
2957
3165
  "type": "object",
2958
3166
  "properties": {
2959
3167
  "data": {
2960
- "type": "object",
2961
- "properties": {
2962
- "runs": {
2963
- "type": "array",
2964
- "items": {
2965
- "$ref": "#/components/schemas/RunnerRun"
2966
- }
2967
- },
2968
- "runners": {
2969
- "type": "array",
2970
- "items": {
2971
- "$ref": "#/components/schemas/RunnerView"
2972
- }
2973
- },
2974
- "errors": {
2975
- "type": "array",
2976
- "items": {
2977
- "type": "string"
2978
- }
2979
- }
2980
- },
2981
- "required": [
2982
- "runs",
2983
- "runners",
2984
- "errors"
2985
- ],
2986
- "additionalProperties": false
3168
+ "$ref": "#/components/schemas/ContinueOffer"
2987
3169
  }
2988
3170
  },
2989
3171
  "required": [
@@ -3001,35 +3183,468 @@
3001
3183
  "default": {
3002
3184
  "$ref": "#/components/responses/Error"
3003
3185
  }
3004
- }
3005
- }
3006
- },
3007
- "/runners.snapshots": {
3008
- "get": {
3009
- "operationId": "runners.snapshots",
3010
- "description": "The machine snapshots the hub holds, newest first (plan step 3.10).",
3011
- "tags": [
3012
- "runners"
3013
- ],
3014
- "responses": {
3015
- "200": {
3016
- "description": "Successful response",
3186
+ },
3187
+ "parameters": [
3188
+ {
3189
+ "name": "input",
3190
+ "in": "query",
3191
+ "required": true,
3192
+ "style": "deepObject",
3017
3193
  "content": {
3018
3194
  "application/json": {
3019
3195
  "schema": {
3020
3196
  "type": "object",
3021
3197
  "properties": {
3022
- "result": {
3023
- "type": "object",
3024
- "properties": {
3025
- "data": {
3026
- "type": "object",
3027
- "properties": {
3028
- "snapshots": {
3029
- "type": "array",
3030
- "items": {
3031
- "type": "object",
3032
- "properties": {
3198
+ "worktreeId": {
3199
+ "type": "string"
3200
+ },
3201
+ "chatId": {
3202
+ "type": "string"
3203
+ }
3204
+ },
3205
+ "required": [
3206
+ "worktreeId"
3207
+ ],
3208
+ "additionalProperties": false
3209
+ }
3210
+ }
3211
+ }
3212
+ }
3213
+ ]
3214
+ }
3215
+ },
3216
+ "/follow.continue": {
3217
+ "post": {
3218
+ "operationId": "follow.continue",
3219
+ "description": "Continues the worktree on `toHostId` (the recommended host when left out) from its latest checkpoint.",
3220
+ "tags": [
3221
+ "follow"
3222
+ ],
3223
+ "responses": {
3224
+ "200": {
3225
+ "description": "Successful response",
3226
+ "content": {
3227
+ "application/json": {
3228
+ "schema": {
3229
+ "type": "object",
3230
+ "properties": {
3231
+ "result": {
3232
+ "type": "object",
3233
+ "properties": {
3234
+ "data": {
3235
+ "$ref": "#/components/schemas/ContinueResult"
3236
+ }
3237
+ },
3238
+ "required": [
3239
+ "data"
3240
+ ]
3241
+ }
3242
+ },
3243
+ "required": [
3244
+ "result"
3245
+ ]
3246
+ }
3247
+ }
3248
+ }
3249
+ },
3250
+ "default": {
3251
+ "$ref": "#/components/responses/Error"
3252
+ }
3253
+ },
3254
+ "requestBody": {
3255
+ "required": true,
3256
+ "content": {
3257
+ "application/json": {
3258
+ "schema": {
3259
+ "type": "object",
3260
+ "properties": {
3261
+ "worktreeId": {
3262
+ "type": "string"
3263
+ },
3264
+ "chatId": {
3265
+ "type": "string"
3266
+ },
3267
+ "toHostId": {
3268
+ "type": "string"
3269
+ }
3270
+ },
3271
+ "required": [
3272
+ "worktreeId"
3273
+ ],
3274
+ "additionalProperties": false
3275
+ }
3276
+ }
3277
+ }
3278
+ }
3279
+ }
3280
+ },
3281
+ "/follow.divergence": {
3282
+ "get": {
3283
+ "operationId": "follow.divergence",
3284
+ "description": "Compares the old copy with the checkpoint the continuation used.",
3285
+ "tags": [
3286
+ "follow"
3287
+ ],
3288
+ "responses": {
3289
+ "200": {
3290
+ "description": "Successful response",
3291
+ "content": {
3292
+ "application/json": {
3293
+ "schema": {
3294
+ "type": "object",
3295
+ "properties": {
3296
+ "result": {
3297
+ "type": "object",
3298
+ "properties": {
3299
+ "data": {
3300
+ "$ref": "#/components/schemas/DivergenceReport"
3301
+ }
3302
+ },
3303
+ "required": [
3304
+ "data"
3305
+ ]
3306
+ }
3307
+ },
3308
+ "required": [
3309
+ "result"
3310
+ ]
3311
+ }
3312
+ }
3313
+ }
3314
+ },
3315
+ "default": {
3316
+ "$ref": "#/components/responses/Error"
3317
+ }
3318
+ },
3319
+ "parameters": [
3320
+ {
3321
+ "name": "input",
3322
+ "in": "query",
3323
+ "required": true,
3324
+ "style": "deepObject",
3325
+ "content": {
3326
+ "application/json": {
3327
+ "schema": {
3328
+ "type": "object",
3329
+ "properties": {
3330
+ "worktreeId": {
3331
+ "type": "string"
3332
+ }
3333
+ },
3334
+ "required": [
3335
+ "worktreeId"
3336
+ ],
3337
+ "additionalProperties": false
3338
+ }
3339
+ }
3340
+ }
3341
+ }
3342
+ ]
3343
+ }
3344
+ },
3345
+ "/follow.divergenceDiff": {
3346
+ "get": {
3347
+ "operationId": "follow.divergenceDiff",
3348
+ "description": "The diff of one file the old copy changed since the checkpoint.",
3349
+ "tags": [
3350
+ "follow"
3351
+ ],
3352
+ "responses": {
3353
+ "200": {
3354
+ "description": "Successful response",
3355
+ "content": {
3356
+ "application/json": {
3357
+ "schema": {
3358
+ "type": "object",
3359
+ "properties": {
3360
+ "result": {
3361
+ "type": "object",
3362
+ "properties": {
3363
+ "data": {
3364
+ "type": "object",
3365
+ "properties": {
3366
+ "diff": {
3367
+ "type": "string"
3368
+ }
3369
+ },
3370
+ "required": [
3371
+ "diff"
3372
+ ],
3373
+ "additionalProperties": false
3374
+ }
3375
+ },
3376
+ "required": [
3377
+ "data"
3378
+ ]
3379
+ }
3380
+ },
3381
+ "required": [
3382
+ "result"
3383
+ ]
3384
+ }
3385
+ }
3386
+ }
3387
+ },
3388
+ "default": {
3389
+ "$ref": "#/components/responses/Error"
3390
+ }
3391
+ },
3392
+ "parameters": [
3393
+ {
3394
+ "name": "input",
3395
+ "in": "query",
3396
+ "required": true,
3397
+ "style": "deepObject",
3398
+ "content": {
3399
+ "application/json": {
3400
+ "schema": {
3401
+ "type": "object",
3402
+ "properties": {
3403
+ "path": {
3404
+ "type": "string"
3405
+ },
3406
+ "worktreeId": {
3407
+ "type": "string"
3408
+ }
3409
+ },
3410
+ "required": [
3411
+ "path",
3412
+ "worktreeId"
3413
+ ],
3414
+ "additionalProperties": false
3415
+ }
3416
+ }
3417
+ }
3418
+ }
3419
+ ]
3420
+ }
3421
+ },
3422
+ "/follow.bringOver": {
3423
+ "post": {
3424
+ "operationId": "follow.bringOver",
3425
+ "description": "Applies the old copy's newer changes to the new copy as a patch. Conflicts change nothing.",
3426
+ "tags": [
3427
+ "follow"
3428
+ ],
3429
+ "responses": {
3430
+ "200": {
3431
+ "description": "Successful response",
3432
+ "content": {
3433
+ "application/json": {
3434
+ "schema": {
3435
+ "type": "object",
3436
+ "properties": {
3437
+ "result": {
3438
+ "type": "object",
3439
+ "properties": {
3440
+ "data": {
3441
+ "$ref": "#/components/schemas/BringOverResult"
3442
+ }
3443
+ },
3444
+ "required": [
3445
+ "data"
3446
+ ]
3447
+ }
3448
+ },
3449
+ "required": [
3450
+ "result"
3451
+ ]
3452
+ }
3453
+ }
3454
+ }
3455
+ },
3456
+ "default": {
3457
+ "$ref": "#/components/responses/Error"
3458
+ }
3459
+ },
3460
+ "requestBody": {
3461
+ "required": true,
3462
+ "content": {
3463
+ "application/json": {
3464
+ "schema": {
3465
+ "type": "object",
3466
+ "properties": {
3467
+ "worktreeId": {
3468
+ "type": "string"
3469
+ }
3470
+ },
3471
+ "required": [
3472
+ "worktreeId"
3473
+ ],
3474
+ "additionalProperties": false
3475
+ }
3476
+ }
3477
+ }
3478
+ }
3479
+ }
3480
+ },
3481
+ "/follow.discardOld": {
3482
+ "post": {
3483
+ "operationId": "follow.discardOld",
3484
+ "description": "Removes the old copy and its files. Refused unless `confirm` is true, and for a diverged copy unless `discardChanges` is true too.",
3485
+ "tags": [
3486
+ "follow"
3487
+ ],
3488
+ "responses": {
3489
+ "200": {
3490
+ "description": "Successful response",
3491
+ "content": {
3492
+ "application/json": {
3493
+ "schema": {
3494
+ "type": "object",
3495
+ "properties": {
3496
+ "result": {
3497
+ "type": "object",
3498
+ "properties": {
3499
+ "data": {
3500
+ "type": "object",
3501
+ "properties": {
3502
+ "ok": {
3503
+ "type": "boolean",
3504
+ "const": true
3505
+ }
3506
+ },
3507
+ "required": [
3508
+ "ok"
3509
+ ],
3510
+ "additionalProperties": false
3511
+ }
3512
+ },
3513
+ "required": [
3514
+ "data"
3515
+ ]
3516
+ }
3517
+ },
3518
+ "required": [
3519
+ "result"
3520
+ ]
3521
+ }
3522
+ }
3523
+ }
3524
+ },
3525
+ "default": {
3526
+ "$ref": "#/components/responses/Error"
3527
+ }
3528
+ },
3529
+ "requestBody": {
3530
+ "required": true,
3531
+ "content": {
3532
+ "application/json": {
3533
+ "schema": {
3534
+ "type": "object",
3535
+ "properties": {
3536
+ "worktreeId": {
3537
+ "type": "string"
3538
+ },
3539
+ "confirm": {
3540
+ "type": "boolean"
3541
+ },
3542
+ "discardChanges": {
3543
+ "type": "boolean"
3544
+ }
3545
+ },
3546
+ "required": [
3547
+ "worktreeId",
3548
+ "confirm"
3549
+ ],
3550
+ "additionalProperties": false
3551
+ }
3552
+ }
3553
+ }
3554
+ }
3555
+ }
3556
+ },
3557
+ "/runners.list": {
3558
+ "get": {
3559
+ "operationId": "runners.list",
3560
+ "tags": [
3561
+ "runners"
3562
+ ],
3563
+ "responses": {
3564
+ "200": {
3565
+ "description": "Successful response",
3566
+ "content": {
3567
+ "application/json": {
3568
+ "schema": {
3569
+ "type": "object",
3570
+ "properties": {
3571
+ "result": {
3572
+ "type": "object",
3573
+ "properties": {
3574
+ "data": {
3575
+ "type": "object",
3576
+ "properties": {
3577
+ "runs": {
3578
+ "type": "array",
3579
+ "items": {
3580
+ "$ref": "#/components/schemas/RunnerRun"
3581
+ }
3582
+ },
3583
+ "runners": {
3584
+ "type": "array",
3585
+ "items": {
3586
+ "$ref": "#/components/schemas/RunnerView"
3587
+ }
3588
+ },
3589
+ "errors": {
3590
+ "type": "array",
3591
+ "items": {
3592
+ "type": "string"
3593
+ }
3594
+ }
3595
+ },
3596
+ "required": [
3597
+ "runs",
3598
+ "runners",
3599
+ "errors"
3600
+ ],
3601
+ "additionalProperties": false
3602
+ }
3603
+ },
3604
+ "required": [
3605
+ "data"
3606
+ ]
3607
+ }
3608
+ },
3609
+ "required": [
3610
+ "result"
3611
+ ]
3612
+ }
3613
+ }
3614
+ }
3615
+ },
3616
+ "default": {
3617
+ "$ref": "#/components/responses/Error"
3618
+ }
3619
+ }
3620
+ }
3621
+ },
3622
+ "/runners.snapshots": {
3623
+ "get": {
3624
+ "operationId": "runners.snapshots",
3625
+ "description": "The machine snapshots the hub holds, newest first (plan step 3.10).",
3626
+ "tags": [
3627
+ "runners"
3628
+ ],
3629
+ "responses": {
3630
+ "200": {
3631
+ "description": "Successful response",
3632
+ "content": {
3633
+ "application/json": {
3634
+ "schema": {
3635
+ "type": "object",
3636
+ "properties": {
3637
+ "result": {
3638
+ "type": "object",
3639
+ "properties": {
3640
+ "data": {
3641
+ "type": "object",
3642
+ "properties": {
3643
+ "snapshots": {
3644
+ "type": "array",
3645
+ "items": {
3646
+ "type": "object",
3647
+ "properties": {
3033
3648
  "id": {
3034
3649
  "type": "string"
3035
3650
  },
@@ -6412,6 +7027,9 @@
6412
7027
  "properties": {
6413
7028
  "cwd": {
6414
7029
  "type": "string"
7030
+ },
7031
+ "hostId": {
7032
+ "type": "string"
6415
7033
  }
6416
7034
  },
6417
7035
  "required": [
@@ -6486,6 +7104,9 @@
6486
7104
  "type": "object",
6487
7105
  "additionalProperties": {}
6488
7106
  },
7107
+ "hostId": {
7108
+ "type": "string"
7109
+ },
6489
7110
  "terminalId": {
6490
7111
  "type": "string"
6491
7112
  },
@@ -8087,6 +8708,9 @@
8087
8708
  "webserver": {
8088
8709
  "type": "boolean"
8089
8710
  },
8711
+ "version": {
8712
+ "type": "string"
8713
+ },
8090
8714
  "tunnel": {
8091
8715
  "type": "boolean"
8092
8716
  },
@@ -8099,6 +8723,7 @@
8099
8723
  },
8100
8724
  "required": [
8101
8725
  "webserver",
8726
+ "version",
8102
8727
  "tunnel",
8103
8728
  "tunnel_url"
8104
8729
  ],
@@ -8286,15 +8911,15 @@
8286
8911
  "platform": {
8287
8912
  "type": "string",
8288
8913
  "enum": [
8914
+ "darwin",
8915
+ "linux",
8916
+ "win32",
8289
8917
  "aix",
8290
8918
  "android",
8291
- "darwin",
8292
8919
  "freebsd",
8293
8920
  "haiku",
8294
- "linux",
8295
8921
  "openbsd",
8296
8922
  "sunos",
8297
- "win32",
8298
8923
  "cygwin",
8299
8924
  "netbsd"
8300
8925
  ]
@@ -9373,6 +9998,9 @@
9373
9998
  "gui",
9374
9999
  "tui"
9375
10000
  ]
10001
+ },
10002
+ "crossHostWorktrees": {
10003
+ "type": "boolean"
9376
10004
  }
9377
10005
  },
9378
10006
  "additionalProperties": {}
@@ -9598,6 +10226,26 @@
9598
10226
  ],
9599
10227
  "description": "The host whose default-branch checkout is listed as a worktree, once one is known."
9600
10228
  },
10229
+ "mainMissing": {
10230
+ "oneOf": [
10231
+ {
10232
+ "type": "object",
10233
+ "properties": {
10234
+ "hostId": {
10235
+ "type": "string"
10236
+ }
10237
+ },
10238
+ "required": [
10239
+ "hostId"
10240
+ ],
10241
+ "additionalProperties": false
10242
+ },
10243
+ {
10244
+ "type": "null"
10245
+ }
10246
+ ],
10247
+ "description": "Set when no host lists a default-branch checkout: the primary host, whose clone is not on it."
10248
+ },
9601
10249
  "checkpointsEnabled": {
9602
10250
  "type": "boolean",
9603
10251
  "description": "Whether the hub keeps checkpoints of this repo's worktrees (the stored choice, else the default)."
@@ -9609,6 +10257,10 @@
9609
10257
  ],
9610
10258
  "description": "The stored choice, or null when the repo follows the default."
9611
10259
  },
10260
+ "autoContinue": {
10261
+ "type": "boolean",
10262
+ "description": "Whether a worktree whose host is offline continues on another host without asking."
10263
+ },
9612
10264
  "avatar": {
9613
10265
  "oneOf": [
9614
10266
  {
@@ -9660,6 +10312,12 @@
9660
10312
  "type": "string",
9661
10313
  "description": "Set when this copy was restored on another host. The value is the replacement's worktree id."
9662
10314
  },
10315
+ "continuedFrom": {
10316
+ "$ref": "#/components/schemas/ContinuedFrom"
10317
+ },
10318
+ "divergence": {
10319
+ "$ref": "#/components/schemas/Divergence"
10320
+ },
9663
10321
  "lastCheckpointAt": {
9664
10322
  "type": [
9665
10323
  "number",
@@ -9725,8 +10383,10 @@
9725
10383
  "meta",
9726
10384
  "allowedHostIds",
9727
10385
  "primaryHostId",
10386
+ "mainMissing",
9728
10387
  "checkpointsEnabled",
9729
10388
  "checkpointsSetting",
10389
+ "autoContinue",
9730
10390
  "avatar",
9731
10391
  "worktrees"
9732
10392
  ],
@@ -9896,7 +10556,42 @@
9896
10556
  "type": "object",
9897
10557
  "properties": {
9898
10558
  "data": {
9899
- "$ref": "#/components/schemas/RepoState"
10559
+ "allOf": [
10560
+ {
10561
+ "$ref": "#/components/schemas/RepoState"
10562
+ },
10563
+ {
10564
+ "type": "object",
10565
+ "properties": {
10566
+ "existed": {
10567
+ "type": "boolean",
10568
+ "const": true
10569
+ },
10570
+ "clone": {
10571
+ "type": "object",
10572
+ "properties": {
10573
+ "hostId": {
10574
+ "type": "string"
10575
+ },
10576
+ "hostName": {
10577
+ "type": "string"
10578
+ },
10579
+ "path": {
10580
+ "type": "string"
10581
+ }
10582
+ },
10583
+ "required": [
10584
+ "hostId",
10585
+ "hostName",
10586
+ "path"
10587
+ ],
10588
+ "additionalProperties": false
10589
+ }
10590
+ },
10591
+ "additionalProperties": false
10592
+ }
10593
+ ],
10594
+ "description": "What `addFromWorker` answers: the repo, plus the clone it registered when the repo already existed."
9900
10595
  }
9901
10596
  },
9902
10597
  "required": [
@@ -10473,7 +11168,7 @@
10473
11168
  "/repos.update": {
10474
11169
  "post": {
10475
11170
  "operationId": "repos.update",
10476
- "description": "Changes a repo's settings: `meta` (whether it is a meta repo), `allowedHostIds` (the hosts it\nmay run on, `null` for all) and `primaryHostId` (the host that lists its default branch,\n`null` to let the hub pick) and `checkpointsEnabled` (whether the hub keeps checkpoints, `null` for the default). Changing the host policy or the checkpoint setting is an admin call.",
11171
+ "description": "Changes a repo's settings: `meta` (whether it is a meta repo), `allowedHostIds` (the hosts it\nmay run on, `null` for all) and `primaryHostId` (the host that lists its default branch,\n`null` to let the hub pick) and `checkpointsEnabled` (whether the hub keeps checkpoints, `null` for the default) and `autoContinue` (whether a worktree on an offline host continues elsewhere without asking, `null` for off). Changing the host policy, the checkpoint setting or auto-continue is an admin call.",
10477
11172
  "tags": [
10478
11173
  "repos"
10479
11174
  ],
@@ -10545,11 +11240,17 @@
10545
11240
  },
10546
11241
  "primaryHostId": {
10547
11242
  "type": [
10548
- "string",
11243
+ "string",
11244
+ "null"
11245
+ ]
11246
+ },
11247
+ "checkpointsEnabled": {
11248
+ "type": [
11249
+ "boolean",
10549
11250
  "null"
10550
11251
  ]
10551
11252
  },
10552
- "checkpointsEnabled": {
11253
+ "autoContinue": {
10553
11254
  "type": [
10554
11255
  "boolean",
10555
11256
  "null"
@@ -10963,6 +11664,88 @@
10963
11664
  }
10964
11665
  }
10965
11666
  },
11667
+ "/worktrees.setOrigin": {
11668
+ "post": {
11669
+ "operationId": "worktrees.setOrigin",
11670
+ "tags": [
11671
+ "worktrees"
11672
+ ],
11673
+ "responses": {
11674
+ "200": {
11675
+ "description": "Successful response",
11676
+ "content": {
11677
+ "application/json": {
11678
+ "schema": {
11679
+ "type": "object",
11680
+ "properties": {
11681
+ "result": {
11682
+ "type": "object",
11683
+ "properties": {
11684
+ "data": {
11685
+ "type": "object",
11686
+ "properties": {
11687
+ "ok": {
11688
+ "type": "boolean",
11689
+ "const": true
11690
+ }
11691
+ },
11692
+ "required": [
11693
+ "ok"
11694
+ ],
11695
+ "additionalProperties": false
11696
+ }
11697
+ },
11698
+ "required": [
11699
+ "data"
11700
+ ]
11701
+ }
11702
+ },
11703
+ "required": [
11704
+ "result"
11705
+ ]
11706
+ }
11707
+ }
11708
+ }
11709
+ },
11710
+ "default": {
11711
+ "$ref": "#/components/responses/Error"
11712
+ }
11713
+ },
11714
+ "requestBody": {
11715
+ "required": true,
11716
+ "content": {
11717
+ "application/json": {
11718
+ "schema": {
11719
+ "type": "object",
11720
+ "properties": {
11721
+ "name": {
11722
+ "type": "string"
11723
+ },
11724
+ "repo": {
11725
+ "type": "string"
11726
+ },
11727
+ "origin": {
11728
+ "type": [
11729
+ "string",
11730
+ "null"
11731
+ ]
11732
+ },
11733
+ "hostId": {
11734
+ "type": "string"
11735
+ }
11736
+ },
11737
+ "required": [
11738
+ "name",
11739
+ "repo",
11740
+ "origin"
11741
+ ],
11742
+ "additionalProperties": false
11743
+ }
11744
+ }
11745
+ }
11746
+ }
11747
+ }
11748
+ },
10966
11749
  "/worktrees.gitPull": {
10967
11750
  "post": {
10968
11751
  "operationId": "worktrees.gitPull",
@@ -13337,6 +14120,83 @@
13337
14120
  }
13338
14121
  }
13339
14122
  },
14123
+ "/worktree.previewUrl": {
14124
+ "get": {
14125
+ "operationId": "worktree.previewUrl",
14126
+ "description": "A signed, expiring URL for one worktree file, for a browser tab that cannot send the auth header.",
14127
+ "tags": [
14128
+ "worktree"
14129
+ ],
14130
+ "responses": {
14131
+ "200": {
14132
+ "description": "Successful response",
14133
+ "content": {
14134
+ "application/json": {
14135
+ "schema": {
14136
+ "type": "object",
14137
+ "properties": {
14138
+ "result": {
14139
+ "type": "object",
14140
+ "properties": {
14141
+ "data": {
14142
+ "type": "object",
14143
+ "properties": {
14144
+ "url": {
14145
+ "type": "string"
14146
+ }
14147
+ },
14148
+ "required": [
14149
+ "url"
14150
+ ],
14151
+ "additionalProperties": false
14152
+ }
14153
+ },
14154
+ "required": [
14155
+ "data"
14156
+ ]
14157
+ }
14158
+ },
14159
+ "required": [
14160
+ "result"
14161
+ ]
14162
+ }
14163
+ }
14164
+ }
14165
+ },
14166
+ "default": {
14167
+ "$ref": "#/components/responses/Error"
14168
+ }
14169
+ },
14170
+ "parameters": [
14171
+ {
14172
+ "name": "input",
14173
+ "in": "query",
14174
+ "required": true,
14175
+ "style": "deepObject",
14176
+ "content": {
14177
+ "application/json": {
14178
+ "schema": {
14179
+ "type": "object",
14180
+ "properties": {
14181
+ "path": {
14182
+ "type": "string"
14183
+ },
14184
+ "worktreeId": {
14185
+ "type": "string"
14186
+ }
14187
+ },
14188
+ "required": [
14189
+ "path",
14190
+ "worktreeId"
14191
+ ],
14192
+ "additionalProperties": false
14193
+ }
14194
+ }
14195
+ }
14196
+ }
14197
+ ]
14198
+ }
14199
+ },
13340
14200
  "/worktree.searchFiles": {
13341
14201
  "get": {
13342
14202
  "operationId": "worktree.searchFiles",
@@ -15799,7 +16659,50 @@
15799
16659
  "type": "object",
15800
16660
  "properties": {
15801
16661
  "data": {
15802
- "$ref": "#/components/schemas/result"
16662
+ "oneOf": [
16663
+ {
16664
+ "$ref": "#/components/schemas/result"
16665
+ },
16666
+ {
16667
+ "type": "object",
16668
+ "properties": {
16669
+ "worktreeId": {
16670
+ "type": "string"
16671
+ },
16672
+ "continued": {
16673
+ "$ref": "#/components/schemas/ContinuedFrom"
16674
+ },
16675
+ "agentSession": {
16676
+ "$ref": "#/components/schemas/AgentSessionRecord"
16677
+ },
16678
+ "mode": {
16679
+ "type": "string",
16680
+ "enum": [
16681
+ "gui",
16682
+ "tui"
16683
+ ],
16684
+ "description": "Agent session types shared by the server and the dashboard (issue #682).\n\nAn agent session is one run of a coding agent. Its `mode` says how it is\ndisplayed: `gui` in a chat pane, `tui` as the agent's CLI in a terminal.\nThe mode is fixed for the life of the session."
16685
+ },
16686
+ "chatId": {
16687
+ "type": "string"
16688
+ },
16689
+ "terminalId": {
16690
+ "type": "string"
16691
+ },
16692
+ "notice": {
16693
+ "type": "string",
16694
+ "description": "Why the requested mode wasn't used, e.g. an agent without a TUI invocation."
16695
+ }
16696
+ },
16697
+ "required": [
16698
+ "worktreeId",
16699
+ "continued",
16700
+ "agentSession",
16701
+ "mode"
16702
+ ],
16703
+ "additionalProperties": false
16704
+ }
16705
+ ]
15803
16706
  }
15804
16707
  },
15805
16708
  "required": [
@@ -18175,16 +19078,66 @@
18175
19078
  "properties": {
18176
19079
  "installed": {
18177
19080
  "type": "boolean",
18178
- "description": "Band's hook is present for every hook event."
19081
+ "description": "Band's current hook is present for every hook event."
19082
+ },
19083
+ "outdated": {
19084
+ "type": "boolean",
19085
+ "description": "Band has hooks, but not the current set (fewer events, or an older command)."
18179
19086
  },
18180
19087
  "other_hooks_exist": {
18181
19088
  "type": "boolean",
18182
19089
  "description": "The settings also hold hooks that are not Band's."
19090
+ },
19091
+ "version": {
19092
+ "type": "number",
19093
+ "description": "The version of the hook set this build installs."
18183
19094
  }
18184
19095
  },
18185
19096
  "required": [
18186
19097
  "installed",
18187
- "other_hooks_exist"
19098
+ "outdated",
19099
+ "other_hooks_exist",
19100
+ "version"
19101
+ ],
19102
+ "additionalProperties": false
19103
+ },
19104
+ "HostHooksView": {
19105
+ "type": "object",
19106
+ "properties": {
19107
+ "hostId": {
19108
+ "type": "string"
19109
+ },
19110
+ "name": {
19111
+ "type": "string"
19112
+ },
19113
+ "online": {
19114
+ "type": "boolean"
19115
+ },
19116
+ "hasClaudeCode": {
19117
+ "type": "boolean",
19118
+ "description": "Whether Claude Code can start on the host."
19119
+ },
19120
+ "status": {
19121
+ "oneOf": [
19122
+ {
19123
+ "$ref": "#/components/schemas/HooksStatus"
19124
+ },
19125
+ {
19126
+ "type": "null"
19127
+ }
19128
+ ],
19129
+ "description": "Null when the host is offline or could not be read; `error` says why."
19130
+ },
19131
+ "error": {
19132
+ "type": "string"
19133
+ }
19134
+ },
19135
+ "required": [
19136
+ "hostId",
19137
+ "name",
19138
+ "online",
19139
+ "hasClaudeCode",
19140
+ "status"
18188
19141
  ],
18189
19142
  "additionalProperties": false
18190
19143
  },
@@ -18251,37 +19204,96 @@
18251
19204
  ],
18252
19205
  "additionalProperties": false
18253
19206
  },
18254
- "ToolCapability": {
19207
+ "ToolCapability": {
19208
+ "type": "object",
19209
+ "properties": {
19210
+ "tool": {
19211
+ "type": "string"
19212
+ },
19213
+ "installed": {
19214
+ "type": "boolean"
19215
+ },
19216
+ "version": {
19217
+ "type": [
19218
+ "string",
19219
+ "null"
19220
+ ]
19221
+ },
19222
+ "loggedIn": {
19223
+ "type": [
19224
+ "boolean",
19225
+ "null"
19226
+ ]
19227
+ },
19228
+ "fix": {
19229
+ "type": "string"
19230
+ }
19231
+ },
19232
+ "required": [
19233
+ "tool",
19234
+ "installed",
19235
+ "version",
19236
+ "loggedIn",
19237
+ "fix"
19238
+ ],
19239
+ "additionalProperties": false
19240
+ },
19241
+ "AgentHostView": {
18255
19242
  "type": "object",
18256
19243
  "properties": {
18257
- "tool": {
19244
+ "id": {
18258
19245
  "type": "string"
18259
19246
  },
18260
- "installed": {
18261
- "type": "boolean"
19247
+ "name": {
19248
+ "type": "string"
18262
19249
  },
18263
- "version": {
19250
+ "status": {
19251
+ "type": "string"
19252
+ },
19253
+ "mode": {
19254
+ "type": "string"
19255
+ },
19256
+ "os": {
18264
19257
  "type": [
18265
19258
  "string",
18266
19259
  "null"
18267
19260
  ]
18268
19261
  },
18269
- "loggedIn": {
19262
+ "arch": {
18270
19263
  "type": [
18271
- "boolean",
19264
+ "string",
18272
19265
  "null"
18273
19266
  ]
18274
19267
  },
18275
- "fix": {
18276
- "type": "string"
19268
+ "agents": {
19269
+ "type": "array",
19270
+ "items": {
19271
+ "type": "string"
19272
+ }
19273
+ },
19274
+ "capabilities": {
19275
+ "type": "array",
19276
+ "items": {
19277
+ "type": "string"
19278
+ }
19279
+ },
19280
+ "labels": {
19281
+ "type": "array",
19282
+ "items": {
19283
+ "type": "string"
19284
+ }
18277
19285
  }
18278
19286
  },
18279
19287
  "required": [
18280
- "tool",
18281
- "installed",
18282
- "version",
18283
- "loggedIn",
18284
- "fix"
19288
+ "id",
19289
+ "name",
19290
+ "status",
19291
+ "mode",
19292
+ "os",
19293
+ "arch",
19294
+ "agents",
19295
+ "capabilities",
19296
+ "labels"
18285
19297
  ],
18286
19298
  "additionalProperties": false
18287
19299
  },
@@ -19004,22 +20016,317 @@
19004
20016
  "move"
19005
20017
  ]
19006
20018
  },
19007
- "error": {
20019
+ "error": {
20020
+ "type": "string"
20021
+ }
20022
+ },
20023
+ "required": [
20024
+ "worktreeId",
20025
+ "ok"
20026
+ ],
20027
+ "additionalProperties": false
20028
+ }
20029
+ }
20030
+ },
20031
+ "required": [
20032
+ "fromHostId",
20033
+ "toHostId",
20034
+ "results"
20035
+ ],
20036
+ "additionalProperties": false
20037
+ },
20038
+ "ContinueOffer": {
20039
+ "type": "object",
20040
+ "properties": {
20041
+ "worktreeId": {
20042
+ "type": "string"
20043
+ },
20044
+ "repo": {
20045
+ "type": "string"
20046
+ },
20047
+ "fromHostId": {
20048
+ "type": "string"
20049
+ },
20050
+ "fromHostName": {
20051
+ "type": "string"
20052
+ },
20053
+ "blocked": {
20054
+ "type": "object",
20055
+ "properties": {
20056
+ "reason": {
20057
+ "type": "string",
20058
+ "enum": [
20059
+ "restricted-to-offline-host",
20060
+ "checkpoints-off",
20061
+ "no-checkpoint",
20062
+ "no-online-host",
20063
+ "agent-unavailable",
20064
+ "already-continued",
20065
+ "not-offline"
20066
+ ]
20067
+ },
20068
+ "message": {
20069
+ "type": "string"
20070
+ }
20071
+ },
20072
+ "required": [
20073
+ "reason",
20074
+ "message"
20075
+ ],
20076
+ "additionalProperties": false,
20077
+ "description": "Set when the work cannot continue, with a message that says why and what to do."
20078
+ },
20079
+ "checkpointId": {
20080
+ "type": "string"
20081
+ },
20082
+ "checkpointAt": {
20083
+ "type": "number"
20084
+ },
20085
+ "checkpointAgeMs": {
20086
+ "type": "number",
20087
+ "description": "Age of the checkpoint in ms, at the time of the offer."
20088
+ },
20089
+ "targets": {
20090
+ "type": "array",
20091
+ "items": {
20092
+ "$ref": "#/components/schemas/ContinueTarget"
20093
+ }
20094
+ },
20095
+ "question": {
20096
+ "type": "string",
20097
+ "description": "The message the prompt shows."
20098
+ },
20099
+ "limits": {
20100
+ "type": "array",
20101
+ "items": {
20102
+ "type": "string"
20103
+ },
20104
+ "description": "What will not carry over."
20105
+ },
20106
+ "willRun": {
20107
+ "type": "array",
20108
+ "items": {
20109
+ "type": "string"
20110
+ },
20111
+ "description": "What runs on the new copy, such as the repo's setup."
20112
+ },
20113
+ "fresh": {
20114
+ "type": "boolean",
20115
+ "description": "The checkpoint is young enough that the repo would continue without asking, were it set to."
20116
+ }
20117
+ },
20118
+ "required": [
20119
+ "worktreeId",
20120
+ "repo",
20121
+ "fromHostId",
20122
+ "fromHostName",
20123
+ "targets",
20124
+ "question",
20125
+ "limits",
20126
+ "willRun",
20127
+ "fresh"
20128
+ ],
20129
+ "additionalProperties": false
20130
+ },
20131
+ "ContinueTarget": {
20132
+ "type": "object",
20133
+ "properties": {
20134
+ "hostId": {
20135
+ "type": "string"
20136
+ },
20137
+ "hostName": {
20138
+ "type": "string"
20139
+ },
20140
+ "hasClone": {
20141
+ "type": "boolean",
20142
+ "description": "The repo already has a clone on this host."
20143
+ },
20144
+ "agentReady": {
20145
+ "type": "boolean",
20146
+ "description": "The worktree's agent can start on this host."
20147
+ },
20148
+ "agentProblem": {
20149
+ "type": "string",
20150
+ "description": "Why the agent cannot start, when it cannot."
20151
+ },
20152
+ "load": {
20153
+ "type": "number",
20154
+ "description": "Worktrees already on the host, the \"least busy\" measure."
20155
+ },
20156
+ "recommended": {
20157
+ "type": "boolean",
20158
+ "description": "The host the hub would choose."
20159
+ }
20160
+ },
20161
+ "required": [
20162
+ "hostId",
20163
+ "hostName",
20164
+ "hasClone",
20165
+ "agentReady",
20166
+ "load",
20167
+ "recommended"
20168
+ ],
20169
+ "additionalProperties": false
20170
+ },
20171
+ "ContinueResult": {
20172
+ "type": "object",
20173
+ "properties": {
20174
+ "worktreeId": {
20175
+ "type": "string"
20176
+ },
20177
+ "hostId": {
20178
+ "type": "string"
20179
+ },
20180
+ "hostName": {
20181
+ "type": "string"
20182
+ },
20183
+ "continuedFrom": {
20184
+ "$ref": "#/components/schemas/ContinuedFrom"
20185
+ },
20186
+ "chatIds": {
20187
+ "type": "array",
20188
+ "items": {
20189
+ "type": "string"
20190
+ }
20191
+ }
20192
+ },
20193
+ "required": [
20194
+ "worktreeId",
20195
+ "hostId",
20196
+ "hostName",
20197
+ "continuedFrom",
20198
+ "chatIds"
20199
+ ],
20200
+ "additionalProperties": false
20201
+ },
20202
+ "ContinuedFrom": {
20203
+ "type": "object",
20204
+ "properties": {
20205
+ "fromHostId": {
20206
+ "type": "string",
20207
+ "description": "The host the work came from, which was offline."
20208
+ },
20209
+ "fromWorktreeId": {
20210
+ "type": "string",
20211
+ "description": "The id of the copy that stays behind, superseded."
20212
+ },
20213
+ "toHostId": {
20214
+ "type": "string",
20215
+ "description": "The host the work continues on."
20216
+ },
20217
+ "checkpointId": {
20218
+ "type": "string",
20219
+ "description": "The checkpoint the new copy was restored from."
20220
+ },
20221
+ "reason": {
20222
+ "type": "string",
20223
+ "enum": [
20224
+ "manual",
20225
+ "auto"
20226
+ ],
20227
+ "description": "Why a worktree was continued: a person accepted the offer, or the repo continues by itself."
20228
+ },
20229
+ "at": {
20230
+ "type": "number",
20231
+ "description": "Epoch ms of the continuation."
20232
+ },
20233
+ "checkpointAt": {
20234
+ "type": "number",
20235
+ "description": "Epoch ms of the checkpoint, so the UI can say how old the work was."
20236
+ }
20237
+ },
20238
+ "required": [
20239
+ "fromHostId",
20240
+ "fromWorktreeId",
20241
+ "toHostId",
20242
+ "checkpointId",
20243
+ "reason",
20244
+ "at",
20245
+ "checkpointAt"
20246
+ ],
20247
+ "additionalProperties": false
20248
+ },
20249
+ "DivergenceReport": {
20250
+ "type": "object",
20251
+ "properties": {
20252
+ "worktreeId": {
20253
+ "type": "string"
20254
+ },
20255
+ "replacementId": {
20256
+ "type": "string",
20257
+ "description": "The copy that replaced this one."
20258
+ },
20259
+ "state": {
20260
+ "type": "string",
20261
+ "enum": [
20262
+ "clean",
20263
+ "diverged",
20264
+ "resolved"
20265
+ ],
20266
+ "description": "What the old host's copy holds once the host is back. `clean` means its files are the ones the\ncheckpoint holds. `diverged` means it has changes the continuation did not carry. `resolved`\nmeans a person brought them over."
20267
+ },
20268
+ "files": {
20269
+ "type": "array",
20270
+ "items": {
20271
+ "$ref": "#/components/schemas/ChangedFile"
20272
+ }
20273
+ },
20274
+ "hostOnline": {
20275
+ "type": "boolean",
20276
+ "description": "False when the old copy's host is offline, so nothing could be compared."
20277
+ },
20278
+ "checkedAt": {
20279
+ "type": [
20280
+ "number",
20281
+ "null"
20282
+ ]
20283
+ }
20284
+ },
20285
+ "required": [
20286
+ "worktreeId",
20287
+ "replacementId",
20288
+ "state",
20289
+ "files",
20290
+ "hostOnline",
20291
+ "checkedAt"
20292
+ ],
20293
+ "additionalProperties": false
20294
+ },
20295
+ "BringOverResult": {
20296
+ "type": "object",
20297
+ "properties": {
20298
+ "applied": {
20299
+ "type": "boolean"
20300
+ },
20301
+ "files": {
20302
+ "type": "number",
20303
+ "description": "The files the patch changed on the new copy."
20304
+ },
20305
+ "conflicts": {
20306
+ "type": "array",
20307
+ "items": {
20308
+ "type": "object",
20309
+ "properties": {
20310
+ "path": {
20311
+ "type": "string"
20312
+ },
20313
+ "message": {
19008
20314
  "type": "string"
19009
20315
  }
19010
20316
  },
19011
20317
  "required": [
19012
- "worktreeId",
19013
- "ok"
20318
+ "path",
20319
+ "message"
19014
20320
  ],
19015
20321
  "additionalProperties": false
19016
- }
20322
+ },
20323
+ "description": "Set when the patch does not apply cleanly. Nothing was changed."
19017
20324
  }
19018
20325
  },
19019
20326
  "required": [
19020
- "fromHostId",
19021
- "toHostId",
19022
- "results"
20327
+ "applied",
20328
+ "files",
20329
+ "conflicts"
19023
20330
  ],
19024
20331
  "additionalProperties": false
19025
20332
  },
@@ -19763,7 +21070,7 @@
19763
21070
  "items": {
19764
21071
  "$ref": "#/components/schemas/TabAgentStatus"
19765
21072
  },
19766
- "description": "The chats and terminals in the worktree whose agent is `working` or\n`needs_attention`, for the center tab strip. Absent where the snapshot\ncomes straight from the row (the repos list)."
21073
+ "description": "The chats and terminals in the worktree whose agent is not `idle`, for\nthe center tab strip. Absent where the snapshot\ncomes straight from the row (the repos list)."
19767
21074
  }
19768
21075
  },
19769
21076
  "required": [
@@ -19812,8 +21119,11 @@
19812
21119
  "status": {
19813
21120
  "type": "string",
19814
21121
  "enum": [
21122
+ "failed",
19815
21123
  "working",
19816
- "needs_attention"
21124
+ "monitoring",
21125
+ "question",
21126
+ "done"
19817
21127
  ]
19818
21128
  }
19819
21129
  },
@@ -20107,149 +21417,376 @@
20107
21417
  "updatedAt": {
20108
21418
  "type": "string"
20109
21419
  },
20110
- "reviewDecision": {
21420
+ "reviewDecision": {
21421
+ "type": [
21422
+ "string",
21423
+ "null"
21424
+ ],
21425
+ "enum": [
21426
+ "approved",
21427
+ "changes_requested",
21428
+ "review_required"
21429
+ ]
21430
+ },
21431
+ "mergeState": {
21432
+ "type": "string",
21433
+ "enum": [
21434
+ "unknown",
21435
+ "dirty",
21436
+ "clean",
21437
+ "draft",
21438
+ "unstable",
21439
+ "has_hooks",
21440
+ "blocked",
21441
+ "behind"
21442
+ ],
21443
+ "description": "Whether the review can merge now, and if not, why."
21444
+ },
21445
+ "checks": {
21446
+ "$ref": "#/components/schemas/ChecksReport"
21447
+ },
21448
+ "reviewers": {
21449
+ "type": "array",
21450
+ "items": {
21451
+ "$ref": "#/components/schemas/Reviewer"
21452
+ },
21453
+ "description": "Absent when the provider does not report reviewers."
21454
+ },
21455
+ "discussion": {
21456
+ "$ref": "#/components/schemas/ReviewDiscussion"
21457
+ }
21458
+ },
21459
+ "required": [
21460
+ "number",
21461
+ "url",
21462
+ "title",
21463
+ "state",
21464
+ "updatedAt",
21465
+ "reviewDecision",
21466
+ "mergeState",
21467
+ "checks"
21468
+ ],
21469
+ "additionalProperties": false
21470
+ },
21471
+ "ChecksReport": {
21472
+ "type": "object",
21473
+ "properties": {
21474
+ "state": {
21475
+ "type": "string",
21476
+ "enum": [
21477
+ "running",
21478
+ "cancelled",
21479
+ "pending",
21480
+ "success",
21481
+ "failure",
21482
+ "none"
21483
+ ],
21484
+ "description": "The overall state of a set of checks. `none` means there are no checks."
21485
+ },
21486
+ "headSha": {
21487
+ "type": [
21488
+ "string",
21489
+ "null"
21490
+ ],
21491
+ "description": "The commit the checks ran on."
21492
+ },
21493
+ "checks": {
21494
+ "type": "array",
21495
+ "items": {
21496
+ "$ref": "#/components/schemas/CheckRun"
21497
+ }
21498
+ }
21499
+ },
21500
+ "required": [
21501
+ "state",
21502
+ "headSha",
21503
+ "checks"
21504
+ ],
21505
+ "additionalProperties": false
21506
+ },
21507
+ "CheckRun": {
21508
+ "type": "object",
21509
+ "properties": {
21510
+ "id": {
21511
+ "type": "string",
21512
+ "description": "Stable within one report, for list keys."
21513
+ },
21514
+ "name": {
21515
+ "type": "string"
21516
+ },
21517
+ "workflowName": {
21518
+ "type": [
21519
+ "string",
21520
+ "null"
21521
+ ],
21522
+ "description": "The CI workflow that ran the job, when the check came from one."
21523
+ },
21524
+ "state": {
21525
+ "type": "string",
21526
+ "enum": [
21527
+ "running",
21528
+ "cancelled",
21529
+ "pending",
21530
+ "skipped",
21531
+ "success",
21532
+ "failure",
21533
+ "neutral"
21534
+ ],
21535
+ "description": "The state of one check or CI job."
21536
+ },
21537
+ "url": {
21538
+ "type": [
21539
+ "string",
21540
+ "null"
21541
+ ],
21542
+ "description": "The job's page on the forge."
21543
+ },
21544
+ "startedAt": {
21545
+ "type": [
21546
+ "string",
21547
+ "null"
21548
+ ]
21549
+ },
21550
+ "completedAt": {
21551
+ "type": [
21552
+ "string",
21553
+ "null"
21554
+ ]
21555
+ },
21556
+ "description": {
21557
+ "type": [
21558
+ "string",
21559
+ "null"
21560
+ ],
21561
+ "description": "A one-line result, e.g. a check run's title or a commit status description."
21562
+ }
21563
+ },
21564
+ "required": [
21565
+ "id",
21566
+ "name",
21567
+ "workflowName",
21568
+ "state",
21569
+ "url",
21570
+ "startedAt",
21571
+ "completedAt",
21572
+ "description"
21573
+ ],
21574
+ "additionalProperties": false
21575
+ },
21576
+ "Reviewer": {
21577
+ "type": "object",
21578
+ "properties": {
21579
+ "login": {
21580
+ "type": "string"
21581
+ },
21582
+ "avatarUrl": {
21583
+ "type": [
21584
+ "string",
21585
+ "null"
21586
+ ]
21587
+ },
21588
+ "state": {
21589
+ "type": "string",
21590
+ "enum": [
21591
+ "pending",
21592
+ "approved",
21593
+ "changes_requested",
21594
+ "commented",
21595
+ "dismissed"
21596
+ ],
21597
+ "description": "One reviewer's standing on a review. `pending` means requested, no review yet."
21598
+ },
21599
+ "submittedAt": {
21600
+ "type": [
21601
+ "string",
21602
+ "null"
21603
+ ]
21604
+ },
21605
+ "required": {
21606
+ "type": "boolean",
21607
+ "description": "Whether the forge requires this reviewer (code owners), when it says."
21608
+ }
21609
+ },
21610
+ "required": [
21611
+ "login",
21612
+ "avatarUrl",
21613
+ "state",
21614
+ "submittedAt"
21615
+ ],
21616
+ "additionalProperties": false
21617
+ },
21618
+ "ReviewDiscussion": {
21619
+ "type": "object",
21620
+ "properties": {
21621
+ "items": {
21622
+ "type": "array",
21623
+ "items": {
21624
+ "$ref": "#/components/schemas/ReviewConversationItem"
21625
+ },
21626
+ "description": "Conversation comments and review summaries, oldest first."
21627
+ },
21628
+ "threads": {
21629
+ "type": "array",
21630
+ "items": {
21631
+ "$ref": "#/components/schemas/ReviewThread"
21632
+ },
21633
+ "description": "Inline threads, ordered by their first message, oldest first."
21634
+ },
21635
+ "truncated": {
21636
+ "type": "boolean",
21637
+ "description": "True when the forge holds more than was fetched."
21638
+ }
21639
+ },
21640
+ "required": [
21641
+ "items",
21642
+ "threads"
21643
+ ],
21644
+ "additionalProperties": false
21645
+ },
21646
+ "ReviewConversationItem": {
21647
+ "type": "object",
21648
+ "properties": {
21649
+ "kind": {
21650
+ "type": "string",
21651
+ "enum": [
21652
+ "comment",
21653
+ "review"
21654
+ ]
21655
+ },
21656
+ "reviewState": {
21657
+ "type": "string",
21658
+ "enum": [
21659
+ "pending",
21660
+ "approved",
21661
+ "changes_requested",
21662
+ "commented",
21663
+ "dismissed"
21664
+ ],
21665
+ "description": "For `review`: the verdict that came with the summary."
21666
+ },
21667
+ "id": {
21668
+ "type": "string"
21669
+ },
21670
+ "author": {
21671
+ "$ref": "#/components/schemas/CommentAuthor"
21672
+ },
21673
+ "body": {
21674
+ "type": "string",
21675
+ "description": "Markdown, from an untrusted author."
21676
+ },
21677
+ "createdAt": {
21678
+ "type": "string"
21679
+ },
21680
+ "url": {
21681
+ "type": [
21682
+ "string",
21683
+ "null"
21684
+ ],
21685
+ "description": "The message on the forge."
21686
+ }
21687
+ },
21688
+ "required": [
21689
+ "kind",
21690
+ "id",
21691
+ "author",
21692
+ "body",
21693
+ "createdAt",
21694
+ "url"
21695
+ ],
21696
+ "additionalProperties": false
21697
+ },
21698
+ "CommentAuthor": {
21699
+ "type": "object",
21700
+ "properties": {
21701
+ "login": {
21702
+ "type": "string"
21703
+ },
21704
+ "avatarUrl": {
20111
21705
  "type": [
20112
21706
  "string",
20113
21707
  "null"
20114
- ],
20115
- "enum": [
20116
- "approved",
20117
- "changes_requested",
20118
- "review_required"
20119
21708
  ]
20120
- },
20121
- "mergeState": {
20122
- "type": "string",
20123
- "enum": [
20124
- "unknown",
20125
- "dirty",
20126
- "draft",
20127
- "clean",
20128
- "unstable",
20129
- "has_hooks",
20130
- "blocked",
20131
- "behind"
20132
- ],
20133
- "description": "Whether the review can merge now, and if not, why."
20134
- },
20135
- "checks": {
20136
- "$ref": "#/components/schemas/ChecksReport"
20137
21709
  }
20138
21710
  },
20139
21711
  "required": [
20140
- "number",
20141
- "url",
20142
- "title",
20143
- "state",
20144
- "updatedAt",
20145
- "reviewDecision",
20146
- "mergeState",
20147
- "checks"
21712
+ "login",
21713
+ "avatarUrl"
20148
21714
  ],
20149
21715
  "additionalProperties": false
20150
21716
  },
20151
- "ChecksReport": {
21717
+ "ReviewThread": {
20152
21718
  "type": "object",
20153
21719
  "properties": {
20154
- "state": {
20155
- "type": "string",
20156
- "enum": [
20157
- "running",
20158
- "cancelled",
20159
- "pending",
20160
- "success",
20161
- "failure",
20162
- "none"
20163
- ],
20164
- "description": "The overall state of a set of checks. `none` means there are no checks."
21720
+ "id": {
21721
+ "type": "string"
20165
21722
  },
20166
- "headSha": {
21723
+ "path": {
21724
+ "type": "string"
21725
+ },
21726
+ "line": {
20167
21727
  "type": [
20168
- "string",
21728
+ "number",
20169
21729
  "null"
20170
21730
  ],
20171
- "description": "The commit the checks ran on."
21731
+ "description": "The line in the head commit, or the last known one when outdated."
20172
21732
  },
20173
- "checks": {
21733
+ "isResolved": {
21734
+ "type": "boolean"
21735
+ },
21736
+ "isOutdated": {
21737
+ "type": "boolean"
21738
+ },
21739
+ "comments": {
20174
21740
  "type": "array",
20175
21741
  "items": {
20176
- "$ref": "#/components/schemas/CheckRun"
21742
+ "$ref": "#/components/schemas/ReviewComment"
20177
21743
  }
21744
+ },
21745
+ "truncated": {
21746
+ "type": "boolean",
21747
+ "description": "True when the forge holds more messages than `comments` carries."
20178
21748
  }
20179
21749
  },
20180
21750
  "required": [
20181
- "state",
20182
- "headSha",
20183
- "checks"
21751
+ "id",
21752
+ "path",
21753
+ "line",
21754
+ "isResolved",
21755
+ "isOutdated",
21756
+ "comments"
20184
21757
  ],
20185
21758
  "additionalProperties": false
20186
21759
  },
20187
- "CheckRun": {
21760
+ "ReviewComment": {
20188
21761
  "type": "object",
20189
21762
  "properties": {
20190
21763
  "id": {
20191
- "type": "string",
20192
- "description": "Stable within one report, for list keys."
20193
- },
20194
- "name": {
20195
21764
  "type": "string"
20196
21765
  },
20197
- "workflowName": {
20198
- "type": [
20199
- "string",
20200
- "null"
20201
- ],
20202
- "description": "The CI workflow that ran the job, when the check came from one."
21766
+ "author": {
21767
+ "$ref": "#/components/schemas/CommentAuthor"
20203
21768
  },
20204
- "state": {
21769
+ "body": {
20205
21770
  "type": "string",
20206
- "enum": [
20207
- "running",
20208
- "cancelled",
20209
- "pending",
20210
- "skipped",
20211
- "success",
20212
- "failure",
20213
- "neutral"
20214
- ],
20215
- "description": "The state of one check or CI job."
20216
- },
20217
- "url": {
20218
- "type": [
20219
- "string",
20220
- "null"
20221
- ],
20222
- "description": "The job's page on the forge."
20223
- },
20224
- "startedAt": {
20225
- "type": [
20226
- "string",
20227
- "null"
20228
- ]
21771
+ "description": "Markdown, from an untrusted author."
20229
21772
  },
20230
- "completedAt": {
20231
- "type": [
20232
- "string",
20233
- "null"
20234
- ]
21773
+ "createdAt": {
21774
+ "type": "string"
20235
21775
  },
20236
- "description": {
21776
+ "url": {
20237
21777
  "type": [
20238
21778
  "string",
20239
21779
  "null"
20240
21780
  ],
20241
- "description": "A one-line result, e.g. a check run's title or a commit status description."
21781
+ "description": "The message on the forge."
20242
21782
  }
20243
21783
  },
20244
21784
  "required": [
20245
21785
  "id",
20246
- "name",
20247
- "workflowName",
20248
- "state",
20249
- "url",
20250
- "startedAt",
20251
- "completedAt",
20252
- "description"
21786
+ "author",
21787
+ "body",
21788
+ "createdAt",
21789
+ "url"
20253
21790
  ],
20254
21791
  "additionalProperties": false
20255
21792
  },
@@ -20390,6 +21927,10 @@
20390
21927
  "gui",
20391
21928
  "tui"
20392
21929
  ]
21930
+ },
21931
+ "crossHostWorktrees": {
21932
+ "type": "boolean",
21933
+ "description": "Agents on a worker may start worktrees on other hosts. On unless false."
20393
21934
  }
20394
21935
  },
20395
21936
  "additionalProperties": {},
@@ -20619,6 +22160,42 @@
20619
22160
  ],
20620
22161
  "additionalProperties": false
20621
22162
  },
22163
+ "Divergence": {
22164
+ "type": "object",
22165
+ "properties": {
22166
+ "state": {
22167
+ "type": "string",
22168
+ "enum": [
22169
+ "clean",
22170
+ "diverged",
22171
+ "resolved"
22172
+ ],
22173
+ "description": "What the old host's copy holds once the host is back. `clean` means its files are the ones the\ncheckpoint holds. `diverged` means it has changes the continuation did not carry. `resolved`\nmeans a person brought them over."
22174
+ },
22175
+ "checkedAt": {
22176
+ "type": "number",
22177
+ "description": "Epoch ms of the last comparison."
22178
+ },
22179
+ "checkpointId": {
22180
+ "type": "string",
22181
+ "description": "The checkpoint the comparison used."
22182
+ },
22183
+ "files": {
22184
+ "type": "number",
22185
+ "description": "How many files differ. Absent when unknown."
22186
+ },
22187
+ "treeSha": {
22188
+ "type": "string",
22189
+ "description": "The tree of the old copy when it was compared, so a `resolved` verdict holds until the copy changes again."
22190
+ }
22191
+ },
22192
+ "required": [
22193
+ "state",
22194
+ "checkedAt",
22195
+ "checkpointId"
22196
+ ],
22197
+ "additionalProperties": false
22198
+ },
20622
22199
  "WorktreeOriginInfo": {
20623
22200
  "type": "object",
20624
22201
  "properties": {
@@ -20709,6 +22286,10 @@
20709
22286
  "checkpointsEnabled": {
20710
22287
  "type": "boolean",
20711
22288
  "description": "Whether the hub keeps checkpoints of the repo's worktrees; absent means the default. Read-only here: `setCheckpointsEnabled` writes it."
22289
+ },
22290
+ "autoContinue": {
22291
+ "type": "boolean",
22292
+ "description": "Whether an offline host's worktrees continue elsewhere without asking. Read-only here: `setAutoContinue` writes it."
20712
22293
  }
20713
22294
  },
20714
22295
  "required": [
@@ -20755,6 +22336,12 @@
20755
22336
  "supersededBy": {
20756
22337
  "type": "string",
20757
22338
  "description": "The id of the worktree that replaced this one when it was restored on another host. The copy\nstays on its host untouched. Read-only here: `saveAll` keeps what the database holds, and\n`RepoQueries.setSupersededBy` writes it."
22339
+ },
22340
+ "continuedFrom": {
22341
+ "$ref": "#/components/schemas/ContinuedFrom"
22342
+ },
22343
+ "divergence": {
22344
+ "$ref": "#/components/schemas/Divergence"
20758
22345
  }
20759
22346
  },
20760
22347
  "required": [
@@ -22454,6 +24041,30 @@
22454
24041
  "httpStatus"
22455
24042
  ],
22456
24043
  "additionalProperties": false
24044
+ },
24045
+ "HostOfflineAnswer": {
24046
+ "type": "object",
24047
+ "properties": {
24048
+ "code": {
24049
+ "type": "string",
24050
+ "enum": [
24051
+ "HOST_OFFLINE",
24052
+ "CONTINUE_NOT_POSSIBLE"
24053
+ ]
24054
+ },
24055
+ "error": {
24056
+ "type": "string"
24057
+ },
24058
+ "offer": {
24059
+ "$ref": "#/components/schemas/ContinueOffer"
24060
+ }
24061
+ },
24062
+ "required": [
24063
+ "code",
24064
+ "error",
24065
+ "offer"
24066
+ ],
24067
+ "additionalProperties": false
22457
24068
  }
22458
24069
  },
22459
24070
  "responses": {
@@ -22557,6 +24168,91 @@
22557
24168
  "code"
22558
24169
  ],
22559
24170
  "additionalProperties": false
24171
+ },
24172
+ {
24173
+ "type": "object",
24174
+ "properties": {
24175
+ "data": {
24176
+ "type": "object",
24177
+ "properties": {
24178
+ "hostOffline": {
24179
+ "$ref": "#/components/schemas/HostOfflineAnswer"
24180
+ },
24181
+ "code": {
24182
+ "type": "string",
24183
+ "enum": [
24184
+ "PARSE_ERROR",
24185
+ "BAD_REQUEST",
24186
+ "INTERNAL_SERVER_ERROR",
24187
+ "NOT_IMPLEMENTED",
24188
+ "BAD_GATEWAY",
24189
+ "SERVICE_UNAVAILABLE",
24190
+ "GATEWAY_TIMEOUT",
24191
+ "UNAUTHORIZED",
24192
+ "PAYMENT_REQUIRED",
24193
+ "FORBIDDEN",
24194
+ "NOT_FOUND",
24195
+ "METHOD_NOT_SUPPORTED",
24196
+ "TIMEOUT",
24197
+ "CONFLICT",
24198
+ "PRECONDITION_FAILED",
24199
+ "PAYLOAD_TOO_LARGE",
24200
+ "UNSUPPORTED_MEDIA_TYPE",
24201
+ "UNPROCESSABLE_CONTENT",
24202
+ "PRECONDITION_REQUIRED",
24203
+ "TOO_MANY_REQUESTS",
24204
+ "CLIENT_CLOSED_REQUEST"
24205
+ ]
24206
+ },
24207
+ "httpStatus": {
24208
+ "type": "number"
24209
+ },
24210
+ "path": {
24211
+ "type": "string"
24212
+ },
24213
+ "stack": {
24214
+ "type": "string"
24215
+ }
24216
+ },
24217
+ "required": [
24218
+ "hostOffline",
24219
+ "code",
24220
+ "httpStatus"
24221
+ ],
24222
+ "additionalProperties": false
24223
+ },
24224
+ "message": {
24225
+ "type": "string"
24226
+ },
24227
+ "code": {
24228
+ "type": "number",
24229
+ "enum": [
24230
+ -32700,
24231
+ -32600,
24232
+ -32603,
24233
+ -32001,
24234
+ -32002,
24235
+ -32003,
24236
+ -32004,
24237
+ -32005,
24238
+ -32008,
24239
+ -32009,
24240
+ -32012,
24241
+ -32013,
24242
+ -32015,
24243
+ -32022,
24244
+ -32028,
24245
+ -32029,
24246
+ -32099
24247
+ ]
24248
+ }
24249
+ },
24250
+ "required": [
24251
+ "data",
24252
+ "message",
24253
+ "code"
24254
+ ],
24255
+ "additionalProperties": false
22560
24256
  }
22561
24257
  ]
22562
24258
  }