@band-app/server 0.48.1 → 0.50.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 (80) hide show
  1. package/dist/client/_shell.html +0 -0
  2. package/dist/client/assets/{TerminalPanel-CfWUo3Nd.js → TerminalPanel-TaTddakG.js} +1 -1
  3. package/dist/client/assets/{_basePickBy-De_YMUJc.js → _basePickBy-CyEmpkN6.js} +1 -1
  4. package/dist/client/assets/{_baseUniq-CF2c9fMp.js → _baseUniq-DZK79CFb.js} +1 -1
  5. package/dist/client/assets/{arc-D-KYih_I.js → arc-BHHXQhkP.js} +1 -1
  6. package/dist/client/assets/{architectureDiagram-VXUJARFQ-i0rZW9Y9.js → architectureDiagram-VXUJARFQ-YeX3OIz6.js} +1 -1
  7. package/dist/client/assets/{blockDiagram-VD42YOAC-CI-wLyQa.js → blockDiagram-VD42YOAC-BWBeTAtn.js} +1 -1
  8. package/dist/client/assets/{c4Diagram-YG6GDRKO-C1kVgBMI.js → c4Diagram-YG6GDRKO-BSeCOUa4.js} +1 -1
  9. package/dist/client/assets/channel-CrPkzAwN.js +1 -0
  10. package/dist/client/assets/{chunk-4BX2VUAB-BZ1Kpo6f.js → chunk-4BX2VUAB-DcJtODkg.js} +1 -1
  11. package/dist/client/assets/{chunk-55IACEB6-CiRlX7k-.js → chunk-55IACEB6-pByuRA6R.js} +1 -1
  12. package/dist/client/assets/{chunk-B4BG7PRW-BcgDiAdd.js → chunk-B4BG7PRW-BynZwnDU.js} +1 -1
  13. package/dist/client/assets/{chunk-DI55MBZ5-RWxMQGLt.js → chunk-DI55MBZ5-8SdWl6Bg.js} +1 -1
  14. package/dist/client/assets/{chunk-FMBD7UC4-BwIR0iJB.js → chunk-FMBD7UC4-B0vVa00l.js} +1 -1
  15. package/dist/client/assets/{chunk-QN33PNHL-_ihIB9E1.js → chunk-QN33PNHL-BHbm2uD2.js} +1 -1
  16. package/dist/client/assets/{chunk-QZHKN3VN-CktWNnxj.js → chunk-QZHKN3VN-DS9PmlIu.js} +1 -1
  17. package/dist/client/assets/{chunk-TZMSLE5B-Br831bNt.js → chunk-TZMSLE5B-CFm_nF8Y.js} +1 -1
  18. package/dist/client/assets/classDiagram-2ON5EDUG-B2ixqHpV.js +1 -0
  19. package/dist/client/assets/classDiagram-v2-WZHVMYZB-B2ixqHpV.js +1 -0
  20. package/dist/client/assets/clone-DOnsyYsS.js +1 -0
  21. package/dist/client/assets/{cose-bilkent-S5V4N54A-Ca6F1OCk.js → cose-bilkent-S5V4N54A-B4TR3AIx.js} +1 -1
  22. package/dist/client/assets/{dagre-6UL2VRFP-B0-4g4us.js → dagre-6UL2VRFP-B8CXMn3F.js} +1 -1
  23. package/dist/client/assets/{diagram-PSM6KHXK-Bio1qnrB.js → diagram-PSM6KHXK-r9IBt9Op.js} +1 -1
  24. package/dist/client/assets/{diagram-QEK2KX5R-COoEbw7t.js → diagram-QEK2KX5R-DikzF6vc.js} +1 -1
  25. package/dist/client/assets/{diagram-S2PKOQOG-D8lVMqVK.js → diagram-S2PKOQOG-DsL3qPbL.js} +1 -1
  26. package/dist/client/assets/{erDiagram-Q2GNP2WA-t9P0TS6q.js → erDiagram-Q2GNP2WA-BQPuGdgl.js} +1 -1
  27. package/dist/client/assets/{flowDiagram-NV44I4VS-qikZ7jp7.js → flowDiagram-NV44I4VS-CVlJ575S.js} +1 -1
  28. package/dist/client/assets/{ganttDiagram-JELNMOA3--M9lMYuY.js → ganttDiagram-JELNMOA3-BbaAQRHR.js} +1 -1
  29. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-B0JlDkQD.js → gitGraphDiagram-V2S2FVAM-BqeiagoL.js} +1 -1
  30. package/dist/client/assets/{graph-DSNlIXAB.js → graph-DgChbLvr.js} +1 -1
  31. package/dist/client/assets/{highlighted-body-B3W2YXNL-kAw1lMr_.js → highlighted-body-B3W2YXNL-dH2hWW9A.js} +1 -1
  32. package/dist/client/assets/{index-VnrkP6Up.js → index-BOnMESHF.js} +1 -1
  33. package/dist/client/assets/{index-BlF06PC1.js → index-BRJVxRn5.js} +1 -1
  34. package/dist/client/assets/{index-Dga5q50h.js → index-BWh9nr9H.js} +1 -1
  35. package/dist/client/assets/{index-DFPad7x_.js → index-Bwlc-Jxf.js} +1 -1
  36. package/dist/client/assets/{index-k-FABVhS.js → index-CH0OlPqf.js} +1 -1
  37. package/dist/client/assets/{index-DrK2f7Cq.js → index-DKr9wV9s.js} +1 -1
  38. package/dist/client/assets/{index-5WQX4UIw.js → index-DUzDXjQf.js} +1 -1
  39. package/dist/client/assets/{index-bX18a8nz.js → index-DZF2HHPf.js} +1 -1
  40. package/dist/client/assets/{index--3ZFGGnZ.js → index-KPo26FUH.js} +1 -1
  41. package/dist/client/assets/{index-DMYwO0S-.js → index-SP6MW72V.js} +1 -1
  42. package/dist/client/assets/{index-CmkiQRLV.js → index-_cX_3yTA.js} +1 -1
  43. package/dist/client/assets/{index-DYX4kWNp.js → index-cu84zbIT.js} +1 -1
  44. package/dist/client/assets/{index-CySzBB0C.js → index-fCxHtwN0.js} +1 -1
  45. package/dist/client/assets/{infoDiagram-HS3SLOUP-CaK1_LNY.js → infoDiagram-HS3SLOUP-C2fqqWBl.js} +1 -1
  46. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-ahkgpOr3.js → journeyDiagram-XKPGCS4Q-CtYhL-Fa.js} +1 -1
  47. package/dist/client/assets/{kanban-definition-3W4ZIXB7-DrsLcNHB.js → kanban-definition-3W4ZIXB7-sHFLpW74.js} +1 -1
  48. package/dist/client/assets/{layout-kBr-ByLR.js → layout-MdARyhdo.js} +1 -1
  49. package/dist/client/assets/main-8hVMNHLv.js +1029 -0
  50. package/dist/client/assets/main-NI1yF8XA.css +1 -0
  51. package/dist/client/assets/{mindmap-definition-VGOIOE7T-CHMj9x7w.js → mindmap-definition-VGOIOE7T-Bup15yfO.js} +1 -1
  52. package/dist/client/assets/{pieDiagram-ADFJNKIX-JtGh9CwE.js → pieDiagram-ADFJNKIX-BfWZvGaL.js} +1 -1
  53. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-BtkeplJz.js → quadrantDiagram-AYHSOK5B-CbCc7ggo.js} +1 -1
  54. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-DSIYZLch.js → requirementDiagram-UZGBJVZJ-Dlt5sQz-.js} +1 -1
  55. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-DQGg1SzY.js → sankeyDiagram-TZEHDZUN-08KQ5MNJ.js} +1 -1
  56. package/dist/client/assets/{sequenceDiagram-WL72ISMW-BLkWIPyC.js → sequenceDiagram-WL72ISMW-DM9CSx6T.js} +1 -1
  57. package/dist/client/assets/{stateDiagram-FKZM4ZOC-BuPqxfpf.js → stateDiagram-FKZM4ZOC-BtFPHXN-.js} +1 -1
  58. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-JAywGea8.js +1 -0
  59. package/dist/client/assets/{timeline-definition-IT6M3QCI-vh4dIOet.js → timeline-definition-IT6M3QCI-slFvRc46.js} +1 -1
  60. package/dist/client/assets/{treemap-GDKQZRPO-C9Mr454A.js → treemap-GDKQZRPO-B6NUX9Ke.js} +1 -1
  61. package/dist/client/assets/{worktree._worktreeId-DYrSBo4e.js → worktree._worktreeId-BRHnl5t2.js} +1 -1
  62. package/dist/client/assets/{worktree._worktreeId-COUtiXXq.js → worktree._worktreeId-DIyXyY26.js} +1 -1
  63. package/dist/client/assets/{xychartDiagram-PRI3JC2R-DTTZebCh.js → xychartDiagram-PRI3JC2R-mi-qUKi6.js} +1 -1
  64. package/dist/migrations/20261013221026_chat_ownership/migration.sql +22 -0
  65. package/dist/migrations/20261013221026_chat_ownership/snapshot.json +4602 -0
  66. package/dist/migrations/20261015083401_worktree_sort_index/migration.sql +2 -0
  67. package/dist/migrations/20261015083401_worktree_sort_index/snapshot.json +4429 -0
  68. package/dist/migrations/20261015143017_device_pairing/migration.sql +3 -0
  69. package/dist/migrations/20261015143017_device_pairing/snapshot.json +4443 -0
  70. package/dist/openapi.json +1524 -209
  71. package/dist/start-server.mjs +51545 -32879
  72. package/dist/terminal-daemon.mjs +8 -1
  73. package/package.json +7 -6
  74. package/dist/client/assets/channel-Hy94D-AA.js +0 -1
  75. package/dist/client/assets/classDiagram-2ON5EDUG-Cwx4pAtm.js +0 -1
  76. package/dist/client/assets/classDiagram-v2-WZHVMYZB-Cwx4pAtm.js +0 -1
  77. package/dist/client/assets/clone-BKfvT5A4.js +0 -1
  78. package/dist/client/assets/main-BubyOwBK.css +0 -1
  79. package/dist/client/assets/main-Tc53m1i8.js +0 -1026
  80. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DSMlIvqa.js +0 -1
package/dist/openapi.json CHANGED
@@ -184,6 +184,66 @@
184
184
  }
185
185
  }
186
186
  },
187
+ "/accountUsage.list": {
188
+ "get": {
189
+ "operationId": "accountUsage.list",
190
+ "tags": [
191
+ "accountUsage"
192
+ ],
193
+ "responses": {
194
+ "200": {
195
+ "description": "Successful response",
196
+ "content": {
197
+ "application/json": {
198
+ "schema": {
199
+ "type": "object",
200
+ "properties": {
201
+ "result": {
202
+ "type": "object",
203
+ "properties": {
204
+ "data": {
205
+ "$ref": "#/components/schemas/AccountUsageReport"
206
+ }
207
+ },
208
+ "required": [
209
+ "data"
210
+ ]
211
+ }
212
+ },
213
+ "required": [
214
+ "result"
215
+ ]
216
+ }
217
+ }
218
+ }
219
+ },
220
+ "default": {
221
+ "$ref": "#/components/responses/Error"
222
+ }
223
+ },
224
+ "parameters": [
225
+ {
226
+ "name": "input",
227
+ "in": "query",
228
+ "required": true,
229
+ "style": "deepObject",
230
+ "content": {
231
+ "application/json": {
232
+ "schema": {
233
+ "type": "object",
234
+ "properties": {
235
+ "refresh": {
236
+ "type": "boolean"
237
+ }
238
+ },
239
+ "additionalProperties": false
240
+ }
241
+ }
242
+ }
243
+ }
244
+ ]
245
+ }
246
+ },
187
247
  "/hooks.check": {
188
248
  "get": {
189
249
  "operationId": "hooks.check",
@@ -4113,9 +4173,10 @@
4113
4173
  }
4114
4174
  }
4115
4175
  },
4116
- "/tokens.issueWorkerBootstrap": {
4176
+ "/tokens.createUnpairedDevice": {
4117
4177
  "post": {
4118
- "operationId": "tokens.issueWorkerBootstrap",
4178
+ "operationId": "tokens.createUnpairedDevice",
4179
+ "description": "A device with no token yet. Show its pairing link next (`pairing`).",
4119
4180
  "tags": [
4120
4181
  "tokens"
4121
4182
  ],
@@ -4133,19 +4194,11 @@
4133
4194
  "data": {
4134
4195
  "type": "object",
4135
4196
  "properties": {
4136
- "token": {
4137
- "type": "string"
4138
- },
4139
- "hostId": {
4140
- "type": "string"
4141
- },
4142
4197
  "view": {
4143
4198
  "$ref": "#/components/schemas/TokenView"
4144
4199
  }
4145
4200
  },
4146
4201
  "required": [
4147
- "token",
4148
- "hostId",
4149
4202
  "view"
4150
4203
  ],
4151
4204
  "additionalProperties": false
@@ -4174,24 +4227,15 @@
4174
4227
  "schema": {
4175
4228
  "type": "object",
4176
4229
  "properties": {
4177
- "hostName": {
4178
- "type": "string"
4179
- },
4180
- "labels": {
4181
- "type": "array",
4182
- "items": {
4183
- "type": "string"
4184
- }
4185
- },
4186
- "hostId": {
4230
+ "label": {
4187
4231
  "type": "string"
4188
4232
  },
4189
- "ttlMinutes": {
4190
- "type": "number"
4233
+ "admin": {
4234
+ "type": "boolean"
4191
4235
  }
4192
4236
  },
4193
4237
  "required": [
4194
- "hostName"
4238
+ "label"
4195
4239
  ],
4196
4240
  "additionalProperties": false
4197
4241
  }
@@ -4200,9 +4244,10 @@
4200
4244
  }
4201
4245
  }
4202
4246
  },
4203
- "/tokens.revoke": {
4247
+ "/tokens.pairing": {
4204
4248
  "post": {
4205
- "operationId": "tokens.revoke",
4249
+ "operationId": "tokens.pairing",
4250
+ "description": "The pairing code of a device: a pending one again, or a new one with `regenerate`. It works\nfor one exchange within 15 minutes. The link is `<address>/?pair=<code>`.",
4206
4251
  "tags": [
4207
4252
  "tokens"
4208
4253
  ],
@@ -4218,16 +4263,7 @@
4218
4263
  "type": "object",
4219
4264
  "properties": {
4220
4265
  "data": {
4221
- "type": "object",
4222
- "properties": {
4223
- "token": {
4224
- "$ref": "#/components/schemas/TokenView"
4225
- }
4226
- },
4227
- "required": [
4228
- "token"
4229
- ],
4230
- "additionalProperties": false
4266
+ "$ref": "#/components/schemas/PairingCode"
4231
4267
  }
4232
4268
  },
4233
4269
  "required": [
@@ -4255,6 +4291,9 @@
4255
4291
  "properties": {
4256
4292
  "tokenId": {
4257
4293
  "type": "string"
4294
+ },
4295
+ "regenerate": {
4296
+ "type": "boolean"
4258
4297
  }
4259
4298
  },
4260
4299
  "required": [
@@ -4267,11 +4306,12 @@
4267
4306
  }
4268
4307
  }
4269
4308
  },
4270
- "/vault.list": {
4309
+ "/tokens.pairingAddresses": {
4271
4310
  "get": {
4272
- "operationId": "vault.list",
4311
+ "operationId": "tokens.pairingAddresses",
4312
+ "description": "The addresses a pairing link may use: `BAND_PUBLIC_URL`, this machine's network interfaces\n(Tailscale, IPv4, IPv6, then bridges) and the custom addresses saved in settings. Read on\nevery call, so Refresh sees a network that changed.",
4273
4313
  "tags": [
4274
- "vault"
4314
+ "tokens"
4275
4315
  ],
4276
4316
  "responses": {
4277
4317
  "200": {
@@ -4285,27 +4325,7 @@
4285
4325
  "type": "object",
4286
4326
  "properties": {
4287
4327
  "data": {
4288
- "type": "object",
4289
- "properties": {
4290
- "items": {
4291
- "type": "array",
4292
- "items": {
4293
- "$ref": "#/components/schemas/VaultItemView"
4294
- }
4295
- },
4296
- "keySource": {
4297
- "type": "string",
4298
- "enum": [
4299
- "env",
4300
- "file"
4301
- ]
4302
- }
4303
- },
4304
- "required": [
4305
- "items",
4306
- "keySource"
4307
- ],
4308
- "additionalProperties": false
4328
+ "$ref": "#/components/schemas/PairingAddresses"
4309
4329
  }
4310
4330
  },
4311
4331
  "required": [
@@ -4326,11 +4346,12 @@
4326
4346
  }
4327
4347
  }
4328
4348
  },
4329
- "/vault.put": {
4349
+ "/tokens.addPairingAddress": {
4330
4350
  "post": {
4331
- "operationId": "vault.put",
4351
+ "operationId": "tokens.addPairingAddress",
4352
+ "description": "Saves a custom address (an http(s) origin). It is not probed: the hub can't tell what another device reaches.",
4332
4353
  "tags": [
4333
- "vault"
4354
+ "tokens"
4334
4355
  ],
4335
4356
  "responses": {
4336
4357
  "200": {
@@ -4346,12 +4367,19 @@
4346
4367
  "data": {
4347
4368
  "type": "object",
4348
4369
  "properties": {
4349
- "item": {
4350
- "$ref": "#/components/schemas/VaultItemView"
4370
+ "url": {
4371
+ "type": "string"
4372
+ },
4373
+ "custom": {
4374
+ "type": "array",
4375
+ "items": {
4376
+ "type": "string"
4377
+ }
4351
4378
  }
4352
4379
  },
4353
4380
  "required": [
4354
- "item"
4381
+ "url",
4382
+ "custom"
4355
4383
  ],
4356
4384
  "additionalProperties": false
4357
4385
  }
@@ -4379,39 +4407,12 @@
4379
4407
  "schema": {
4380
4408
  "type": "object",
4381
4409
  "properties": {
4382
- "value": {
4383
- "type": "string"
4384
- },
4385
- "name": {
4386
- "type": "string"
4387
- },
4388
- "kind": {
4389
- "type": "string",
4390
- "enum": [
4391
- "env",
4392
- "git",
4393
- "api_key"
4394
- ]
4395
- },
4396
- "description": {
4397
- "type": "string"
4398
- },
4399
- "scope": {
4400
- "type": "string"
4401
- },
4402
- "host": {
4403
- "type": "string"
4404
- },
4405
- "pathPattern": {
4406
- "type": "string"
4407
- },
4408
- "username": {
4410
+ "url": {
4409
4411
  "type": "string"
4410
4412
  }
4411
4413
  },
4412
4414
  "required": [
4413
- "value",
4414
- "name"
4415
+ "url"
4415
4416
  ],
4416
4417
  "additionalProperties": false
4417
4418
  }
@@ -4420,11 +4421,11 @@
4420
4421
  }
4421
4422
  }
4422
4423
  },
4423
- "/vault.delete": {
4424
+ "/tokens.removePairingAddress": {
4424
4425
  "post": {
4425
- "operationId": "vault.delete",
4426
+ "operationId": "tokens.removePairingAddress",
4426
4427
  "tags": [
4427
- "vault"
4428
+ "tokens"
4428
4429
  ],
4429
4430
  "responses": {
4430
4431
  "200": {
@@ -4440,20 +4441,15 @@
4440
4441
  "data": {
4441
4442
  "type": "object",
4442
4443
  "properties": {
4443
- "removed": {
4444
- "type": "boolean",
4445
- "const": true
4446
- },
4447
- "revoked": {
4448
- "type": [
4449
- "boolean",
4450
- "null"
4451
- ]
4444
+ "custom": {
4445
+ "type": "array",
4446
+ "items": {
4447
+ "type": "string"
4448
+ }
4452
4449
  }
4453
4450
  },
4454
4451
  "required": [
4455
- "removed",
4456
- "revoked"
4452
+ "custom"
4457
4453
  ],
4458
4454
  "additionalProperties": false
4459
4455
  }
@@ -4481,12 +4477,12 @@
4481
4477
  "schema": {
4482
4478
  "type": "object",
4483
4479
  "properties": {
4484
- "id": {
4480
+ "url": {
4485
4481
  "type": "string"
4486
4482
  }
4487
4483
  },
4488
4484
  "required": [
4489
- "id"
4485
+ "url"
4490
4486
  ],
4491
4487
  "additionalProperties": false
4492
4488
  }
@@ -4495,11 +4491,11 @@
4495
4491
  }
4496
4492
  }
4497
4493
  },
4498
- "/vault.rotateKey": {
4494
+ "/tokens.issueWorkerBootstrap": {
4499
4495
  "post": {
4500
- "operationId": "vault.rotateKey",
4496
+ "operationId": "tokens.issueWorkerBootstrap",
4501
4497
  "tags": [
4502
- "vault"
4498
+ "tokens"
4503
4499
  ],
4504
4500
  "responses": {
4505
4501
  "200": {
@@ -4515,12 +4511,20 @@
4515
4511
  "data": {
4516
4512
  "type": "object",
4517
4513
  "properties": {
4518
- "rotated": {
4519
- "type": "number"
4514
+ "token": {
4515
+ "type": "string"
4516
+ },
4517
+ "hostId": {
4518
+ "type": "string"
4519
+ },
4520
+ "view": {
4521
+ "$ref": "#/components/schemas/TokenView"
4520
4522
  }
4521
4523
  },
4522
4524
  "required": [
4523
- "rotated"
4525
+ "token",
4526
+ "hostId",
4527
+ "view"
4524
4528
  ],
4525
4529
  "additionalProperties": false
4526
4530
  }
@@ -4540,14 +4544,45 @@
4540
4544
  "default": {
4541
4545
  "$ref": "#/components/responses/Error"
4542
4546
  }
4547
+ },
4548
+ "requestBody": {
4549
+ "required": true,
4550
+ "content": {
4551
+ "application/json": {
4552
+ "schema": {
4553
+ "type": "object",
4554
+ "properties": {
4555
+ "hostName": {
4556
+ "type": "string"
4557
+ },
4558
+ "labels": {
4559
+ "type": "array",
4560
+ "items": {
4561
+ "type": "string"
4562
+ }
4563
+ },
4564
+ "hostId": {
4565
+ "type": "string"
4566
+ },
4567
+ "ttlMinutes": {
4568
+ "type": "number"
4569
+ }
4570
+ },
4571
+ "required": [
4572
+ "hostName"
4573
+ ],
4574
+ "additionalProperties": false
4575
+ }
4576
+ }
4577
+ }
4543
4578
  }
4544
4579
  }
4545
4580
  },
4546
- "/vault.startOAuth": {
4581
+ "/tokens.revoke": {
4547
4582
  "post": {
4548
- "operationId": "vault.startOAuth",
4583
+ "operationId": "tokens.revoke",
4549
4584
  "tags": [
4550
- "vault"
4585
+ "tokens"
4551
4586
  ],
4552
4587
  "responses": {
4553
4588
  "200": {
@@ -4563,16 +4598,12 @@
4563
4598
  "data": {
4564
4599
  "type": "object",
4565
4600
  "properties": {
4566
- "flowId": {
4567
- "type": "string"
4568
- },
4569
- "authorizationUrl": {
4570
- "type": "string"
4601
+ "token": {
4602
+ "$ref": "#/components/schemas/TokenView"
4571
4603
  }
4572
4604
  },
4573
4605
  "required": [
4574
- "flowId",
4575
- "authorizationUrl"
4606
+ "token"
4576
4607
  ],
4577
4608
  "additionalProperties": false
4578
4609
  }
@@ -4600,7 +4631,354 @@
4600
4631
  "schema": {
4601
4632
  "type": "object",
4602
4633
  "properties": {
4603
- "name": {
4634
+ "tokenId": {
4635
+ "type": "string"
4636
+ }
4637
+ },
4638
+ "required": [
4639
+ "tokenId"
4640
+ ],
4641
+ "additionalProperties": false
4642
+ }
4643
+ }
4644
+ }
4645
+ }
4646
+ }
4647
+ },
4648
+ "/vault.list": {
4649
+ "get": {
4650
+ "operationId": "vault.list",
4651
+ "tags": [
4652
+ "vault"
4653
+ ],
4654
+ "responses": {
4655
+ "200": {
4656
+ "description": "Successful response",
4657
+ "content": {
4658
+ "application/json": {
4659
+ "schema": {
4660
+ "type": "object",
4661
+ "properties": {
4662
+ "result": {
4663
+ "type": "object",
4664
+ "properties": {
4665
+ "data": {
4666
+ "type": "object",
4667
+ "properties": {
4668
+ "items": {
4669
+ "type": "array",
4670
+ "items": {
4671
+ "$ref": "#/components/schemas/VaultItemView"
4672
+ }
4673
+ },
4674
+ "keySource": {
4675
+ "type": "string",
4676
+ "enum": [
4677
+ "env",
4678
+ "file"
4679
+ ]
4680
+ }
4681
+ },
4682
+ "required": [
4683
+ "items",
4684
+ "keySource"
4685
+ ],
4686
+ "additionalProperties": false
4687
+ }
4688
+ },
4689
+ "required": [
4690
+ "data"
4691
+ ]
4692
+ }
4693
+ },
4694
+ "required": [
4695
+ "result"
4696
+ ]
4697
+ }
4698
+ }
4699
+ }
4700
+ },
4701
+ "default": {
4702
+ "$ref": "#/components/responses/Error"
4703
+ }
4704
+ }
4705
+ }
4706
+ },
4707
+ "/vault.put": {
4708
+ "post": {
4709
+ "operationId": "vault.put",
4710
+ "tags": [
4711
+ "vault"
4712
+ ],
4713
+ "responses": {
4714
+ "200": {
4715
+ "description": "Successful response",
4716
+ "content": {
4717
+ "application/json": {
4718
+ "schema": {
4719
+ "type": "object",
4720
+ "properties": {
4721
+ "result": {
4722
+ "type": "object",
4723
+ "properties": {
4724
+ "data": {
4725
+ "type": "object",
4726
+ "properties": {
4727
+ "item": {
4728
+ "$ref": "#/components/schemas/VaultItemView"
4729
+ }
4730
+ },
4731
+ "required": [
4732
+ "item"
4733
+ ],
4734
+ "additionalProperties": false
4735
+ }
4736
+ },
4737
+ "required": [
4738
+ "data"
4739
+ ]
4740
+ }
4741
+ },
4742
+ "required": [
4743
+ "result"
4744
+ ]
4745
+ }
4746
+ }
4747
+ }
4748
+ },
4749
+ "default": {
4750
+ "$ref": "#/components/responses/Error"
4751
+ }
4752
+ },
4753
+ "requestBody": {
4754
+ "required": true,
4755
+ "content": {
4756
+ "application/json": {
4757
+ "schema": {
4758
+ "type": "object",
4759
+ "properties": {
4760
+ "value": {
4761
+ "type": "string"
4762
+ },
4763
+ "name": {
4764
+ "type": "string"
4765
+ },
4766
+ "kind": {
4767
+ "type": "string",
4768
+ "enum": [
4769
+ "env",
4770
+ "git",
4771
+ "api_key"
4772
+ ]
4773
+ },
4774
+ "description": {
4775
+ "type": "string"
4776
+ },
4777
+ "scope": {
4778
+ "type": "string"
4779
+ },
4780
+ "host": {
4781
+ "type": "string"
4782
+ },
4783
+ "pathPattern": {
4784
+ "type": "string"
4785
+ },
4786
+ "username": {
4787
+ "type": "string"
4788
+ }
4789
+ },
4790
+ "required": [
4791
+ "value",
4792
+ "name"
4793
+ ],
4794
+ "additionalProperties": false
4795
+ }
4796
+ }
4797
+ }
4798
+ }
4799
+ }
4800
+ },
4801
+ "/vault.delete": {
4802
+ "post": {
4803
+ "operationId": "vault.delete",
4804
+ "tags": [
4805
+ "vault"
4806
+ ],
4807
+ "responses": {
4808
+ "200": {
4809
+ "description": "Successful response",
4810
+ "content": {
4811
+ "application/json": {
4812
+ "schema": {
4813
+ "type": "object",
4814
+ "properties": {
4815
+ "result": {
4816
+ "type": "object",
4817
+ "properties": {
4818
+ "data": {
4819
+ "type": "object",
4820
+ "properties": {
4821
+ "removed": {
4822
+ "type": "boolean",
4823
+ "const": true
4824
+ },
4825
+ "revoked": {
4826
+ "type": [
4827
+ "boolean",
4828
+ "null"
4829
+ ]
4830
+ }
4831
+ },
4832
+ "required": [
4833
+ "removed",
4834
+ "revoked"
4835
+ ],
4836
+ "additionalProperties": false
4837
+ }
4838
+ },
4839
+ "required": [
4840
+ "data"
4841
+ ]
4842
+ }
4843
+ },
4844
+ "required": [
4845
+ "result"
4846
+ ]
4847
+ }
4848
+ }
4849
+ }
4850
+ },
4851
+ "default": {
4852
+ "$ref": "#/components/responses/Error"
4853
+ }
4854
+ },
4855
+ "requestBody": {
4856
+ "required": true,
4857
+ "content": {
4858
+ "application/json": {
4859
+ "schema": {
4860
+ "type": "object",
4861
+ "properties": {
4862
+ "id": {
4863
+ "type": "string"
4864
+ }
4865
+ },
4866
+ "required": [
4867
+ "id"
4868
+ ],
4869
+ "additionalProperties": false
4870
+ }
4871
+ }
4872
+ }
4873
+ }
4874
+ }
4875
+ },
4876
+ "/vault.rotateKey": {
4877
+ "post": {
4878
+ "operationId": "vault.rotateKey",
4879
+ "tags": [
4880
+ "vault"
4881
+ ],
4882
+ "responses": {
4883
+ "200": {
4884
+ "description": "Successful response",
4885
+ "content": {
4886
+ "application/json": {
4887
+ "schema": {
4888
+ "type": "object",
4889
+ "properties": {
4890
+ "result": {
4891
+ "type": "object",
4892
+ "properties": {
4893
+ "data": {
4894
+ "type": "object",
4895
+ "properties": {
4896
+ "rotated": {
4897
+ "type": "number"
4898
+ }
4899
+ },
4900
+ "required": [
4901
+ "rotated"
4902
+ ],
4903
+ "additionalProperties": false
4904
+ }
4905
+ },
4906
+ "required": [
4907
+ "data"
4908
+ ]
4909
+ }
4910
+ },
4911
+ "required": [
4912
+ "result"
4913
+ ]
4914
+ }
4915
+ }
4916
+ }
4917
+ },
4918
+ "default": {
4919
+ "$ref": "#/components/responses/Error"
4920
+ }
4921
+ }
4922
+ }
4923
+ },
4924
+ "/vault.startOAuth": {
4925
+ "post": {
4926
+ "operationId": "vault.startOAuth",
4927
+ "tags": [
4928
+ "vault"
4929
+ ],
4930
+ "responses": {
4931
+ "200": {
4932
+ "description": "Successful response",
4933
+ "content": {
4934
+ "application/json": {
4935
+ "schema": {
4936
+ "type": "object",
4937
+ "properties": {
4938
+ "result": {
4939
+ "type": "object",
4940
+ "properties": {
4941
+ "data": {
4942
+ "type": "object",
4943
+ "properties": {
4944
+ "flowId": {
4945
+ "type": "string"
4946
+ },
4947
+ "authorizationUrl": {
4948
+ "type": "string"
4949
+ }
4950
+ },
4951
+ "required": [
4952
+ "flowId",
4953
+ "authorizationUrl"
4954
+ ],
4955
+ "additionalProperties": false
4956
+ }
4957
+ },
4958
+ "required": [
4959
+ "data"
4960
+ ]
4961
+ }
4962
+ },
4963
+ "required": [
4964
+ "result"
4965
+ ]
4966
+ }
4967
+ }
4968
+ }
4969
+ },
4970
+ "default": {
4971
+ "$ref": "#/components/responses/Error"
4972
+ }
4973
+ },
4974
+ "requestBody": {
4975
+ "required": true,
4976
+ "content": {
4977
+ "application/json": {
4978
+ "schema": {
4979
+ "type": "object",
4980
+ "properties": {
4981
+ "name": {
4604
4982
  "type": "string"
4605
4983
  },
4606
4984
  "serverUrl": {
@@ -4696,6 +5074,165 @@
4696
5074
  ]
4697
5075
  }
4698
5076
  },
5077
+ "/voice.status": {
5078
+ "get": {
5079
+ "operationId": "voice.status",
5080
+ "tags": [
5081
+ "voice"
5082
+ ],
5083
+ "responses": {
5084
+ "200": {
5085
+ "description": "Successful response",
5086
+ "content": {
5087
+ "application/json": {
5088
+ "schema": {
5089
+ "type": "object",
5090
+ "properties": {
5091
+ "result": {
5092
+ "type": "object",
5093
+ "properties": {
5094
+ "data": {
5095
+ "$ref": "#/components/schemas/VoiceStatus"
5096
+ }
5097
+ },
5098
+ "required": [
5099
+ "data"
5100
+ ]
5101
+ }
5102
+ },
5103
+ "required": [
5104
+ "result"
5105
+ ]
5106
+ }
5107
+ }
5108
+ }
5109
+ },
5110
+ "default": {
5111
+ "$ref": "#/components/responses/Error"
5112
+ }
5113
+ }
5114
+ }
5115
+ },
5116
+ "/voice.config": {
5117
+ "get": {
5118
+ "operationId": "voice.config",
5119
+ "tags": [
5120
+ "voice"
5121
+ ],
5122
+ "responses": {
5123
+ "200": {
5124
+ "description": "Successful response",
5125
+ "content": {
5126
+ "application/json": {
5127
+ "schema": {
5128
+ "type": "object",
5129
+ "properties": {
5130
+ "result": {
5131
+ "type": "object",
5132
+ "properties": {
5133
+ "data": {
5134
+ "$ref": "#/components/schemas/VoiceSettings"
5135
+ }
5136
+ },
5137
+ "required": [
5138
+ "data"
5139
+ ]
5140
+ }
5141
+ },
5142
+ "required": [
5143
+ "result"
5144
+ ]
5145
+ }
5146
+ }
5147
+ }
5148
+ },
5149
+ "default": {
5150
+ "$ref": "#/components/responses/Error"
5151
+ }
5152
+ }
5153
+ }
5154
+ },
5155
+ "/voice.test": {
5156
+ "post": {
5157
+ "operationId": "voice.test",
5158
+ "tags": [
5159
+ "voice"
5160
+ ],
5161
+ "responses": {
5162
+ "200": {
5163
+ "description": "Successful response",
5164
+ "content": {
5165
+ "application/json": {
5166
+ "schema": {
5167
+ "type": "object",
5168
+ "properties": {
5169
+ "result": {
5170
+ "type": "object",
5171
+ "properties": {
5172
+ "data": {
5173
+ "type": "object",
5174
+ "properties": {
5175
+ "ok": {
5176
+ "type": "boolean",
5177
+ "const": true
5178
+ },
5179
+ "hostId": {
5180
+ "type": "string"
5181
+ }
5182
+ },
5183
+ "required": [
5184
+ "ok",
5185
+ "hostId"
5186
+ ],
5187
+ "additionalProperties": false
5188
+ }
5189
+ },
5190
+ "required": [
5191
+ "data"
5192
+ ]
5193
+ }
5194
+ },
5195
+ "required": [
5196
+ "result"
5197
+ ]
5198
+ }
5199
+ }
5200
+ }
5201
+ },
5202
+ "default": {
5203
+ "$ref": "#/components/responses/Error"
5204
+ }
5205
+ },
5206
+ "requestBody": {
5207
+ "required": true,
5208
+ "content": {
5209
+ "application/json": {
5210
+ "schema": {
5211
+ "type": "object",
5212
+ "properties": {
5213
+ "model": {
5214
+ "type": "string"
5215
+ },
5216
+ "baseUrl": {
5217
+ "type": "string"
5218
+ },
5219
+ "language": {
5220
+ "type": "string"
5221
+ },
5222
+ "hostId": {
5223
+ "type": "string"
5224
+ },
5225
+ "apiKeyItemId": {
5226
+ "type": "string"
5227
+ }
5228
+ },
5229
+ "additionalProperties": false
5230
+ }
5231
+ }
5232
+ }
5233
+ }
5234
+ }
5235
+ },
4699
5236
  "/mcp.list": {
4700
5237
  "get": {
4701
5238
  "operationId": "mcp.list",
@@ -4806,6 +5343,9 @@
4806
5343
  "command": {
4807
5344
  "type": "string"
4808
5345
  },
5346
+ "enabled": {
5347
+ "type": "boolean"
5348
+ },
4809
5349
  "hostId": {
4810
5350
  "type": "string"
4811
5351
  },
@@ -4851,9 +5391,6 @@
4851
5391
  ]
4852
5392
  }
4853
5393
  },
4854
- "enabled": {
4855
- "type": "boolean"
4856
- },
4857
5394
  "cwd": {
4858
5395
  "type": [
4859
5396
  "string",
@@ -5003,6 +5540,9 @@
5003
5540
  "command": {
5004
5541
  "type": "string"
5005
5542
  },
5543
+ "enabled": {
5544
+ "type": "boolean"
5545
+ },
5006
5546
  "hostId": {
5007
5547
  "type": "string"
5008
5548
  },
@@ -5048,9 +5588,6 @@
5048
5588
  ]
5049
5589
  }
5050
5590
  },
5051
- "enabled": {
5052
- "type": "boolean"
5053
- },
5054
5591
  "cwd": {
5055
5592
  "type": [
5056
5593
  "string",
@@ -7831,7 +8368,7 @@
7831
8368
  "messages": {
7832
8369
  "type": "array",
7833
8370
  "items": {
7834
- "$ref": "#/components/schemas/WireQueuedMessage"
8371
+ "$ref": "#/components/schemas/QueuedChatMessage"
7835
8372
  }
7836
8373
  }
7837
8374
  },
@@ -7949,7 +8486,7 @@
7949
8486
  "messages": {
7950
8487
  "type": "array",
7951
8488
  "items": {
7952
- "$ref": "#/components/schemas/WireQueuedMessage"
8489
+ "$ref": "#/components/schemas/QueuedChatMessage"
7953
8490
  }
7954
8491
  }
7955
8492
  },
@@ -8033,7 +8570,7 @@
8033
8570
  "messages": {
8034
8571
  "type": "array",
8035
8572
  "items": {
8036
- "$ref": "#/components/schemas/WireQueuedMessage"
8573
+ "$ref": "#/components/schemas/QueuedChatMessage"
8037
8574
  }
8038
8575
  }
8039
8576
  },
@@ -8118,7 +8655,7 @@
8118
8655
  "messages": {
8119
8656
  "type": "array",
8120
8657
  "items": {
8121
- "$ref": "#/components/schemas/WireQueuedMessage"
8658
+ "$ref": "#/components/schemas/QueuedChatMessage"
8122
8659
  }
8123
8660
  }
8124
8661
  },
@@ -8684,6 +9221,97 @@
8684
9221
  }
8685
9222
  }
8686
9223
  },
9224
+ "/reviews.rerunChecks": {
9225
+ "post": {
9226
+ "operationId": "reviews.rerunChecks",
9227
+ "description": "Run CI jobs of the worktree's branch again.",
9228
+ "tags": [
9229
+ "reviews"
9230
+ ],
9231
+ "responses": {
9232
+ "200": {
9233
+ "description": "Successful response",
9234
+ "content": {
9235
+ "application/json": {
9236
+ "schema": {
9237
+ "type": "object",
9238
+ "properties": {
9239
+ "result": {
9240
+ "type": "object",
9241
+ "properties": {
9242
+ "data": {
9243
+ "type": "object",
9244
+ "properties": {
9245
+ "ok": {
9246
+ "type": "boolean",
9247
+ "const": true
9248
+ }
9249
+ },
9250
+ "required": [
9251
+ "ok"
9252
+ ],
9253
+ "additionalProperties": false
9254
+ }
9255
+ },
9256
+ "required": [
9257
+ "data"
9258
+ ]
9259
+ }
9260
+ },
9261
+ "required": [
9262
+ "result"
9263
+ ]
9264
+ }
9265
+ }
9266
+ }
9267
+ },
9268
+ "default": {
9269
+ "$ref": "#/components/responses/Error"
9270
+ }
9271
+ },
9272
+ "requestBody": {
9273
+ "required": true,
9274
+ "content": {
9275
+ "application/json": {
9276
+ "schema": {
9277
+ "type": "object",
9278
+ "properties": {
9279
+ "worktreeId": {
9280
+ "type": "string"
9281
+ },
9282
+ "targets": {
9283
+ "type": "array",
9284
+ "items": {
9285
+ "type": "object",
9286
+ "properties": {
9287
+ "runId": {
9288
+ "type": "string"
9289
+ },
9290
+ "jobId": {
9291
+ "type": "string"
9292
+ },
9293
+ "failedOnly": {
9294
+ "type": "boolean"
9295
+ }
9296
+ },
9297
+ "required": [
9298
+ "runId"
9299
+ ],
9300
+ "additionalProperties": false
9301
+ }
9302
+ }
9303
+ },
9304
+ "required": [
9305
+ "worktreeId",
9306
+ "targets"
9307
+ ],
9308
+ "additionalProperties": false
9309
+ }
9310
+ }
9311
+ }
9312
+ }
9313
+ }
9314
+ },
8687
9315
  "/services.health": {
8688
9316
  "get": {
8689
9317
  "operationId": "services.health",
@@ -8813,6 +9441,9 @@
8813
9441
  "active",
8814
9442
  "background"
8815
9443
  ]
9444
+ },
9445
+ "clientId": {
9446
+ "type": "string"
8816
9447
  }
8817
9448
  },
8818
9449
  "required": [
@@ -8825,6 +9456,73 @@
8825
9456
  }
8826
9457
  }
8827
9458
  },
9459
+ "/services.releaseActivity": {
9460
+ "post": {
9461
+ "operationId": "services.releaseActivity",
9462
+ "tags": [
9463
+ "services"
9464
+ ],
9465
+ "responses": {
9466
+ "200": {
9467
+ "description": "Successful response",
9468
+ "content": {
9469
+ "application/json": {
9470
+ "schema": {
9471
+ "type": "object",
9472
+ "properties": {
9473
+ "result": {
9474
+ "type": "object",
9475
+ "properties": {
9476
+ "data": {
9477
+ "type": "object",
9478
+ "properties": {
9479
+ "released": {
9480
+ "type": "boolean"
9481
+ }
9482
+ },
9483
+ "required": [
9484
+ "released"
9485
+ ],
9486
+ "additionalProperties": false
9487
+ }
9488
+ },
9489
+ "required": [
9490
+ "data"
9491
+ ]
9492
+ }
9493
+ },
9494
+ "required": [
9495
+ "result"
9496
+ ]
9497
+ }
9498
+ }
9499
+ }
9500
+ },
9501
+ "default": {
9502
+ "$ref": "#/components/responses/Error"
9503
+ }
9504
+ },
9505
+ "requestBody": {
9506
+ "required": true,
9507
+ "content": {
9508
+ "application/json": {
9509
+ "schema": {
9510
+ "type": "object",
9511
+ "properties": {
9512
+ "clientId": {
9513
+ "type": "string"
9514
+ }
9515
+ },
9516
+ "required": [
9517
+ "clientId"
9518
+ ],
9519
+ "additionalProperties": false
9520
+ }
9521
+ }
9522
+ }
9523
+ }
9524
+ }
9525
+ },
8828
9526
  "/services.getActivity": {
8829
9527
  "get": {
8830
9528
  "operationId": "services.getActivity",
@@ -8852,11 +9550,21 @@
8852
9550
  "active",
8853
9551
  "background"
8854
9552
  ],
8855
- "description": "Activity level controls how aggressively we poll git/CI status. The Electron\nmain process drives this via the `services.setActivity` tRPC mutation when\nthe window gains/loses focus or the laptop transitions on/off battery —\nsee `apps/desktop/src/main/services/activity-monitor.ts`. Other clients\n(CLI, web-only deployments) can leave it at the default `\"active\"`."
9553
+ "description": "How actively a client looks at Band. The branch-status poller picks its cadence from the most active live client."
9554
+ },
9555
+ "poller": {
9556
+ "type": "string",
9557
+ "enum": [
9558
+ "idle",
9559
+ "active",
9560
+ "background"
9561
+ ],
9562
+ "description": "Activity level controls how aggressively we poll git/CI status. Each UI\nreports its own through `services.setActivity` (window focus and power\nstate, see `apps/web/src/lib/activity-reporter.ts`); `clientActivityService`\nkeeps one entry per client, drops one that stops reporting, and the poller\nfollows the most active live client. With no live client the level is\n`\"idle\"`."
8856
9563
  }
8857
9564
  },
8858
9565
  "required": [
8859
- "activity"
9566
+ "activity",
9567
+ "poller"
8860
9568
  ],
8861
9569
  "additionalProperties": false
8862
9570
  }
@@ -9785,7 +10493,7 @@
9785
10493
  "type": "object",
9786
10494
  "properties": {
9787
10495
  "data": {
9788
- "$ref": "#/components/schemas/Settings"
10496
+ "$ref": "#/components/schemas/settings"
9789
10497
  }
9790
10498
  },
9791
10499
  "required": [
@@ -10005,6 +10713,30 @@
10005
10713
  },
10006
10714
  "additionalProperties": {}
10007
10715
  },
10716
+ "voice": {
10717
+ "type": "object",
10718
+ "properties": {
10719
+ "model": {
10720
+ "type": "string"
10721
+ },
10722
+ "enabled": {
10723
+ "type": "boolean"
10724
+ },
10725
+ "baseUrl": {
10726
+ "type": "string"
10727
+ },
10728
+ "language": {
10729
+ "type": "string"
10730
+ },
10731
+ "hostId": {
10732
+ "type": "string"
10733
+ },
10734
+ "apiKeyItemId": {
10735
+ "type": "string"
10736
+ }
10737
+ },
10738
+ "additionalProperties": {}
10739
+ },
10008
10740
  "environmentBuilder": {
10009
10741
  "type": "object",
10010
10742
  "properties": {
@@ -11645,17 +12377,138 @@
11645
12377
  "repo": {
11646
12378
  "type": "string"
11647
12379
  },
11648
- "pinned": {
11649
- "type": "boolean"
12380
+ "pinned": {
12381
+ "type": "boolean"
12382
+ },
12383
+ "hostId": {
12384
+ "type": "string"
12385
+ }
12386
+ },
12387
+ "required": [
12388
+ "name",
12389
+ "repo",
12390
+ "pinned"
12391
+ ],
12392
+ "additionalProperties": false
12393
+ }
12394
+ }
12395
+ }
12396
+ }
12397
+ }
12398
+ },
12399
+ "/worktrees.reorder": {
12400
+ "post": {
12401
+ "operationId": "worktrees.reorder",
12402
+ "tags": [
12403
+ "worktrees"
12404
+ ],
12405
+ "responses": {
12406
+ "200": {
12407
+ "description": "Successful response",
12408
+ "content": {
12409
+ "application/json": {
12410
+ "schema": {
12411
+ "type": "object",
12412
+ "properties": {
12413
+ "result": {
12414
+ "type": "object",
12415
+ "properties": {
12416
+ "data": {
12417
+ "type": "object",
12418
+ "properties": {
12419
+ "ok": {
12420
+ "type": "boolean",
12421
+ "const": true
12422
+ }
12423
+ },
12424
+ "required": [
12425
+ "ok"
12426
+ ],
12427
+ "additionalProperties": false
12428
+ }
12429
+ },
12430
+ "required": [
12431
+ "data"
12432
+ ]
12433
+ }
12434
+ },
12435
+ "required": [
12436
+ "result"
12437
+ ]
12438
+ }
12439
+ }
12440
+ }
12441
+ },
12442
+ "default": {
12443
+ "$ref": "#/components/responses/Error"
12444
+ }
12445
+ },
12446
+ "requestBody": {
12447
+ "required": true,
12448
+ "content": {
12449
+ "application/json": {
12450
+ "schema": {
12451
+ "type": "object",
12452
+ "properties": {
12453
+ "order": {
12454
+ "type": "array",
12455
+ "items": {
12456
+ "type": "object",
12457
+ "properties": {
12458
+ "name": {
12459
+ "type": "string"
12460
+ },
12461
+ "repo": {
12462
+ "type": "string"
12463
+ },
12464
+ "hostId": {
12465
+ "type": "string"
12466
+ }
12467
+ },
12468
+ "required": [
12469
+ "name",
12470
+ "repo"
12471
+ ],
12472
+ "additionalProperties": false
12473
+ }
12474
+ },
12475
+ "scope": {
12476
+ "type": "string",
12477
+ "enum": [
12478
+ "siblings",
12479
+ "pins"
12480
+ ]
11650
12481
  },
11651
- "hostId": {
11652
- "type": "string"
12482
+ "reparent": {
12483
+ "type": "object",
12484
+ "properties": {
12485
+ "name": {
12486
+ "type": "string"
12487
+ },
12488
+ "repo": {
12489
+ "type": "string"
12490
+ },
12491
+ "origin": {
12492
+ "type": [
12493
+ "string",
12494
+ "null"
12495
+ ]
12496
+ },
12497
+ "hostId": {
12498
+ "type": "string"
12499
+ }
12500
+ },
12501
+ "required": [
12502
+ "name",
12503
+ "repo",
12504
+ "origin"
12505
+ ],
12506
+ "additionalProperties": false
11653
12507
  }
11654
12508
  },
11655
12509
  "required": [
11656
- "name",
11657
- "repo",
11658
- "pinned"
12510
+ "order",
12511
+ "scope"
11659
12512
  ],
11660
12513
  "additionalProperties": false
11661
12514
  }
@@ -12038,6 +12891,76 @@
12038
12891
  }
12039
12892
  }
12040
12893
  },
12894
+ "/worktree.directAccess": {
12895
+ "post": {
12896
+ "operationId": "worktree.directAccess",
12897
+ "description": "A short-lived token for the worker that holds `worktreeId`, when that\nworker is `hostId`, the caller's own machine (the desktop app passes its\nworker's id). Null when the direct path does not apply, and the caller\nkeeps using the hub.",
12898
+ "tags": [
12899
+ "worktree"
12900
+ ],
12901
+ "responses": {
12902
+ "200": {
12903
+ "description": "Successful response",
12904
+ "content": {
12905
+ "application/json": {
12906
+ "schema": {
12907
+ "type": "object",
12908
+ "properties": {
12909
+ "result": {
12910
+ "type": "object",
12911
+ "properties": {
12912
+ "data": {
12913
+ "oneOf": [
12914
+ {
12915
+ "$ref": "#/components/schemas/DirectAccess"
12916
+ },
12917
+ {
12918
+ "type": "null"
12919
+ }
12920
+ ]
12921
+ }
12922
+ },
12923
+ "required": [
12924
+ "data"
12925
+ ]
12926
+ }
12927
+ },
12928
+ "required": [
12929
+ "result"
12930
+ ]
12931
+ }
12932
+ }
12933
+ }
12934
+ },
12935
+ "default": {
12936
+ "$ref": "#/components/responses/Error"
12937
+ }
12938
+ },
12939
+ "requestBody": {
12940
+ "required": true,
12941
+ "content": {
12942
+ "application/json": {
12943
+ "schema": {
12944
+ "type": "object",
12945
+ "properties": {
12946
+ "hostId": {
12947
+ "type": "string"
12948
+ },
12949
+ "worktreeId": {
12950
+ "type": "string"
12951
+ }
12952
+ },
12953
+ "required": [
12954
+ "hostId",
12955
+ "worktreeId"
12956
+ ],
12957
+ "additionalProperties": false
12958
+ }
12959
+ }
12960
+ }
12961
+ }
12962
+ }
12963
+ },
12041
12964
  "/worktree.getTerminalConfig": {
12042
12965
  "get": {
12043
12966
  "operationId": "worktree.getTerminalConfig",
@@ -14688,12 +15611,6 @@
14688
15611
  "prompt": {
14689
15612
  "type": "string"
14690
15613
  },
14691
- "key": {
14692
- "type": "string"
14693
- },
14694
- "cronExpression": {
14695
- "type": "string"
14696
- },
14697
15614
  "scope": {
14698
15615
  "type": "string",
14699
15616
  "enum": [
@@ -14701,6 +15618,15 @@
14701
15618
  "repo"
14702
15619
  ]
14703
15620
  },
15621
+ "key": {
15622
+ "type": "string"
15623
+ },
15624
+ "cronExpression": {
15625
+ "type": "string"
15626
+ },
15627
+ "enabled": {
15628
+ "type": "boolean"
15629
+ },
14704
15630
  "worktreeId": {
14705
15631
  "type": "string"
14706
15632
  },
@@ -14710,17 +15636,14 @@
14710
15636
  "chat",
14711
15637
  "terminal"
14712
15638
  ]
14713
- },
14714
- "enabled": {
14715
- "type": "boolean"
14716
15639
  }
14717
15640
  },
14718
15641
  "required": [
14719
15642
  "name",
14720
15643
  "prompt",
15644
+ "scope",
14721
15645
  "key",
14722
- "cronExpression",
14723
- "scope"
15646
+ "cronExpression"
14724
15647
  ],
14725
15648
  "additionalProperties": false
14726
15649
  }
@@ -14791,14 +15714,14 @@
14791
15714
  "name": {
14792
15715
  "type": "string"
14793
15716
  },
15717
+ "enabled": {
15718
+ "type": "boolean"
15719
+ },
14794
15720
  "prompt": {
14795
15721
  "type": "string"
14796
15722
  },
14797
15723
  "cronExpression": {
14798
15724
  "type": "string"
14799
- },
14800
- "enabled": {
14801
- "type": "boolean"
14802
15725
  }
14803
15726
  },
14804
15727
  "required": [
@@ -18190,9 +19113,6 @@
18190
19113
  "schema": {
18191
19114
  "type": "object",
18192
19115
  "properties": {
18193
- "key": {
18194
- "type": "string"
18195
- },
18196
19116
  "scope": {
18197
19117
  "type": "string",
18198
19118
  "enum": [
@@ -18201,6 +19121,9 @@
18201
19121
  "all"
18202
19122
  ]
18203
19123
  },
19124
+ "key": {
19125
+ "type": "string"
19126
+ },
18204
19127
  "baseVersion": {
18205
19128
  "type": "number"
18206
19129
  },
@@ -18210,8 +19133,8 @@
18210
19133
  "value": {}
18211
19134
  },
18212
19135
  "required": [
18213
- "key",
18214
19136
  "scope",
19137
+ "key",
18215
19138
  "baseVersion",
18216
19139
  "clientId"
18217
19140
  ],
@@ -18304,9 +19227,6 @@
18304
19227
  "schema": {
18305
19228
  "type": "object",
18306
19229
  "properties": {
18307
- "key": {
18308
- "type": "string"
18309
- },
18310
19230
  "scope": {
18311
19231
  "type": "string",
18312
19232
  "enum": [
@@ -18315,6 +19235,9 @@
18315
19235
  "all"
18316
19236
  ]
18317
19237
  },
19238
+ "key": {
19239
+ "type": "string"
19240
+ },
18318
19241
  "baseVersion": {
18319
19242
  "type": "number"
18320
19243
  },
@@ -18323,8 +19246,8 @@
18323
19246
  }
18324
19247
  },
18325
19248
  "required": [
18326
- "key",
18327
19249
  "scope",
19250
+ "key",
18328
19251
  "baseVersion",
18329
19252
  "clientId"
18330
19253
  ],
@@ -19037,42 +19960,179 @@
19037
19960
  }
19038
19961
  }
19039
19962
  },
19040
- "default": {
19041
- "$ref": "#/components/responses/Error"
19042
- }
19043
- },
19044
- "parameters": [
19045
- {
19046
- "name": "input",
19047
- "in": "query",
19048
- "required": true,
19049
- "style": "deepObject",
19050
- "content": {
19051
- "application/json": {
19052
- "schema": {
19053
- "type": "object",
19054
- "properties": {
19055
- "worktreeId": {
19056
- "type": "string"
19057
- },
19058
- "chatId": {
19059
- "type": "string"
19060
- }
19061
- },
19062
- "required": [
19063
- "worktreeId"
19064
- ],
19065
- "additionalProperties": false
19066
- }
19067
- }
19963
+ "default": {
19964
+ "$ref": "#/components/responses/Error"
19965
+ }
19966
+ },
19967
+ "parameters": [
19968
+ {
19969
+ "name": "input",
19970
+ "in": "query",
19971
+ "required": true,
19972
+ "style": "deepObject",
19973
+ "content": {
19974
+ "application/json": {
19975
+ "schema": {
19976
+ "type": "object",
19977
+ "properties": {
19978
+ "worktreeId": {
19979
+ "type": "string"
19980
+ },
19981
+ "chatId": {
19982
+ "type": "string"
19983
+ }
19984
+ },
19985
+ "required": [
19986
+ "worktreeId"
19987
+ ],
19988
+ "additionalProperties": false
19989
+ }
19990
+ }
19991
+ }
19992
+ }
19993
+ ]
19994
+ }
19995
+ }
19996
+ },
19997
+ "components": {
19998
+ "schemas": {
19999
+ "AccountUsageReport": {
20000
+ "type": "object",
20001
+ "properties": {
20002
+ "rows": {
20003
+ "type": "array",
20004
+ "items": {
20005
+ "$ref": "#/components/schemas/AccountUsageRow"
20006
+ }
20007
+ },
20008
+ "problems": {
20009
+ "type": "array",
20010
+ "items": {
20011
+ "$ref": "#/components/schemas/AccountUsageProblem"
20012
+ }
20013
+ }
20014
+ },
20015
+ "required": [
20016
+ "rows",
20017
+ "problems"
20018
+ ],
20019
+ "additionalProperties": false
20020
+ },
20021
+ "AccountUsageRow": {
20022
+ "type": "object",
20023
+ "properties": {
20024
+ "provider": {
20025
+ "type": "string",
20026
+ "enum": [
20027
+ "claude",
20028
+ "codex"
20029
+ ]
20030
+ },
20031
+ "account": {
20032
+ "type": [
20033
+ "string",
20034
+ "null"
20035
+ ],
20036
+ "description": "Email or account id. Null when the login names neither."
20037
+ },
20038
+ "plan": {
20039
+ "type": [
20040
+ "string",
20041
+ "null"
20042
+ ]
20043
+ },
20044
+ "windows": {
20045
+ "type": "array",
20046
+ "items": {
20047
+ "$ref": "#/components/schemas/UsageWindow"
20048
+ }
20049
+ },
20050
+ "hosts": {
20051
+ "type": "array",
20052
+ "items": {
20053
+ "type": "string"
20054
+ },
20055
+ "description": "Names of the hosts that hold this login."
20056
+ },
20057
+ "updatedAt": {
20058
+ "type": "number"
20059
+ }
20060
+ },
20061
+ "required": [
20062
+ "provider",
20063
+ "account",
20064
+ "plan",
20065
+ "windows",
20066
+ "hosts",
20067
+ "updatedAt"
20068
+ ],
20069
+ "additionalProperties": false
20070
+ },
20071
+ "UsageWindow": {
20072
+ "type": "object",
20073
+ "properties": {
20074
+ "label": {
20075
+ "type": "string",
20076
+ "description": "Short label for the bar: `5h`, `wk`, `Fable`."
20077
+ },
20078
+ "percent": {
20079
+ "type": "number",
20080
+ "description": "Share of the window used, 0 to 100."
20081
+ },
20082
+ "resetsAt": {
20083
+ "type": [
20084
+ "number",
20085
+ "null"
20086
+ ],
20087
+ "description": "Epoch ms when the window resets, or null when the provider does not say."
20088
+ }
20089
+ },
20090
+ "required": [
20091
+ "label",
20092
+ "percent",
20093
+ "resetsAt"
20094
+ ],
20095
+ "additionalProperties": false
20096
+ },
20097
+ "AccountUsageProblem": {
20098
+ "type": "object",
20099
+ "properties": {
20100
+ "provider": {
20101
+ "type": "string",
20102
+ "enum": [
20103
+ "claude",
20104
+ "codex"
20105
+ ]
20106
+ },
20107
+ "reason": {
20108
+ "type": "string",
20109
+ "enum": [
20110
+ "error",
20111
+ "offline",
20112
+ "not-logged-in",
20113
+ "expired",
20114
+ "rate-limited"
20115
+ ]
20116
+ },
20117
+ "message": {
20118
+ "type": "string",
20119
+ "description": "A short sentence for the popover, such as \"Not logged in on contabo\"."
20120
+ },
20121
+ "hosts": {
20122
+ "type": "array",
20123
+ "items": {
20124
+ "type": "string"
19068
20125
  }
19069
20126
  }
19070
- ]
19071
- }
19072
- }
19073
- },
19074
- "components": {
19075
- "schemas": {
20127
+ },
20128
+ "required": [
20129
+ "provider",
20130
+ "reason",
20131
+ "message",
20132
+ "hosts"
20133
+ ],
20134
+ "additionalProperties": false
20135
+ },
19076
20136
  "HooksStatus": {
19077
20137
  "type": "object",
19078
20138
  "properties": {
@@ -19959,6 +21019,13 @@
19959
21019
  "type": "string",
19960
21020
  "description": "The worktree it replaced, marked superseded. Absent when a move removed it."
19961
21021
  },
21022
+ "backupRefs": {
21023
+ "type": "array",
21024
+ "items": {
21025
+ "type": "string"
21026
+ },
21027
+ "description": "Refs on the target host (`refs/band/backup/<worktree id>/<time>`) that keep what it held under\nthis name before the checkpoint replaced it. Absent when it held nothing."
21028
+ },
19962
21029
  "sourceRemoved": {
19963
21030
  "type": "boolean",
19964
21031
  "description": "For a move: whether the source worktree was removed."
@@ -20061,6 +21128,7 @@
20061
21128
  "no-checkpoint",
20062
21129
  "no-online-host",
20063
21130
  "agent-unavailable",
21131
+ "lease-active",
20064
21132
  "already-continued",
20065
21133
  "not-offline"
20066
21134
  ]
@@ -20076,6 +21144,14 @@
20076
21144
  "additionalProperties": false,
20077
21145
  "description": "Set when the work cannot continue, with a message that says why and what to do."
20078
21146
  },
21147
+ "leaseExpiresAt": {
21148
+ "type": "number",
21149
+ "description": "Epoch ms when the old host's lease ends. Until then the old copy may still be running, so the\nwork cannot continue elsewhere (`blocked.reason` is `lease-active`). The UI counts down to it."
21150
+ },
21151
+ "leaseRemainingMs": {
21152
+ "type": "number",
21153
+ "description": "The same moment as milliseconds left when the hub answered, so a client clock that is off cannot skew a countdown."
21154
+ },
20079
21155
  "checkpointId": {
20080
21156
  "type": "string"
20081
21157
  },
@@ -20565,7 +21641,8 @@
20565
21641
  "enum": [
20566
21642
  "device",
20567
21643
  "worker_bootstrap",
20568
- "worker_session"
21644
+ "worker_session",
21645
+ "device_pairing"
20569
21646
  ]
20570
21647
  },
20571
21648
  "label": {
@@ -20625,6 +21702,93 @@
20625
21702
  ],
20626
21703
  "additionalProperties": false
20627
21704
  },
21705
+ "PairingCode": {
21706
+ "type": "object",
21707
+ "properties": {
21708
+ "deviceId": {
21709
+ "type": "string"
21710
+ },
21711
+ "code": {
21712
+ "type": "string"
21713
+ },
21714
+ "expiresAt": {
21715
+ "type": "number"
21716
+ }
21717
+ },
21718
+ "required": [
21719
+ "deviceId",
21720
+ "code",
21721
+ "expiresAt"
21722
+ ],
21723
+ "additionalProperties": false
21724
+ },
21725
+ "PairingAddresses": {
21726
+ "type": "object",
21727
+ "properties": {
21728
+ "publicUrl": {
21729
+ "type": [
21730
+ "string",
21731
+ "null"
21732
+ ]
21733
+ },
21734
+ "interfaces": {
21735
+ "type": "array",
21736
+ "items": {
21737
+ "$ref": "#/components/schemas/PairingInterface"
21738
+ }
21739
+ },
21740
+ "custom": {
21741
+ "type": "array",
21742
+ "items": {
21743
+ "type": "string"
21744
+ }
21745
+ }
21746
+ },
21747
+ "required": [
21748
+ "publicUrl",
21749
+ "interfaces",
21750
+ "custom"
21751
+ ],
21752
+ "additionalProperties": false
21753
+ },
21754
+ "PairingInterface": {
21755
+ "type": "object",
21756
+ "properties": {
21757
+ "address": {
21758
+ "type": "string",
21759
+ "description": "The IP address, without brackets."
21760
+ },
21761
+ "name": {
21762
+ "type": "string",
21763
+ "description": "The interface name, such as `en0` or `tailscale0`."
21764
+ },
21765
+ "kind": {
21766
+ "type": "string",
21767
+ "enum": [
21768
+ "tailscale",
21769
+ "ipv4",
21770
+ "ipv6",
21771
+ "bridge"
21772
+ ]
21773
+ },
21774
+ "url": {
21775
+ "type": "string",
21776
+ "description": "The link base: `http://<address>:<port>`, with an IPv6 address in brackets."
21777
+ },
21778
+ "label": {
21779
+ "type": "string",
21780
+ "description": "`<address> (<ifname>)`"
21781
+ }
21782
+ },
21783
+ "required": [
21784
+ "address",
21785
+ "name",
21786
+ "kind",
21787
+ "url",
21788
+ "label"
21789
+ ],
21790
+ "additionalProperties": false
21791
+ },
20628
21792
  "VaultItemView": {
20629
21793
  "type": "object",
20630
21794
  "properties": {
@@ -20699,6 +21863,57 @@
20699
21863
  ],
20700
21864
  "additionalProperties": false
20701
21865
  },
21866
+ "VoiceStatus": {
21867
+ "type": "object",
21868
+ "properties": {
21869
+ "available": {
21870
+ "type": "boolean",
21871
+ "description": "Voice is on and complete, so the composer shows a mic."
21872
+ },
21873
+ "reason": {
21874
+ "type": "string",
21875
+ "description": "Why it is not available, for the composer tooltip."
21876
+ },
21877
+ "maxBytes": {
21878
+ "type": "number"
21879
+ },
21880
+ "maxSeconds": {
21881
+ "type": "number"
21882
+ }
21883
+ },
21884
+ "required": [
21885
+ "available",
21886
+ "maxBytes",
21887
+ "maxSeconds"
21888
+ ],
21889
+ "additionalProperties": false
21890
+ },
21891
+ "VoiceSettings": {
21892
+ "type": "object",
21893
+ "properties": {
21894
+ "enabled": {
21895
+ "type": "boolean"
21896
+ },
21897
+ "baseUrl": {
21898
+ "type": "string"
21899
+ },
21900
+ "model": {
21901
+ "type": "string"
21902
+ },
21903
+ "language": {
21904
+ "type": "string"
21905
+ },
21906
+ "hostId": {
21907
+ "type": "string",
21908
+ "description": "A host id: that worker makes the request. Unset means the hub does."
21909
+ },
21910
+ "apiKeyItemId": {
21911
+ "type": "string",
21912
+ "description": "A vault item (`api_key`) holding the key."
21913
+ }
21914
+ },
21915
+ "additionalProperties": false
21916
+ },
20702
21917
  "McpServerView": {
20703
21918
  "type": "object",
20704
21919
  "properties": {
@@ -21215,6 +22430,47 @@
21215
22430
  ],
21216
22431
  "additionalProperties": false
21217
22432
  },
22433
+ "QueuedChatMessage": {
22434
+ "type": "object",
22435
+ "properties": {
22436
+ "id": {
22437
+ "type": "string"
22438
+ },
22439
+ "text": {
22440
+ "type": "string"
22441
+ },
22442
+ "files": {
22443
+ "type": "array",
22444
+ "items": {
22445
+ "$ref": "#/components/schemas/ChatEventFile"
22446
+ }
22447
+ }
22448
+ },
22449
+ "required": [
22450
+ "id",
22451
+ "text"
22452
+ ],
22453
+ "additionalProperties": false
22454
+ },
22455
+ "ChatEventFile": {
22456
+ "type": "object",
22457
+ "properties": {
22458
+ "mediaType": {
22459
+ "type": "string"
22460
+ },
22461
+ "url": {
22462
+ "type": "string"
22463
+ },
22464
+ "filename": {
22465
+ "type": "string"
22466
+ }
22467
+ },
22468
+ "required": [
22469
+ "mediaType",
22470
+ "url"
22471
+ ],
22472
+ "additionalProperties": false
22473
+ },
21218
22474
  "ReportsSummary": {
21219
22475
  "type": "object",
21220
22476
  "properties": {
@@ -21559,6 +22815,23 @@
21559
22815
  "null"
21560
22816
  ],
21561
22817
  "description": "A one-line result, e.g. a check run's title or a commit status description."
22818
+ },
22819
+ "rerun": {
22820
+ "type": "object",
22821
+ "properties": {
22822
+ "runId": {
22823
+ "type": "string"
22824
+ },
22825
+ "jobId": {
22826
+ "type": "string"
22827
+ }
22828
+ },
22829
+ "required": [
22830
+ "runId",
22831
+ "jobId"
22832
+ ],
22833
+ "additionalProperties": false,
22834
+ "description": "Set when the forge can run this job again: the CI run it belongs to and\nits own id. Absent for checks from external apps and commit statuses."
21562
22835
  }
21563
22836
  },
21564
22837
  "required": [
@@ -21823,7 +23096,7 @@
21823
23096
  ],
21824
23097
  "additionalProperties": false
21825
23098
  },
21826
- "Settings": {
23099
+ "settings": {
21827
23100
  "type": "object",
21828
23101
  "properties": {
21829
23102
  "worktreesDir": {
@@ -21854,9 +23127,6 @@
21854
23127
  "$ref": "#/components/schemas/LabelDefinition"
21855
23128
  }
21856
23129
  },
21857
- "tokenSecret": {
21858
- "type": "string"
21859
- },
21860
23130
  "corsAllowedOrigins": {
21861
23131
  "type": "array",
21862
23132
  "items": {
@@ -21864,6 +23134,13 @@
21864
23134
  },
21865
23135
  "description": "Extra browser origins allowed to call the hub from another origin (the\nUI on a static host or another port). Same-origin, `app://local` and\n`app://h-<12 hex>` are always allowed. `file://` and `null` need an entry. `BAND_CORS_ORIGINS` and `BAND_ALLOWED_ORIGINS` (comma-separated) add to this list."
21866
23136
  },
23137
+ "pairingAddresses": {
23138
+ "type": "array",
23139
+ "items": {
23140
+ "type": "string"
23141
+ },
23142
+ "description": "Custom hub addresses Settings > Devices offers when it shows a pairing link. Written by `tokens.addPairingAddress` only."
23143
+ },
21867
23144
  "autoStartTunnel": {
21868
23145
  "type": "boolean"
21869
23146
  },
@@ -22322,6 +23599,13 @@
22322
23599
  "pinned": {
22323
23600
  "type": "boolean"
22324
23601
  },
23602
+ "sortIndex": {
23603
+ "type": "number",
23604
+ "description": "Position among siblings and inside the Pinned section. Read-only here like `origin`:\n`saveAll` keeps what the database holds, and `RepoQueries.setSortIndexes` writes them."
23605
+ },
23606
+ "pinSortIndex": {
23607
+ "type": "number"
23608
+ },
22325
23609
  "hostId": {
22326
23610
  "type": "string",
22327
23611
  "description": "Host the worktree lives on. Absent means `local`."
@@ -22370,6 +23654,32 @@
22370
23654
  ],
22371
23655
  "additionalProperties": false
22372
23656
  },
23657
+ "DirectAccess": {
23658
+ "type": "object",
23659
+ "properties": {
23660
+ "hostId": {
23661
+ "type": "string"
23662
+ },
23663
+ "port": {
23664
+ "type": "number",
23665
+ "description": "The listener's port on `127.0.0.1`."
23666
+ },
23667
+ "token": {
23668
+ "type": "string"
23669
+ },
23670
+ "expiresAt": {
23671
+ "type": "number",
23672
+ "description": "Epoch ms. The client asks for a new token before then."
23673
+ }
23674
+ },
23675
+ "required": [
23676
+ "hostId",
23677
+ "port",
23678
+ "token",
23679
+ "expiresAt"
23680
+ ],
23681
+ "additionalProperties": false
23682
+ },
22373
23683
  "WorktreeTerminalConfig": {
22374
23684
  "type": "object",
22375
23685
  "properties": {
@@ -23057,6 +24367,10 @@
23057
24367
  "additionalProperties": {
23058
24368
  "type": "string"
23059
24369
  }
24370
+ },
24371
+ "ownerHostId": {
24372
+ "type": "string",
24373
+ "description": "The worker that runs this chat and replicates it to the hub, or\nundefined when the hub runs it."
23060
24374
  }
23061
24375
  },
23062
24376
  "required": [
@@ -23070,7 +24384,8 @@
23070
24384
  "activeSessionSummary",
23071
24385
  "activeSessionLastModified",
23072
24386
  "status",
23073
- "labels"
24387
+ "labels",
24388
+ "ownerHostId"
23074
24389
  ],
23075
24390
  "additionalProperties": false
23076
24391
  },