@kosuke-ai/kosuke 1.0.25 → 1.0.27

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.
package/openapi.json CHANGED
@@ -550,7 +550,7 @@
550
550
  "/api/chat-sessions": {
551
551
  "get": {
552
552
  "operationId": "sessionsListAll",
553
- "summary": "List chat sessions across every workspace you belong to, each with its workspace, project, URL and Needs You reason. q narrows them to titles containing it, ids to the sessions it names. With needsYou, at most 100, most severe first. An agent token reads its own workspace only. Each session carries waitingForDeploy: true while it waits for the Deploy to finish, false once the Deploy ends, before its sandbox starts; goAheadSha and goAheadMerges, its go-ahead on its open pull request; and mergeRule, its Assignee's Merge rule.",
553
+ "summary": "List chat sessions across every workspace you belong to, each with its workspace, project, URL and Needs You reason. q narrows them to titles containing it, ids to the sessions it names. With needsYou, at most 100, most severe first. An agent token reads its own workspace only. Each session carries waitingForDeploy: true while it waits for the Deploy to finish, false once the Deploy ends, before its sandbox starts; goAheadSha, the head its open pull request has the go-ahead on; and mergeRule, its Assignee's Merge rule.",
554
554
  "tags": ["sessions"],
555
555
  "x-kosuke-command": ["sessions", "list"],
556
556
  "x-kosuke-variant": {
@@ -909,7 +909,7 @@
909
909
  },
910
910
  "delete": {
911
911
  "operationId": "devicesLocksDelete",
912
- "summary": "From a Chat Session: let a device go as soon as you are done with it, after QA say, rather than at the end of your Turn, and leave its line if you wait in it. The next session in line gets it at once. Your approval stays: a later mac command or devices locks create takes the device again. Answers released and leftQueue.",
912
+ "summary": "From a Chat Session: let a device go as soon as you are done with it, after QA say, rather than at the end of your Turn, and leave its line if you wait in it. The next session in line gets it at once. Your access stays: a later mac command or devices locks create takes the device again. Answers released and leftQueue.",
913
913
  "tags": ["devices"],
914
914
  "x-kosuke-command": ["devices", "locks", "delete"],
915
915
  "x-kosuke-sandbox-token": true,
@@ -961,7 +961,7 @@
961
961
  "/api/devices/{deviceId}/requests": {
962
962
  "post": {
963
963
  "operationId": "devicesRequestsCreate",
964
- "summary": "From a Chat Session: ask to use one device from devices list, with the reason the approver reads on a card in this session's chat. A personal Mac's owner approves it, a workspace device's any workspace admin, once per session: after that, asking again answers approved at once. Answers status pending or approved. Check devices list again for the answer; it expires after 30 minutes without an answer. While it is pending, go on with other work; when it is declined or expires, go on without it and say so. Once approved it stays approved for the rest of the session: pass --device-id on every mac command. One session at a time uses the device: on MAC_BUSY, wait with devices locks create, and run devices locks delete once done.",
964
+ "summary": "From a Chat Session: ask to use a personal Mac from devices list, with the reason its owner reads on a card in this session's chat. A workspace device needs no request: it answers approved at once with grantId null, and no one is asked. The owner approves a personal Mac once per session: after that, asking again answers approved at once. Answers status pending or approved. Check devices list again for the answer; it expires after 30 minutes without an answer. While it is pending, go on with other work; when it is declined or expires, go on without it and say so. Once approved it stays approved for the rest of the session: pass --device-id on every mac command. One session at a time uses the device: on MAC_BUSY, wait with devices locks create, and run devices locks delete once done.",
965
965
  "tags": ["devices"],
966
966
  "x-kosuke-command": ["devices", "requests", "create"],
967
967
  "x-kosuke-sandbox-token": true,
@@ -987,7 +987,7 @@
987
987
  "type": "string",
988
988
  "minLength": 1,
989
989
  "maxLength": 500,
990
- "description": "One or two sentences for the approver: what you test on it, and why a real Mac."
990
+ "description": "One or two sentences for the Mac’s owner: what you test on it, and why a real Mac."
991
991
  }
992
992
  },
993
993
  "required": ["reason"]
@@ -1032,7 +1032,7 @@
1032
1032
  "/api/devices/available": {
1033
1033
  "get": {
1034
1034
  "operationId": "devicesList",
1035
- "summary": "From a Chat Session: the devices it may ask for, the workspace's devices and the session member's own Macs, each with its id, kind, whether it is online, the tools it offers, its macOS grants (grants.systemEvents: menu bar icons open with `osascript` through System Events), this session's access: none, pending or approved, and occupied with occupiedBy (session or sensei) when someone else uses it now. Pick an online device with the tools the test needs: a workspace device first, and the member's own Mac only when no workspace device fits, whatever the names or past approvals. Of those, pick a free one, and ask for an occupied one only when no free device fits. Request one with `kosuke devices requests create` before any mac command, and use one only when the test truly needs a real Mac. One session at a time uses a device: on MAC_BUSY, wait in its line with `kosuke devices locks create` rather than give up or call again, and let it go with `kosuke devices locks delete` once done.",
1035
+ "summary": "From a Chat Session: the devices it may use, the workspace's devices and the session member's own Macs, each with its id, kind, whether it is online, the tools it offers, its macOS grants (grants.systemEvents: menu bar icons open with `osascript` through System Events), this session's access: none, pending or approved (a workspace device is always approved: it needs no request), and occupied with occupiedBy (session or sensei) when someone else uses it now. Pick an online device with the tools the test needs: a workspace device first, and the member's own Mac only when no workspace device fits, whatever the names or past approvals. Of those, pick a free one, and ask for an occupied one only when no free device fits. Use a workspace device at once with --device-id; request a personal Mac with `kosuke devices requests create` before any mac command on it. Use a device only when the test truly needs a real Mac. One session at a time uses a device: on MAC_BUSY, wait in its line with `kosuke devices locks create` rather than give up or call again, and let it go with `kosuke devices locks delete` once done.",
1036
1036
  "tags": ["devices"],
1037
1037
  "x-kosuke-command": ["devices", "list"],
1038
1038
  "x-kosuke-sandbox-token": true,
@@ -10467,7 +10467,7 @@
10467
10467
  "/api/projects/{projectId}/batch-merging": {
10468
10468
  "get": {
10469
10469
  "operationId": "projectsBatchMergingGet",
10470
- "summary": "Read whether the project merges ready pull requests in Batches, how many wait for one, and the Batch running now.",
10470
+ "summary": "Read the Merge agent's mode (true: Batch merging, false: the merge train), how many go-ahead pull requests wait, and the run open now.",
10471
10471
  "tags": ["projects"],
10472
10472
  "x-kosuke-command": ["projects", "batch-merging", "get"],
10473
10473
  "x-kosuke-sandbox-token": true,
@@ -10520,7 +10520,7 @@
10520
10520
  },
10521
10521
  "put": {
10522
10522
  "operationId": "projectsBatchMergingSet",
10523
- "summary": "Turn Batch Merging on or off. While it is on, a batch agent merges up to 10 ready pull requests into the Target Branch together, reviews them once and runs a short QA, then opens one pull request for a member to merge. Batches run as the member who turned it on. Refused with MERGE_COMMITS_OFF while the repository or a rule on the Target Branch allows no merge commit.",
10523
+ "summary": "Switch the Merge agent's mode. On: Batch merging, a batch agent combines go-ahead pull requests into one Batch pull request, reviews and QAs it, then an admin approves it. Off: the merge train merges them one at a time. Batches run as the member who turned it on. The next go-ahead starts a run in the new mode.",
10524
10524
  "tags": ["projects"],
10525
10525
  "x-kosuke-command": ["projects", "batch-merging", "set"],
10526
10526
  "x-kosuke-sandbox-token": true,
@@ -10547,7 +10547,7 @@
10547
10547
  "properties": {
10548
10548
  "enabled": {
10549
10549
  "type": "boolean",
10550
- "description": "True merges ready pull requests to the Target Branch in Batches; false merges them one by one again."
10550
+ "description": "True runs Batch merging; false runs the merge train, one pull request at a time."
10551
10551
  }
10552
10552
  },
10553
10553
  "required": ["enabled"]
@@ -12116,7 +12116,7 @@
12116
12116
  "/api/projects/{projectId}/chat-sessions/{sessionId}/go-ahead": {
12117
12117
  "put": {
12118
12118
  "operationId": "sessionsGoAheadSet",
12119
- "summary": "Give the session's pull request the go-ahead to merge, as the session's member, on one head: goAheadSha, goAheadBy, goAheadAt and goAheadMerges. A push to another head takes it away. With `merge`, Kosuke merges it on its own; without, it waits for whoever merges it, and Batch Merging is asked to look. Members and their Sensei only.",
12119
+ "summary": "Give the session's pull request the go-ahead to merge, as the session's member, on one head: goAheadSha, goAheadBy and goAheadAt. The project's Merge agent (the merge train, or Batch merging when it is on) is woken and merges it only at that head. Members and their Sensei only.",
12120
12120
  "tags": ["sessions"],
12121
12121
  "x-kosuke-command": ["sessions", "go-ahead", "set"],
12122
12122
  "x-kosuke-sandbox-token": true,
@@ -12155,10 +12155,6 @@
12155
12155
  "description": "The head commit the go-ahead is given on. Defaults to the head the session last read from GitHub.",
12156
12156
  "type": "string",
12157
12157
  "pattern": "^[0-9a-f]{40}$"
12158
- },
12159
- "merge": {
12160
- "description": "Kosuke merges it on its own, now or once GitHub allows. Without it the pull request is left for whoever merges it, such as the next Batch.",
12161
- "type": "boolean"
12162
12158
  }
12163
12159
  }
12164
12160
  }
@@ -14243,94 +14239,10 @@
14243
14239
  }
14244
14240
  }
14245
14241
  },
14246
- "/api/projects/{projectId}/chat-sessions/{sessionId}/pull-request/ready": {
14247
- "post": {
14248
- "operationId": "sessionsPullRequestMarkReady",
14249
- "summary": "Mark the session's draft pull request ready for review, only when its head is the sandbox's clean HEAD, its CI is green (or, with withoutChecks, no check reported) and QA passed on it. Answers `ready:` or `not ready:` in `line`. Only the session's own sandbox.",
14250
- "tags": ["sessions"],
14251
- "x-kosuke-command": ["sessions", "pull-request", "mark-ready"],
14252
- "x-kosuke-sandbox-token": true,
14253
- "parameters": [
14254
- {
14255
- "name": "projectId",
14256
- "in": "path",
14257
- "required": true,
14258
- "schema": {
14259
- "type": "string",
14260
- "format": "uuid",
14261
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
14262
- }
14263
- },
14264
- {
14265
- "name": "sessionId",
14266
- "in": "path",
14267
- "required": true,
14268
- "schema": {
14269
- "type": "string",
14270
- "format": "uuid",
14271
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
14272
- }
14273
- }
14274
- ],
14275
- "requestBody": {
14276
- "required": true,
14277
- "content": {
14278
- "application/json": {
14279
- "schema": {
14280
- "type": "object",
14281
- "properties": {
14282
- "sha": {
14283
- "description": "This checkout's HEAD, which must be the pull request's head: `git rev-parse HEAD`.",
14284
- "type": "string",
14285
- "pattern": "^[0-9a-f]{40}$"
14286
- },
14287
- "withoutChecks": {
14288
- "description": "Mark it ready although no check has reported on the head of a repository with workflow files.",
14289
- "type": "boolean"
14290
- }
14291
- }
14292
- }
14293
- }
14294
- }
14295
- },
14296
- "responses": {
14297
- "2XX": {
14298
- "description": "Success envelope",
14299
- "content": {
14300
- "application/json": {
14301
- "schema": {
14302
- "$ref": "#/components/schemas/ApiSuccess"
14303
- }
14304
- }
14305
- }
14306
- },
14307
- "4XX": {
14308
- "description": "Error envelope",
14309
- "content": {
14310
- "application/json": {
14311
- "schema": {
14312
- "$ref": "#/components/schemas/ApiError"
14313
- }
14314
- }
14315
- }
14316
- },
14317
- "5XX": {
14318
- "description": "Error envelope",
14319
- "content": {
14320
- "application/json": {
14321
- "schema": {
14322
- "$ref": "#/components/schemas/ApiError"
14323
- }
14324
- }
14325
- }
14326
- }
14327
- }
14328
- }
14329
- },
14330
14242
  "/api/projects/{projectId}/chat-sessions/{sessionId}/qa-passed": {
14331
14243
  "put": {
14332
14244
  "operationId": "sessionsQaSet",
14333
- "summary": "Record the commit QA passed on as the session's qaPassedSha: a member's override. A session token may only repeat the pass `sessions qa runs finish` recorded at that commit. A pull request is done when qaPassedSha equals its head.",
14245
+ "summary": "Record the commit QA passed on as the session's qaPassedSha: a member's override, or the session's own agent. `sessions qa runs finish` records it when the whole checklist passed. A pull request is done when qaPassedSha equals its head.",
14334
14246
  "tags": ["sessions"],
14335
14247
  "x-kosuke-command": ["sessions", "qa", "set"],
14336
14248
  "x-kosuke-sandbox-token": true,
@@ -16262,110 +16174,6 @@
16262
16174
  }
16263
16175
  }
16264
16176
  },
16265
- "/api/projects/{projectId}/chat-sessions/{sessionId}/sync": {
16266
- "post": {
16267
- "operationId": "sessionsSync",
16268
- "summary": "Merge the Target Branch, or the open pull request's base, into the session's branch on GitHub, like GitHub's Update branch, and refresh its sandbox. Without an open pull request, uses the project Target Branch, then its default branch. Starts no turn: outcome agent needs /kosuke:sync-branch; pending means GitHub accepted the merge and completion is queued. Poll statusJobId for refreshed or refresh_failed. Failed status includes recovery: retry for a transient refresh failure, observe while GitHub is unconfirmed, repair for an explicit agent repair after a confirmed merge, or stale when the branch or pull request changed. Retrying completion never requests another merge.",
16269
- "tags": ["sessions"],
16270
- "x-kosuke-command": ["sessions", "sync"],
16271
- "x-kosuke-sandbox-token": true,
16272
- "x-kosuke-cron-token": true,
16273
- "x-kosuke-sensei-token": true,
16274
- "parameters": [
16275
- {
16276
- "name": "projectId",
16277
- "in": "path",
16278
- "required": true,
16279
- "schema": {
16280
- "type": "string",
16281
- "format": "uuid",
16282
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
16283
- }
16284
- },
16285
- {
16286
- "name": "sessionId",
16287
- "in": "path",
16288
- "required": true,
16289
- "schema": {
16290
- "type": "string",
16291
- "format": "uuid",
16292
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
16293
- }
16294
- }
16295
- ],
16296
- "requestBody": {
16297
- "required": false,
16298
- "content": {
16299
- "application/json": {
16300
- "schema": {
16301
- "type": "object",
16302
- "properties": {
16303
- "completion": {
16304
- "description": "Retry only the observation and sandbox refresh returned by a previous Sync. Never requests another merge.",
16305
- "type": "object",
16306
- "properties": {
16307
- "branch": {
16308
- "type": "string",
16309
- "minLength": 1,
16310
- "maxLength": 255
16311
- },
16312
- "pullNumber": {
16313
- "type": "integer",
16314
- "exclusiveMinimum": 0,
16315
- "maximum": 9007199254740991
16316
- },
16317
- "previousHead": {
16318
- "type": "string",
16319
- "pattern": "^[0-9a-f]{40,64}$"
16320
- }
16321
- },
16322
- "required": ["branch"]
16323
- },
16324
- "statusJobId": {
16325
- "description": "Read the completion job status without requesting a merge or refresh.",
16326
- "type": "string",
16327
- "pattern": "^sync-[0-9a-f-]{36}$"
16328
- }
16329
- },
16330
- "additionalProperties": false
16331
- }
16332
- }
16333
- }
16334
- },
16335
- "responses": {
16336
- "2XX": {
16337
- "description": "Success envelope",
16338
- "content": {
16339
- "application/json": {
16340
- "schema": {
16341
- "$ref": "#/components/schemas/ApiSuccess"
16342
- }
16343
- }
16344
- }
16345
- },
16346
- "4XX": {
16347
- "description": "Error envelope",
16348
- "content": {
16349
- "application/json": {
16350
- "schema": {
16351
- "$ref": "#/components/schemas/ApiError"
16352
- }
16353
- }
16354
- }
16355
- },
16356
- "5XX": {
16357
- "description": "Error envelope",
16358
- "content": {
16359
- "application/json": {
16360
- "schema": {
16361
- "$ref": "#/components/schemas/ApiError"
16362
- }
16363
- }
16364
- }
16365
- }
16366
- }
16367
- }
16368
- },
16369
16177
  "/api/projects/{projectId}/deploy-messages": {
16370
16178
  "get": {
16371
16179
  "operationId": "deploysMessagesList",
@@ -17235,12 +17043,12 @@
17235
17043
  }
17236
17044
  }
17237
17045
  },
17238
- "/api/projects/{projectId}/preview": {
17046
+ "/api/projects/{projectId}/merge-agent": {
17239
17047
  "get": {
17240
- "operationId": "previewGet",
17241
- "summary": "Read the preview URLs of the project's main sandbox, or of one chat session's. Starts a paused or missing sandbox in the background; poll health until it is up.",
17242
- "tags": ["preview"],
17243
- "x-kosuke-command": ["preview", "get"],
17048
+ "operationId": "projectsMergeAgentGet",
17049
+ "summary": "Read the project's Merge agent: its mode (train or batch), the base and whether it has GitHub's merge queue, the go-ahead pull requests waiting with their QA and GitHub's review decision now, and the open run and earlier runs.",
17050
+ "tags": ["projects"],
17051
+ "x-kosuke-command": ["projects", "merge-agent", "get"],
17244
17052
  "x-kosuke-sandbox-token": true,
17245
17053
  "x-kosuke-cron-token": true,
17246
17054
  "x-kosuke-sensei-token": true,
@@ -17254,18 +17062,6 @@
17254
17062
  "format": "uuid",
17255
17063
  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
17256
17064
  }
17257
- },
17258
- {
17259
- "name": "sessionId",
17260
- "in": "query",
17261
- "required": false,
17262
- "description": "A chat session's preview instead of the project's main one.",
17263
- "schema": {
17264
- "description": "A chat session's preview instead of the project's main one.",
17265
- "type": "string",
17266
- "format": "uuid",
17267
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
17268
- }
17269
17065
  }
17270
17066
  ],
17271
17067
  "responses": {
@@ -17302,12 +17098,12 @@
17302
17098
  }
17303
17099
  }
17304
17100
  },
17305
- "/api/projects/{projectId}/preview/health": {
17306
- "get": {
17307
- "operationId": "previewHealthGet",
17308
- "summary": "Read the health of every service behind a preview, and whether a background start is running or failed.",
17309
- "tags": ["preview"],
17310
- "x-kosuke-command": ["preview", "health", "get"],
17101
+ "/api/projects/{projectId}/merge-agent/merges": {
17102
+ "post": {
17103
+ "operationId": "projectsMergeAgentMerge",
17104
+ "summary": "The open Merge agent run's own session only: merge a pull request into the run's base as the Kosuke GitHub App, or add it to GitHub's merge queue with --queue, only at the head its member gave the go-ahead on and GitHub holds now. Refused for any other head, base or caller.",
17105
+ "tags": ["projects"],
17106
+ "x-kosuke-command": ["projects", "merge-agent", "merge"],
17311
17107
  "x-kosuke-sandbox-token": true,
17312
17108
  "x-kosuke-cron-token": true,
17313
17109
  "x-kosuke-sensei-token": true,
@@ -17321,20 +17117,41 @@
17321
17117
  "format": "uuid",
17322
17118
  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
17323
17119
  }
17324
- },
17325
- {
17326
- "name": "sessionId",
17327
- "in": "query",
17328
- "required": false,
17329
- "description": "A chat session's preview instead of the project's main one.",
17330
- "schema": {
17331
- "description": "A chat session's preview instead of the project's main one.",
17332
- "type": "string",
17333
- "format": "uuid",
17334
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
17335
- }
17336
17120
  }
17337
17121
  ],
17122
+ "requestBody": {
17123
+ "required": true,
17124
+ "content": {
17125
+ "application/json": {
17126
+ "schema": {
17127
+ "type": "object",
17128
+ "properties": {
17129
+ "number": {
17130
+ "type": "integer",
17131
+ "exclusiveMinimum": 0,
17132
+ "maximum": 9007199254740991,
17133
+ "description": "The pull request to merge."
17134
+ },
17135
+ "sha": {
17136
+ "type": "string",
17137
+ "pattern": "^[0-9a-f]{40}$",
17138
+ "description": "The head to merge: the go-ahead head, and the head GitHub holds now."
17139
+ },
17140
+ "method": {
17141
+ "description": "How to merge. Defaults to the one the repository and its rules allow.",
17142
+ "type": "string",
17143
+ "enum": ["squash", "merge", "rebase"]
17144
+ },
17145
+ "queue": {
17146
+ "description": "Add it to the base's GitHub merge queue instead of merging it.",
17147
+ "type": "boolean"
17148
+ }
17149
+ },
17150
+ "required": ["number", "sha"]
17151
+ }
17152
+ }
17153
+ }
17154
+ },
17338
17155
  "responses": {
17339
17156
  "2XX": {
17340
17157
  "description": "Success envelope",
@@ -17369,12 +17186,12 @@
17369
17186
  }
17370
17187
  }
17371
17188
  },
17372
- "/api/projects/{projectId}/preview/reset": {
17189
+ "/api/projects/{projectId}/merge-agent/syncs": {
17373
17190
  "post": {
17374
- "operationId": "previewReset",
17375
- "summary": "Restart the services of a preview's running sandbox in place. Fails when the sandbox is paused.",
17376
- "tags": ["preview"],
17377
- "x-kosuke-command": ["preview", "reset"],
17191
+ "operationId": "projectsMergeAgentSync",
17192
+ "summary": "The open Merge agent run's own session only: bring the run's base into an open pull request's branch as the Kosuke GitHub App, as GitHub's Update branch does. A conflict is refused with GitHub's words.",
17193
+ "tags": ["projects"],
17194
+ "x-kosuke-command": ["projects", "merge-agent", "sync"],
17378
17195
  "x-kosuke-sandbox-token": true,
17379
17196
  "x-kosuke-cron-token": true,
17380
17197
  "x-kosuke-sensei-token": true,
@@ -17397,10 +17214,19 @@
17397
17214
  "schema": {
17398
17215
  "type": "object",
17399
17216
  "properties": {
17400
- "sessionId": {
17401
- "type": "string"
17217
+ "number": {
17218
+ "type": "integer",
17219
+ "exclusiveMinimum": 0,
17220
+ "maximum": 9007199254740991,
17221
+ "description": "The pull request whose branch is behind."
17222
+ },
17223
+ "sha": {
17224
+ "description": "Update only while the head is this commit. Defaults to the head GitHub holds now.",
17225
+ "type": "string",
17226
+ "pattern": "^[0-9a-f]{40}$"
17402
17227
  }
17403
- }
17228
+ },
17229
+ "required": ["number"]
17404
17230
  }
17405
17231
  }
17406
17232
  }
@@ -17439,12 +17265,216 @@
17439
17265
  }
17440
17266
  }
17441
17267
  },
17442
- "/api/projects/{projectId}/preview/share": {
17268
+ "/api/projects/{projectId}/preview": {
17443
17269
  "get": {
17444
- "operationId": "previewShareGet",
17445
- "summary": "Read the public share link of a preview, if one exists.",
17270
+ "operationId": "previewGet",
17271
+ "summary": "Read the preview URLs of the project's main sandbox, or of one chat session's. Starts a paused or missing sandbox in the background; poll health until it is up.",
17446
17272
  "tags": ["preview"],
17447
- "x-kosuke-command": ["preview", "share", "get"],
17273
+ "x-kosuke-command": ["preview", "get"],
17274
+ "x-kosuke-sandbox-token": true,
17275
+ "x-kosuke-cron-token": true,
17276
+ "x-kosuke-sensei-token": true,
17277
+ "parameters": [
17278
+ {
17279
+ "name": "projectId",
17280
+ "in": "path",
17281
+ "required": true,
17282
+ "schema": {
17283
+ "type": "string",
17284
+ "format": "uuid",
17285
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
17286
+ }
17287
+ },
17288
+ {
17289
+ "name": "sessionId",
17290
+ "in": "query",
17291
+ "required": false,
17292
+ "description": "A chat session's preview instead of the project's main one.",
17293
+ "schema": {
17294
+ "description": "A chat session's preview instead of the project's main one.",
17295
+ "type": "string",
17296
+ "format": "uuid",
17297
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
17298
+ }
17299
+ }
17300
+ ],
17301
+ "responses": {
17302
+ "2XX": {
17303
+ "description": "Success envelope",
17304
+ "content": {
17305
+ "application/json": {
17306
+ "schema": {
17307
+ "$ref": "#/components/schemas/ApiSuccess"
17308
+ }
17309
+ }
17310
+ }
17311
+ },
17312
+ "4XX": {
17313
+ "description": "Error envelope",
17314
+ "content": {
17315
+ "application/json": {
17316
+ "schema": {
17317
+ "$ref": "#/components/schemas/ApiError"
17318
+ }
17319
+ }
17320
+ }
17321
+ },
17322
+ "5XX": {
17323
+ "description": "Error envelope",
17324
+ "content": {
17325
+ "application/json": {
17326
+ "schema": {
17327
+ "$ref": "#/components/schemas/ApiError"
17328
+ }
17329
+ }
17330
+ }
17331
+ }
17332
+ }
17333
+ }
17334
+ },
17335
+ "/api/projects/{projectId}/preview/health": {
17336
+ "get": {
17337
+ "operationId": "previewHealthGet",
17338
+ "summary": "Read the health of every service behind a preview, and whether a background start is running or failed.",
17339
+ "tags": ["preview"],
17340
+ "x-kosuke-command": ["preview", "health", "get"],
17341
+ "x-kosuke-sandbox-token": true,
17342
+ "x-kosuke-cron-token": true,
17343
+ "x-kosuke-sensei-token": true,
17344
+ "parameters": [
17345
+ {
17346
+ "name": "projectId",
17347
+ "in": "path",
17348
+ "required": true,
17349
+ "schema": {
17350
+ "type": "string",
17351
+ "format": "uuid",
17352
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
17353
+ }
17354
+ },
17355
+ {
17356
+ "name": "sessionId",
17357
+ "in": "query",
17358
+ "required": false,
17359
+ "description": "A chat session's preview instead of the project's main one.",
17360
+ "schema": {
17361
+ "description": "A chat session's preview instead of the project's main one.",
17362
+ "type": "string",
17363
+ "format": "uuid",
17364
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
17365
+ }
17366
+ }
17367
+ ],
17368
+ "responses": {
17369
+ "2XX": {
17370
+ "description": "Success envelope",
17371
+ "content": {
17372
+ "application/json": {
17373
+ "schema": {
17374
+ "$ref": "#/components/schemas/ApiSuccess"
17375
+ }
17376
+ }
17377
+ }
17378
+ },
17379
+ "4XX": {
17380
+ "description": "Error envelope",
17381
+ "content": {
17382
+ "application/json": {
17383
+ "schema": {
17384
+ "$ref": "#/components/schemas/ApiError"
17385
+ }
17386
+ }
17387
+ }
17388
+ },
17389
+ "5XX": {
17390
+ "description": "Error envelope",
17391
+ "content": {
17392
+ "application/json": {
17393
+ "schema": {
17394
+ "$ref": "#/components/schemas/ApiError"
17395
+ }
17396
+ }
17397
+ }
17398
+ }
17399
+ }
17400
+ }
17401
+ },
17402
+ "/api/projects/{projectId}/preview/reset": {
17403
+ "post": {
17404
+ "operationId": "previewReset",
17405
+ "summary": "Restart the services of a preview's running sandbox in place. Fails when the sandbox is paused.",
17406
+ "tags": ["preview"],
17407
+ "x-kosuke-command": ["preview", "reset"],
17408
+ "x-kosuke-sandbox-token": true,
17409
+ "x-kosuke-cron-token": true,
17410
+ "x-kosuke-sensei-token": true,
17411
+ "parameters": [
17412
+ {
17413
+ "name": "projectId",
17414
+ "in": "path",
17415
+ "required": true,
17416
+ "schema": {
17417
+ "type": "string",
17418
+ "format": "uuid",
17419
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
17420
+ }
17421
+ }
17422
+ ],
17423
+ "requestBody": {
17424
+ "required": true,
17425
+ "content": {
17426
+ "application/json": {
17427
+ "schema": {
17428
+ "type": "object",
17429
+ "properties": {
17430
+ "sessionId": {
17431
+ "type": "string"
17432
+ }
17433
+ }
17434
+ }
17435
+ }
17436
+ }
17437
+ },
17438
+ "responses": {
17439
+ "2XX": {
17440
+ "description": "Success envelope",
17441
+ "content": {
17442
+ "application/json": {
17443
+ "schema": {
17444
+ "$ref": "#/components/schemas/ApiSuccess"
17445
+ }
17446
+ }
17447
+ }
17448
+ },
17449
+ "4XX": {
17450
+ "description": "Error envelope",
17451
+ "content": {
17452
+ "application/json": {
17453
+ "schema": {
17454
+ "$ref": "#/components/schemas/ApiError"
17455
+ }
17456
+ }
17457
+ }
17458
+ },
17459
+ "5XX": {
17460
+ "description": "Error envelope",
17461
+ "content": {
17462
+ "application/json": {
17463
+ "schema": {
17464
+ "$ref": "#/components/schemas/ApiError"
17465
+ }
17466
+ }
17467
+ }
17468
+ }
17469
+ }
17470
+ }
17471
+ },
17472
+ "/api/projects/{projectId}/preview/share": {
17473
+ "get": {
17474
+ "operationId": "previewShareGet",
17475
+ "summary": "Read the public share link of a preview, if one exists.",
17476
+ "tags": ["preview"],
17477
+ "x-kosuke-command": ["preview", "share", "get"],
17448
17478
  "x-kosuke-sandbox-token": true,
17449
17479
  "x-kosuke-cron-token": true,
17450
17480
  "x-kosuke-sensei-token": true,
@@ -20288,7 +20318,7 @@
20288
20318
  },
20289
20319
  "post": {
20290
20320
  "operationId": "senseiCardsSet",
20291
- "summary": "Open a card in your Turn's own thread, or update its open card with that key by passing the revision you read. Refused when the card moved, closed or is being sent, when your Turn stopped, when the member rejected this key in this stateKey (SKIPPED_STATE), when the session now lives in another thread (SESSION_MOVED), or when an id it names is not in the member's reach.",
20321
+ "summary": "Open a card in your Turn's own thread, or update its open card with that key by passing the revision you read. Refused when the card moved, closed or is being sent, when your Turn stopped, when the session now lives in another thread (SESSION_MOVED), or when an id it names is not in the member's reach.",
20292
20322
  "tags": ["sensei"],
20293
20323
  "x-kosuke-command": ["sensei", "cards", "set"],
20294
20324
  "x-kosuke-sandbox-token": true,
@@ -21093,58 +21123,238 @@
21093
21123
  }
21094
21124
  },
21095
21125
  "required": ["type", "rows"]
21096
- }
21097
- ]
21098
- }
21099
- },
21100
- "instruction": {
21101
- "type": "string",
21102
- "minLength": 1,
21103
- "maxLength": 60000
21104
- },
21105
- "open": {
21106
- "description": "The page the primary button opens in place of an instruction, such as the link a teammate's message shares. The verb is the button's label (\"Open\", \"Read\"), and the tap opens the page, closes the card and sends nothing to Sensei. It takes a verb and an outcome, and no instruction, clarification block, Deploy form, action or covers; a Memory, integration or messages card cannot open a link.",
21107
- "type": "object",
21108
- "properties": {
21109
- "href": {
21110
- "type": "string",
21111
- "maxLength": 2000
21112
- }
21113
- },
21114
- "required": ["href"],
21115
- "additionalProperties": false
21116
- },
21117
- "verb": {
21118
- "type": "string",
21119
- "minLength": 1,
21120
- "maxLength": 32
21121
- },
21122
- "negativeLabel": {
21123
- "description": "The negative button's label: free text of 1 to 20 characters once trimmed, in any words that say what the member's no does, such as \"Reject\", \"Skip\", \"Dismiss\" or \"Not now\"; those are examples, not a list to pick from. Omit it for \"Reject\" on a card with a verb and \"Dismiss\" on one without. Set it when the default misdescribes the no. The tap always skips the card and sends nothing.",
21124
- "type": "string",
21125
- "minLength": 1,
21126
- "maxLength": 20
21127
- },
21128
- "negativeTone": {
21129
- "description": "How the negative button reads, set apart from its label: destructive (red) for a no that turns something down, neutral for one that only sets the card aside. Omit it for destructive on a card with a verb and neutral on one without.",
21130
- "type": "string",
21131
- "enum": ["neutral", "destructive"]
21132
- },
21133
- "request": {
21134
- "type": "string",
21135
- "minLength": 1,
21136
- "maxLength": 300
21137
- },
21138
- "outcome": {
21139
- "type": "string",
21140
- "minLength": 1,
21141
- "maxLength": 300
21142
- },
21143
- "instructionKind": {
21144
- "type": "string",
21145
- "enum": ["session", "sensei", "ticket", "guide"]
21146
- },
21147
- "proposedBy": {
21126
+ },
21127
+ {
21128
+ "type": "object",
21129
+ "properties": {
21130
+ "type": {
21131
+ "type": "string",
21132
+ "const": "person"
21133
+ },
21134
+ "heading": {
21135
+ "type": "string",
21136
+ "minLength": 1,
21137
+ "maxLength": 80
21138
+ },
21139
+ "name": {
21140
+ "type": "string",
21141
+ "minLength": 1,
21142
+ "maxLength": 80
21143
+ },
21144
+ "line": {
21145
+ "type": "string",
21146
+ "minLength": 1,
21147
+ "maxLength": 500
21148
+ }
21149
+ },
21150
+ "required": ["type", "name"]
21151
+ },
21152
+ {
21153
+ "type": "object",
21154
+ "properties": {
21155
+ "type": {
21156
+ "type": "string",
21157
+ "const": "image"
21158
+ },
21159
+ "sessionId": {
21160
+ "type": "string",
21161
+ "format": "uuid",
21162
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
21163
+ },
21164
+ "cronId": {
21165
+ "type": "string",
21166
+ "format": "uuid",
21167
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
21168
+ },
21169
+ "runId": {
21170
+ "type": "string",
21171
+ "format": "uuid",
21172
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
21173
+ },
21174
+ "fileId": {
21175
+ "type": "string",
21176
+ "format": "uuid",
21177
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
21178
+ },
21179
+ "version": {
21180
+ "type": "integer",
21181
+ "exclusiveMinimum": 0,
21182
+ "maximum": 9007199254740991
21183
+ },
21184
+ "slug": {
21185
+ "type": "string",
21186
+ "minLength": 1,
21187
+ "maxLength": 80
21188
+ },
21189
+ "caption": {
21190
+ "type": "string",
21191
+ "minLength": 1,
21192
+ "maxLength": 80
21193
+ },
21194
+ "heading": {
21195
+ "type": "string",
21196
+ "minLength": 1,
21197
+ "maxLength": 80
21198
+ }
21199
+ },
21200
+ "required": ["type"]
21201
+ },
21202
+ {
21203
+ "type": "object",
21204
+ "properties": {
21205
+ "type": {
21206
+ "type": "string",
21207
+ "const": "event"
21208
+ },
21209
+ "title": {
21210
+ "type": "string",
21211
+ "minLength": 1,
21212
+ "maxLength": 80
21213
+ },
21214
+ "start": {
21215
+ "type": "string",
21216
+ "format": "date-time",
21217
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
21218
+ },
21219
+ "end": {
21220
+ "type": "string",
21221
+ "format": "date-time",
21222
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
21223
+ },
21224
+ "timeZone": {
21225
+ "type": "string",
21226
+ "minLength": 1,
21227
+ "maxLength": 64
21228
+ },
21229
+ "notes": {
21230
+ "maxItems": 4,
21231
+ "type": "array",
21232
+ "items": {
21233
+ "type": "object",
21234
+ "properties": {
21235
+ "state": {
21236
+ "type": "string",
21237
+ "enum": ["passed", "failed", "waiting", "info"]
21238
+ },
21239
+ "text": {
21240
+ "type": "string",
21241
+ "minLength": 1,
21242
+ "maxLength": 300
21243
+ }
21244
+ },
21245
+ "required": ["state", "text"]
21246
+ }
21247
+ }
21248
+ },
21249
+ "required": ["type", "start"]
21250
+ },
21251
+ {
21252
+ "type": "object",
21253
+ "properties": {
21254
+ "type": {
21255
+ "type": "string",
21256
+ "const": "ticket"
21257
+ },
21258
+ "title": {
21259
+ "type": "string",
21260
+ "minLength": 1,
21261
+ "maxLength": 500
21262
+ },
21263
+ "project": {
21264
+ "type": "string",
21265
+ "minLength": 1,
21266
+ "maxLength": 80
21267
+ },
21268
+ "line": {
21269
+ "type": "string",
21270
+ "minLength": 1,
21271
+ "maxLength": 500
21272
+ }
21273
+ },
21274
+ "required": ["type", "title"]
21275
+ }
21276
+ ]
21277
+ }
21278
+ },
21279
+ "instruction": {
21280
+ "type": "string",
21281
+ "minLength": 1,
21282
+ "maxLength": 60000
21283
+ },
21284
+ "open": {
21285
+ "description": "The page the primary button opens in place of an instruction, such as the link a teammate's message shares. The verb is the button's label (\"Open\", \"Read\"), and the tap opens the page, closes the card and sends nothing to Sensei. It takes a verb and an outcome, and no instruction, clarification block, Deploy form, action or covers.",
21286
+ "type": "object",
21287
+ "properties": {
21288
+ "href": {
21289
+ "type": "string",
21290
+ "maxLength": 2000
21291
+ }
21292
+ },
21293
+ "required": ["href"],
21294
+ "additionalProperties": false
21295
+ },
21296
+ "verb": {
21297
+ "type": "string",
21298
+ "minLength": 1,
21299
+ "maxLength": 32
21300
+ },
21301
+ "actions": {
21302
+ "description": "The card's buttons beside Reply and the negative button, 1 to 3 with the verb counted among them: each a label of 24 characters at most, the prompt its tap sends to Sensei in this thread as the member's message, exactly as written and shown under the button, and a tone: primary (the filled button a swipe right taps, one at most, and none beside a verb, which is the primary), default, or destructive.",
21303
+ "minItems": 1,
21304
+ "maxItems": 3,
21305
+ "type": "array",
21306
+ "items": {
21307
+ "type": "object",
21308
+ "properties": {
21309
+ "label": {
21310
+ "type": "string",
21311
+ "minLength": 1,
21312
+ "maxLength": 32
21313
+ },
21314
+ "prompt": {
21315
+ "type": "string",
21316
+ "minLength": 1,
21317
+ "maxLength": 60000
21318
+ },
21319
+ "tone": {
21320
+ "type": "string",
21321
+ "enum": ["primary", "default", "destructive"]
21322
+ }
21323
+ },
21324
+ "required": ["label", "prompt"]
21325
+ }
21326
+ },
21327
+ "urgency": {
21328
+ "description": "Whether the card notifies the member's devices: now sends a push notification, later waits in its thread with none. Omit it for now.",
21329
+ "type": "string",
21330
+ "enum": ["now", "later"]
21331
+ },
21332
+ "negativeLabel": {
21333
+ "description": "The negative button's label: free text of 1 to 20 characters once trimmed, in any words that say what the member's no does, such as \"Reject\", \"Skip\", \"Dismiss\" or \"Not now\"; those are examples, not a list to pick from. Omit it for \"Reject\" on a card with a verb and \"Dismiss\" on one without. Set it when the default misdescribes the no. The tap always skips the card and sends nothing.",
21334
+ "type": "string",
21335
+ "minLength": 1,
21336
+ "maxLength": 20
21337
+ },
21338
+ "negativeTone": {
21339
+ "description": "How the negative button reads, set apart from its label: destructive (red) for a no that turns something down, neutral for one that only sets the card aside. Omit it for destructive on a card with a verb and neutral on one without.",
21340
+ "type": "string",
21341
+ "enum": ["neutral", "destructive"]
21342
+ },
21343
+ "request": {
21344
+ "type": "string",
21345
+ "minLength": 1,
21346
+ "maxLength": 300
21347
+ },
21348
+ "outcome": {
21349
+ "type": "string",
21350
+ "minLength": 1,
21351
+ "maxLength": 300
21352
+ },
21353
+ "instructionKind": {
21354
+ "type": "string",
21355
+ "enum": ["session", "sensei", "ticket", "guide"]
21356
+ },
21357
+ "proposedBy": {
21148
21358
  "anyOf": [
21149
21359
  {
21150
21360
  "type": "object",
@@ -21631,7 +21841,7 @@
21631
21841
  ]
21632
21842
  },
21633
21843
  "covers": {
21634
- "description": "The ids of the incoming_message events of this thread that this card answers. Only a reply, the FYI, or a task or calendar card with its instruction and verb covers. Every card an Event Turn writes in a message thread names them: a reply covers the message it answers, a task or calendar card the message in its evidence, an FYI the event of every row, and of each message among this Turn’s events that it only counts. An FYI update keeps unread commitments and the events in its current evidence, discarding processed history; name at most 50 events per write. The open FYI keeps a reference to every message it has covered, which its Mark read marks, and its card read gives their count and the newest. An incoming event no card covers is read again later.",
21844
+ "description": "The ids of the incoming_message events of this thread that this card answers. Every card an Event Turn writes in a message thread names them: a reply covers the message it answers, a task or calendar card the message in its evidence, an FYI the event of every row, and of each message among this Turn’s events that it only counts. An FYI update keeps unread commitments and the events in its current evidence, discarding processed history; name at most 50 events per write. The open FYI keeps a reference to every message it has covered, which its Mark read marks, and its card read gives their count and the newest. An incoming event no card covers is read again later.",
21635
21845
  "minItems": 1,
21636
21846
  "maxItems": 50,
21637
21847
  "type": "array",
@@ -22627,7 +22837,7 @@
22627
22837
  },
22628
22838
  "put": {
22629
22839
  "operationId": "senseiMemorySet",
22630
- "summary": "Save a Memory file at the revision you read. Sensei must name the card approved to start this Turn.",
22840
+ "summary": "Save a Memory file at the revision you read. Refused with 409 when it changed since.",
22631
22841
  "tags": ["sensei"],
22632
22842
  "x-kosuke-command": ["sensei", "memory", "set"],
22633
22843
  "x-kosuke-sensei-token": true,
@@ -22654,7 +22864,7 @@
22654
22864
  "enum": ["general.md"]
22655
22865
  },
22656
22866
  "cardId": {
22657
- "description": "The Memory card the member approved to start this Turn.",
22867
+ "description": "The Memory card this write answers, if any. Kosuke reads nothing from it.",
22658
22868
  "type": "string",
22659
22869
  "format": "uuid",
22660
22870
  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
@@ -22699,73 +22909,6 @@
22699
22909
  }
22700
22910
  }
22701
22911
  },
22702
- "/api/sensei/merge": {
22703
- "post": {
22704
- "operationId": "senseiMerge",
22705
- "summary": "Merge the pull request of any Chat Session in a workspace you belong to, as you on GitHub, whenever GitHub allows it: added to GitHub's merge queue where the base has one, updated first where GitHub requires an up-to-date branch, merged otherwise, pinned to the head read. GitHub alone decides: Kosuke adds no hold of its own on approvals, reviews, checks or a working session. Asking is your go-ahead, recorded on the session for its member on the head read with Kosuke merging it, so it merges later when GitHub refuses now. A push to another head takes it away. Answers the outcome, the head it decided on and why. Refused with the reason unless you have GitHub connected and the head is still `headSha` when given, and with GitHub's own reason when GitHub refuses the merge.",
22706
- "tags": ["sensei"],
22707
- "x-kosuke-command": ["sensei", "merge"],
22708
- "x-kosuke-sandbox-token": true,
22709
- "x-kosuke-cron-token": true,
22710
- "x-kosuke-sensei-token": true,
22711
- "requestBody": {
22712
- "required": true,
22713
- "content": {
22714
- "application/json": {
22715
- "schema": {
22716
- "type": "object",
22717
- "properties": {
22718
- "sessionId": {
22719
- "type": "string",
22720
- "format": "uuid",
22721
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
22722
- "description": "The Chat Session whose pull request to merge, in any workspace you belong to."
22723
- },
22724
- "headSha": {
22725
- "description": "The head commit you decided on. Nothing is written when the pull request has moved past it.",
22726
- "type": "string",
22727
- "pattern": "^[0-9a-f]{40}$"
22728
- }
22729
- },
22730
- "required": ["sessionId"]
22731
- }
22732
- }
22733
- }
22734
- },
22735
- "responses": {
22736
- "2XX": {
22737
- "description": "Success envelope",
22738
- "content": {
22739
- "application/json": {
22740
- "schema": {
22741
- "$ref": "#/components/schemas/ApiSuccess"
22742
- }
22743
- }
22744
- }
22745
- },
22746
- "4XX": {
22747
- "description": "Error envelope",
22748
- "content": {
22749
- "application/json": {
22750
- "schema": {
22751
- "$ref": "#/components/schemas/ApiError"
22752
- }
22753
- }
22754
- }
22755
- },
22756
- "5XX": {
22757
- "description": "Error envelope",
22758
- "content": {
22759
- "application/json": {
22760
- "schema": {
22761
- "$ref": "#/components/schemas/ApiError"
22762
- }
22763
- }
22764
- }
22765
- }
22766
- }
22767
- }
22768
- },
22769
22912
  "/api/sensei/merge-rule": {
22770
22913
  "put": {
22771
22914
  "operationId": "senseiMergeRuleSet",
@@ -22993,49 +23136,6 @@
22993
23136
  }
22994
23137
  }
22995
23138
  },
22996
- "/api/sensei/reels/ranks": {
22997
- "get": {
22998
- "operationId": "senseiReelsRanksList",
22999
- "summary": "Read Jev ranks for your open Sensei Cards, valid only at each card revision.",
23000
- "tags": ["sensei"],
23001
- "x-kosuke-command": ["sensei", "reels", "ranks", "list"],
23002
- "x-kosuke-sandbox-token": true,
23003
- "x-kosuke-cron-token": true,
23004
- "x-kosuke-sensei-token": true,
23005
- "responses": {
23006
- "2XX": {
23007
- "description": "Success envelope",
23008
- "content": {
23009
- "application/json": {
23010
- "schema": {
23011
- "$ref": "#/components/schemas/ApiSuccess"
23012
- }
23013
- }
23014
- }
23015
- },
23016
- "4XX": {
23017
- "description": "Error envelope",
23018
- "content": {
23019
- "application/json": {
23020
- "schema": {
23021
- "$ref": "#/components/schemas/ApiError"
23022
- }
23023
- }
23024
- }
23025
- },
23026
- "5XX": {
23027
- "description": "Error envelope",
23028
- "content": {
23029
- "application/json": {
23030
- "schema": {
23031
- "$ref": "#/components/schemas/ApiError"
23032
- }
23033
- }
23034
- }
23035
- }
23036
- }
23037
- }
23038
- },
23039
23139
  "/api/sensei/repository": {
23040
23140
  "post": {
23041
23141
  "operationId": "senseiRepositoryCardsCreate",
@@ -23103,150 +23203,6 @@
23103
23203
  }
23104
23204
  }
23105
23205
  },
23106
- "/api/sensei/review/approve": {
23107
- "post": {
23108
- "operationId": "senseiReviewApprovalsCreate",
23109
- "summary": "Approve the pull request of a Chat Session as you on GitHub, pinned to headSha: the approval is of that commit. Refused with 409 HEAD_MOVED, naming the new head, when the pull request moved past headSha, with NO_PULL_REQUEST when the session has no open pull request, and with GITHUB_REFUSED and GitHub’s own words when GitHub says no, such as for your own pull request or without GitHub connected in Kosuke.",
23110
- "tags": ["sensei"],
23111
- "x-kosuke-command": ["sensei", "review", "approvals", "create"],
23112
- "x-kosuke-sandbox-token": true,
23113
- "x-kosuke-cron-token": true,
23114
- "x-kosuke-sensei-token": true,
23115
- "requestBody": {
23116
- "required": true,
23117
- "content": {
23118
- "application/json": {
23119
- "schema": {
23120
- "type": "object",
23121
- "properties": {
23122
- "sessionId": {
23123
- "type": "string",
23124
- "format": "uuid",
23125
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
23126
- "description": "The Chat Session whose pull request to approve, in any workspace you belong to."
23127
- },
23128
- "headSha": {
23129
- "type": "string",
23130
- "pattern": "^[0-9a-f]{40}$",
23131
- "description": "The head commit you read and approve. Nothing is approved when the pull request moved past it."
23132
- }
23133
- },
23134
- "required": ["sessionId", "headSha"]
23135
- }
23136
- }
23137
- }
23138
- },
23139
- "responses": {
23140
- "2XX": {
23141
- "description": "Success envelope",
23142
- "content": {
23143
- "application/json": {
23144
- "schema": {
23145
- "$ref": "#/components/schemas/ApiSuccess"
23146
- }
23147
- }
23148
- }
23149
- },
23150
- "4XX": {
23151
- "description": "Error envelope",
23152
- "content": {
23153
- "application/json": {
23154
- "schema": {
23155
- "$ref": "#/components/schemas/ApiError"
23156
- }
23157
- }
23158
- }
23159
- },
23160
- "5XX": {
23161
- "description": "Error envelope",
23162
- "content": {
23163
- "application/json": {
23164
- "schema": {
23165
- "$ref": "#/components/schemas/ApiError"
23166
- }
23167
- }
23168
- }
23169
- }
23170
- }
23171
- }
23172
- },
23173
- "/api/sensei/review/ask": {
23174
- "post": {
23175
- "operationId": "senseiReviewRequestsCreate",
23176
- "summary": "Ask members to review the pull request of a Chat Session you are the Assignee of, as you on GitHub, and record who was asked for the merge to count. With again, ask again everyone asked before and whoever requested changes since. A member who never connected GitHub, or whom GitHub refuses, is left out and named; it is refused when nobody could be asked, with 400 when you name yourself, nobody, or there is nobody to ask again, with 403 when you are not the Assignee, and with 409 NO_PULL_REQUEST or GITHUB_REFUSED.",
23177
- "tags": ["sensei"],
23178
- "x-kosuke-command": ["sensei", "review", "requests", "create"],
23179
- "x-kosuke-sandbox-token": true,
23180
- "x-kosuke-cron-token": true,
23181
- "x-kosuke-sensei-token": true,
23182
- "requestBody": {
23183
- "required": true,
23184
- "content": {
23185
- "application/json": {
23186
- "schema": {
23187
- "type": "object",
23188
- "properties": {
23189
- "sessionId": {
23190
- "type": "string",
23191
- "format": "uuid",
23192
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
23193
- "description": "The Chat Session whose pull request to ask a review of. You are its Assignee."
23194
- },
23195
- "reviewers": {
23196
- "default": [],
23197
- "description": "The members to ask, by the id `kosuke workspaces members list` prints. Left out with again.",
23198
- "maxItems": 15,
23199
- "type": "array",
23200
- "items": {
23201
- "type": "string",
23202
- "minLength": 1
23203
- }
23204
- },
23205
- "again": {
23206
- "default": false,
23207
- "description": "Ask again everyone asked before, and whoever requested changes since: after the session answered their review.",
23208
- "type": "boolean"
23209
- }
23210
- },
23211
- "required": ["sessionId"]
23212
- }
23213
- }
23214
- }
23215
- },
23216
- "responses": {
23217
- "2XX": {
23218
- "description": "Success envelope",
23219
- "content": {
23220
- "application/json": {
23221
- "schema": {
23222
- "$ref": "#/components/schemas/ApiSuccess"
23223
- }
23224
- }
23225
- }
23226
- },
23227
- "4XX": {
23228
- "description": "Error envelope",
23229
- "content": {
23230
- "application/json": {
23231
- "schema": {
23232
- "$ref": "#/components/schemas/ApiError"
23233
- }
23234
- }
23235
- }
23236
- },
23237
- "5XX": {
23238
- "description": "Error envelope",
23239
- "content": {
23240
- "application/json": {
23241
- "schema": {
23242
- "$ref": "#/components/schemas/ApiError"
23243
- }
23244
- }
23245
- }
23246
- }
23247
- }
23248
- }
23249
- },
23250
23206
  "/api/sensei/review/context": {
23251
23207
  "get": {
23252
23208
  "operationId": "senseiReviewContextGet",