@shipeasy/openapi 3.1.0 → 3.3.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 (45) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-V4ZESAIF.js → chunk-75Z4SQOM.js} +141 -1
  3. package/dist/chunk-75Z4SQOM.js.map +1 -0
  4. package/dist/{chunk-UV333BIK.js → chunk-ZYK74ZIW.js} +569 -119
  5. package/dist/chunk-ZYK74ZIW.js.map +1 -0
  6. package/dist/{client-yqGYju-M.d.ts → client-DAGqRpF1.d.ts} +2209 -401
  7. package/dist/client.d.ts +1 -1
  8. package/dist/client.js +33 -1
  9. package/dist/custom.d.ts +5 -5
  10. package/dist/custom.js +128 -84
  11. package/dist/custom.js.map +1 -1
  12. package/dist/index.d.ts +2 -2
  13. package/dist/index.js +34 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/schemas.d.ts +2007 -891
  16. package/dist/schemas.js +179 -1
  17. package/openapi-sdk.json +1769 -0
  18. package/openapi.json +5861 -2597
  19. package/openapi.yaml +2739 -452
  20. package/package.json +6 -4
  21. package/spec/components/responses.yaml +39 -0
  22. package/spec/components/schemas/alert-rules.yaml +405 -7
  23. package/spec/components/schemas/alerts.yaml +9 -7
  24. package/spec/components/schemas/common.yaml +2 -2
  25. package/spec/components/schemas/connectors.yaml +69 -6
  26. package/spec/components/schemas/events.yaml +20 -9
  27. package/spec/components/schemas/gates.yaml +87 -0
  28. package/spec/components/schemas/keys.yaml +32 -2
  29. package/spec/components/schemas/killswitches.yaml +64 -0
  30. package/spec/components/schemas/metrics.yaml +131 -251
  31. package/spec/components/schemas/ops.yaml +555 -22
  32. package/spec/components/schemas/projects.yaml +18 -0
  33. package/spec/components/schemas/tags.yaml +91 -0
  34. package/spec/openapi-sdk.yaml +86 -0
  35. package/spec/openapi.yaml +61 -0
  36. package/spec/paths/alerts.yaml +5 -3
  37. package/spec/paths/gates.yaml +282 -0
  38. package/spec/paths/i18n.yaml +2 -1
  39. package/spec/paths/keys.yaml +79 -0
  40. package/spec/paths/killswitches.yaml +96 -0
  41. package/spec/paths/metrics.yaml +26 -17
  42. package/spec/paths/ops.yaml +566 -10
  43. package/spec/paths/tags.yaml +270 -0
  44. package/dist/chunk-UV333BIK.js.map +0 -1
  45. package/dist/chunk-V4ZESAIF.js.map +0 -1
@@ -416,7 +416,7 @@ OpsItemContext:
416
416
  properties:
417
417
  t:
418
418
  type: number
419
- description: Bucket start — unix epoch **milliseconds** (hourly buckets).
419
+ description: Bucket start — unix epoch **milliseconds**. Bucket width scales with the window (hourly up to ~5 days, coarser beyond).
420
420
  v:
421
421
  type: number
422
422
  description: Occurrence count in the bucket (sample-rate weighted).
@@ -424,11 +424,11 @@ OpsItemContext:
424
424
  - t
425
425
  - v
426
426
  additionalProperties: {}
427
- description: One hourly occurrence bucket.
428
- description: Hourly occurrence buckets, oldest first. Hours with no occurrences are omitted.
427
+ description: One occurrence bucket.
428
+ description: Occurrence buckets, oldest first. Buckets with no occurrences are omitted.
429
429
  domainFrom:
430
430
  type: number
431
- description: Chart domain start — unix epoch milliseconds (24h before the read).
431
+ description: Chart domain start — unix epoch milliseconds (the window's start).
432
432
  domainTo:
433
433
  type: number
434
434
  description: Chart domain end — unix epoch milliseconds (the read time).
@@ -437,7 +437,7 @@ OpsItemContext:
437
437
  - domainFrom
438
438
  - domainTo
439
439
  additionalProperties: {}
440
- description: "Occurrence timeline for an `error` ticket — hourly buckets over the last 24h from the sampled occurrences, hydrated at read time by the single-item read only. ABSENT (not `null`) on non-error tickets, on list rows (raw context), and when no occurrence landed in the window."
440
+ description: "Occurrence timeline for an `error` ticket — buckets over the project's error auto-close window (Settings → Errors: `errorAutocloseDays`, 7 days when auto-close is off, capped at 30) from the sampled occurrences, hydrated at read time by the single-item read only. Plotting exactly the quiet window that auto-resolves the error is what makes an empty right-hand edge meaningful. ABSENT (not `null`) on non-error tickets, on list rows (raw context), and when no occurrence landed in the window."
441
441
  additionalProperties: {}
442
442
  description: "Per-type capture context on a queue item. Exactly one of `browser` (bug/feature), `error`, `alert`, or `measurePlan` is populated depending on `type`; other keys (e.g. the AI dedupe block on bugs) may also be present."
443
443
  OpsBrowserContext:
@@ -548,20 +548,31 @@ OpsAlertContext:
548
548
  type: string
549
549
  enum:
550
550
  - metric_rule
551
+ - killswitch_armed
551
552
  - experiment_srm
552
553
  - experiment_peek
553
554
  - guardrail
554
- description: What kind of alert transitioned to active.
555
+ description: What kind of condition opened this alert instance.
555
556
  dedupeKey:
556
557
  type: string
557
558
  description: Stable per-condition key; with `source` forms the ticket's `sourceRef`.
559
+ detail:
560
+ anyOf:
561
+ - type: string
562
+ - type: "null"
563
+ description: The instance's one-line reading — the observed condition in words.
564
+ ruleId:
565
+ anyOf:
566
+ - type: string
567
+ - type: "null"
568
+ description: Id of the alert rule that opened this instance, or `null` for a built-in condition.
558
569
  severity:
559
570
  type: string
560
571
  enum:
561
572
  - danger
562
573
  - warn
563
574
  - info
564
- description: Alert severity.
575
+ description: "How loud the alert is. Severity belongs to the RULE and is carried by this ticket as `priority`; it is DERIVED from that on the hydrated single-item read, and absent from the raw stored context list rows return."
565
576
  observedValue:
566
577
  anyOf:
567
578
  - type: number
@@ -580,7 +591,7 @@ OpsAlertContext:
580
591
  - resolved
581
592
  - dismissed
582
593
  - type: "null"
583
- description: "Current status of the underlying alert (`active` while the condition holds), or `null` if the alert row is gone."
594
+ description: "Firing state of this instance, projected from the ticket's own status (`active` while it is open, i.e. while the condition holds). Absent from the raw stored context list rows return."
584
595
  activeSince:
585
596
  anyOf:
586
597
  - type: string
@@ -604,9 +615,8 @@ OpsAlertContext:
604
615
  required:
605
616
  - source
606
617
  - dedupeKey
607
- - severity
608
618
  additionalProperties: {}
609
- description: "Hydrated detail for an auto-filed `alert` ticket, resolving the rule → metric → event chain at request time."
619
+ description: "Detail for an `alert` ticket — the fired-alert INSTANCE this ticket is. List rows carry the stored capture subset (`source`, `dedupeKey`, `ruleId`, `detail`, `href`, `observedValue`); the single-item read hydrates the rest, resolving `severity`/`status` off the ticket itself and the rule → metric → event chain at request time."
610
620
  OpsAlertRuleSummary:
611
621
  type: object
612
622
  properties:
@@ -855,6 +865,33 @@ GithubPrLink:
855
865
  - closes
856
866
  - comment
857
867
  description: How the PR was connected to the issue.
868
+ owner:
869
+ type: string
870
+ description: >-
871
+ Repository owner (org or user) the pull request lives in. Absent on
872
+ links recorded before the field existed — `url` still carries it.
873
+ repo:
874
+ type: string
875
+ description: >-
876
+ Repository name the pull request lives in. Absent on links recorded
877
+ before the field existed — `url` still carries it.
878
+ state:
879
+ type: string
880
+ enum:
881
+ - open
882
+ - merged
883
+ - closed
884
+ description: >-
885
+ Outcome of the pull request on GitHub, kept current by the
886
+ `pull_request` webhook. `merged` and `closed` (closed WITHOUT merging,
887
+ i.e. rejected) are terminal. Absent means the outcome has never been
888
+ observed — treat it as `open`.
889
+ mergedAt:
890
+ type: string
891
+ description: ISO-8601 timestamp the pull request merged, when `state` is `merged`.
892
+ closedAt:
893
+ type: string
894
+ description: ISO-8601 timestamp the pull request closed unmerged, when `state` is `closed`.
858
895
  required:
859
896
  - number
860
897
  - url
@@ -934,10 +971,15 @@ CreateBugRequest:
934
971
  description: Emails of teammates to subscribe to this item's Slack pings at creation.
935
972
  tags:
936
973
  type: array
974
+ maxItems: 50
937
975
  items:
938
- type: string
976
+ $ref: ./tags.yaml#/TagName
939
977
  default: []
940
- description: Tag names to attach at creation (get-or-created by name, deduped case-insensitively).
978
+ description: >-
979
+ Tag names to label the item with, e.g. `["ios", "checkout"]`. Each name
980
+ is matched case-insensitively against the project's existing tags and
981
+ reuses that tag (keeping its stored casing) when one matches; a name with
982
+ no match creates a new project tag.
941
983
  reporterEmail:
942
984
  anyOf:
943
985
  - type: string
@@ -1025,10 +1067,15 @@ CreateFeatureRequestRequest:
1025
1067
  description: Emails of teammates to subscribe to this item's Slack pings at creation.
1026
1068
  tags:
1027
1069
  type: array
1070
+ maxItems: 50
1028
1071
  items:
1029
- type: string
1072
+ $ref: ./tags.yaml#/TagName
1030
1073
  default: []
1031
- description: Tag names to attach at creation (get-or-created by name, deduped case-insensitively).
1074
+ description: >-
1075
+ Tag names to label the item with, e.g. `["ios", "checkout"]`. Each name
1076
+ is matched case-insensitively against the project's existing tags and
1077
+ reuses that tag (keeping its stored casing) when one matches; a name with
1078
+ no match creates a new project tag.
1032
1079
  reporterEmail:
1033
1080
  anyOf:
1034
1081
  - type: string
@@ -1063,6 +1110,212 @@ CreateFeatureRequestRequest:
1063
1110
  - title
1064
1111
  additionalProperties: false
1065
1112
  description: "Feature-request-kind fields for `POST /api/admin/ops` (sent with `type: feature_request`)."
1113
+ CreatePublicBugRequest:
1114
+ type: object
1115
+ properties:
1116
+ title:
1117
+ type: string
1118
+ minLength: 1
1119
+ maxLength: 200
1120
+ pattern: '^\S(.*\S)?$'
1121
+ description: One-line bug title (no leading/trailing whitespace).
1122
+ stepsToReproduce:
1123
+ type: string
1124
+ maxLength: 8000
1125
+ default: ""
1126
+ description: How to reproduce the bug.
1127
+ actualResult:
1128
+ type: string
1129
+ maxLength: 8000
1130
+ default: ""
1131
+ description: What actually happened.
1132
+ expectedResult:
1133
+ type: string
1134
+ maxLength: 8000
1135
+ default: ""
1136
+ description: What was expected instead.
1137
+ priority:
1138
+ anyOf:
1139
+ - $ref: "#/OpsItemPriority"
1140
+ - type: "null"
1141
+ description: Initial triage priority, or `null`.
1142
+ status:
1143
+ anyOf:
1144
+ - $ref: "#/OpsItemStatus"
1145
+ description: Initial lifecycle status; defaults to `open` when omitted.
1146
+ assigneeId:
1147
+ anyOf:
1148
+ - type: string
1149
+ - type: "null"
1150
+ description: The `users.id` of the person to assign as owner at creation, or `null`.
1151
+ subscribers:
1152
+ type: array
1153
+ items:
1154
+ type: string
1155
+ format: email
1156
+ default: []
1157
+ description: Emails of teammates to subscribe to this item's Slack pings at creation.
1158
+ tags:
1159
+ type: array
1160
+ maxItems: 50
1161
+ items:
1162
+ $ref: ./tags.yaml#/TagName
1163
+ default: []
1164
+ description: >-
1165
+ Tag names to label the item with, e.g. `["ios", "checkout"]`. Each name
1166
+ is matched case-insensitively against the project's existing tags and
1167
+ reuses that tag (keeping its stored casing) when one matches; a name with
1168
+ no match creates a new project tag. Here the tags only label the
1169
+ ticket: the project's tag rules (owner/status/agent routing) are not
1170
+ applied to a public report while it awaits approval.
1171
+ reporterEmail:
1172
+ anyOf:
1173
+ - type: string
1174
+ format: email
1175
+ - type: "null"
1176
+ description: Email of the reporter, or `null`.
1177
+ pageUrl:
1178
+ anyOf:
1179
+ - type: string
1180
+ format: uri
1181
+ - type: "null"
1182
+ description: URL of the page the bug relates to, or `null`.
1183
+ userAgent:
1184
+ anyOf:
1185
+ - type: string
1186
+ maxLength: 500
1187
+ - type: "null"
1188
+ description: Reporter's user-agent string, or `null`.
1189
+ viewport:
1190
+ anyOf:
1191
+ - type: string
1192
+ maxLength: 40
1193
+ - type: "null"
1194
+ description: Reporter's viewport (e.g. `1280x720`), or `null`.
1195
+ context:
1196
+ anyOf:
1197
+ - type: object
1198
+ additionalProperties: {}
1199
+ - type: "null"
1200
+ description: Arbitrary capture context, or `null`.
1201
+ dedupKey:
1202
+ type: string
1203
+ maxLength: 200
1204
+ description: >-
1205
+ Caller-chosen dedupe identity for this report, stored on the ticket. A
1206
+ repeat submission carrying the same key does NOT file a second ticket:
1207
+ the open ticket already holding that key is refreshed from this payload
1208
+ (title and the report fields overwritten, a "re-triggered" comment
1209
+ appended) and returned with `deduped: true` and `updated: true`. Triage
1210
+ state a human owns — status, priority, assignee, tags — is left
1211
+ untouched, and a `resolved`/`wont_fix` ticket no longer holds the key, so
1212
+ a failure that comes back after being closed files a fresh ticket. Omit
1213
+ it to fall back to the derived (title + `context.step`) dedupe, whose
1214
+ repeats return the existing ticket unchanged.
1215
+ notify:
1216
+ anyOf:
1217
+ - $ref: ./common.yaml#/NotificationTarget
1218
+ - type: "null"
1219
+ description: Where this bug's completion notification lands.
1220
+ required:
1221
+ - title
1222
+ additionalProperties: false
1223
+ description: "Body for `POST /ops/bug`. The same bug fields as `CreateBugRequest`, minus the `type` discriminator — the path already says what is being filed, plus the public intake's own `dedupKey`."
1224
+ CreatePublicFeatureRequestRequest:
1225
+ type: object
1226
+ properties:
1227
+ title:
1228
+ type: string
1229
+ minLength: 1
1230
+ maxLength: 200
1231
+ pattern: '^\S(.*\S)?$'
1232
+ description: One-line feature-request title (no leading/trailing whitespace).
1233
+ description:
1234
+ type: string
1235
+ maxLength: 8000
1236
+ default: ""
1237
+ description: What the feature is.
1238
+ useCase:
1239
+ type: string
1240
+ maxLength: 8000
1241
+ default: ""
1242
+ description: Why it's needed / the use case.
1243
+ priority:
1244
+ anyOf:
1245
+ - $ref: "#/OpsItemPriority"
1246
+ - type: "null"
1247
+ description: Initial triage priority, or `null`.
1248
+ status:
1249
+ anyOf:
1250
+ - $ref: "#/OpsItemStatus"
1251
+ description: Initial lifecycle status; defaults to `open` when omitted.
1252
+ assigneeId:
1253
+ anyOf:
1254
+ - type: string
1255
+ - type: "null"
1256
+ description: The `users.id` of the person to assign as owner at creation, or `null`.
1257
+ subscribers:
1258
+ type: array
1259
+ items:
1260
+ type: string
1261
+ format: email
1262
+ default: []
1263
+ description: Emails of teammates to subscribe to this item's Slack pings at creation.
1264
+ tags:
1265
+ type: array
1266
+ maxItems: 50
1267
+ items:
1268
+ $ref: ./tags.yaml#/TagName
1269
+ default: []
1270
+ description: >-
1271
+ Tag names to label the item with, e.g. `["ios", "checkout"]`. Each name
1272
+ is matched case-insensitively against the project's existing tags and
1273
+ reuses that tag (keeping its stored casing) when one matches; a name with
1274
+ no match creates a new project tag. Here the tags only label the
1275
+ ticket: the project's tag rules (owner/status/agent routing) are not
1276
+ applied to a public report while it awaits approval.
1277
+ reporterEmail:
1278
+ anyOf:
1279
+ - type: string
1280
+ format: email
1281
+ - type: "null"
1282
+ description: Email of the reporter, or `null`.
1283
+ pageUrl:
1284
+ anyOf:
1285
+ - type: string
1286
+ format: uri
1287
+ - type: "null"
1288
+ description: URL of the page the request relates to, or `null`.
1289
+ userAgent:
1290
+ anyOf:
1291
+ - type: string
1292
+ maxLength: 500
1293
+ - type: "null"
1294
+ description: Reporter's user-agent string, or `null`.
1295
+ context:
1296
+ anyOf:
1297
+ - type: object
1298
+ additionalProperties: {}
1299
+ - type: "null"
1300
+ description: Arbitrary capture context, or `null`.
1301
+ dedupKey:
1302
+ type: string
1303
+ maxLength: 200
1304
+ description: >-
1305
+ Caller-chosen dedupe identity for this request, stored on the ticket.
1306
+ Behaves exactly as on `POST /ops/bug`: a repeat carrying the same key
1307
+ refreshes the open ticket already holding it (fields overwritten, a
1308
+ "re-triggered" comment appended) and returns `deduped: true` with
1309
+ `updated: true`, instead of filing a second one.
1310
+ notify:
1311
+ anyOf:
1312
+ - $ref: ./common.yaml#/NotificationTarget
1313
+ - type: "null"
1314
+ description: Where this request's completion notification lands.
1315
+ required:
1316
+ - title
1317
+ additionalProperties: false
1318
+ description: "Body for `POST /ops/feature-request`. The same feature-request fields as `CreateFeatureRequestRequest`, minus the `type` discriminator — the path already says what is being filed, plus the public intake's own `dedupKey`."
1066
1319
  CreateOpsItemRequest:
1067
1320
  oneOf:
1068
1321
  - $ref: "#/CreateBugRequest"
@@ -1073,6 +1326,25 @@ CreateOpsItemRequest:
1073
1326
  bug: "#/CreateBugRequest"
1074
1327
  feature_request: "#/CreateFeatureRequestRequest"
1075
1328
  description: "Body for `POST /api/admin/ops`. A discriminated union on `type`: `bug` carries the bug fields, `feature_request` the feature fields. Only these two user-fileable types are accepted — `error`, `alert`, and `measure_plan` tickets are auto-filed by the platform and cannot be created over the API."
1329
+ CreatePublicTicketResponse:
1330
+ type: object
1331
+ properties:
1332
+ id:
1333
+ type: string
1334
+ description: The new item's id. Absent on a deduped response — nothing was created, so there is no new id to report.
1335
+ number:
1336
+ type: integer
1337
+ description: Per-project item number. On a deduped response this is the number of the OPEN ticket already tracking the report, which is what a caller should show the user either way.
1338
+ deduped:
1339
+ type: boolean
1340
+ description: "`true` when an open ticket already tracked this report and nothing was filed (HTTP 200). Absent on a fresh file (HTTP 201)."
1341
+ updated:
1342
+ type: boolean
1343
+ description: "`true` when the deduped ticket was REFRESHED from this payload and got a \"re-triggered\" comment — only ever set alongside `deduped` on a submission that carried a `dedupKey`. Absent when the existing ticket was returned untouched."
1344
+ required:
1345
+ - number
1346
+ additionalProperties: false
1347
+ description: "Response for the public ticket intake. A fresh file returns `201` with `id` + `number`; a repeat of a report already tracked by an open ticket returns `200` with that ticket's `number` and `deduped: true` — plus `updated: true` when a `dedupKey` re-triggered it and its fields were refreshed."
1076
1348
  CreateOpsItemResponse:
1077
1349
  type: object
1078
1350
  properties:
@@ -1136,6 +1408,7 @@ OpsInvestigationState:
1136
1408
  enum:
1137
1409
  - pr_ready
1138
1410
  - pr_merged
1411
+ - pr_closed
1139
1412
  - investigated
1140
1413
  - detected
1141
1414
  - question
@@ -1150,14 +1423,17 @@ OpsInvestigationState:
1150
1423
  happen**, never authored on its own: linking a PR sets `pr_ready`, moving to
1151
1424
  `in_progress` sets `working`, `ready_for_qa` sets `ready_for_qa`, a
1152
1425
  system/assistant reply sets `question`, resolving clears it, and creation
1153
- seeds `backlog` or `investigated`/`detected` for auto-filed error/alert
1154
- tickets. `backlog` is the single "nothing has happened yet" state — how
1155
- urgent that is reads off `priority`, not off a separate state, and its one
1156
- action is to hand the item to an agent. `pr_merged` is derived client-side
1157
- by scanning the linked pull request on GitHub, so it is accepted on write
1158
- but not currently emitted by the API. Absent on rows filed before the field
1159
- existed — consumers should treat a missing value as "derive from the other
1160
- fields".
1426
+ seeds `backlog` for every untouched item (bugs, features, and auto-filed
1427
+ error/alert tickets alike — type is not a signal). `backlog` is the single
1428
+ "nothing has happened yet" state — how urgent that is reads off `priority`,
1429
+ not off a separate state, and its one action is to hand the item to an
1430
+ agent. `investigated`/`detected` are set when a completed agent run leaves
1431
+ findings to review, not at filing time. `pr_merged` and `pr_closed` are
1432
+ written by the GitHub `pull_request` webhook when the linked PR reaches a
1433
+ terminal outcome — merged (the fix shipped, resolve the item) or closed
1434
+ without merging (the fix was rejected, decide what happens next). Absent on
1435
+ rows filed before the field existed — consumers should treat a missing
1436
+ value as "derive from the other fields".
1161
1437
  OpsItemPriorityOrNull:
1162
1438
  anyOf:
1163
1439
  - $ref: "#/OpsItemPriority"
@@ -1335,6 +1611,16 @@ AckOpsItemRequest:
1335
1611
  The agent-run session id (e.g. Claude's `session_01…`), so the dashboard
1336
1612
  can deep-link to the exact run page. Omit when the harness has no
1337
1613
  session id.
1614
+ launch:
1615
+ type: boolean
1616
+ default: true
1617
+ description: >-
1618
+ Whether an AI ack may FIRE the agent's connected trigger. Default
1619
+ `true`: an ack naming a connected agent, with no `sessionId`, starts a
1620
+ new provider run of that agent. Pass `false` to only record the ack —
1621
+ claim the item and open the run record — without starting anything,
1622
+ e.g. when you ARE that agent working the item yourself and have no
1623
+ session id to pass. Ignored on a human ack.
1338
1624
  additionalProperties: false
1339
1625
  description: >-
1340
1626
  Body for `POST /api/admin/ops/{handle}/ack`. With `agent` set this is an AI
@@ -1983,6 +2269,253 @@ UpdateOpsInvestigationRequest:
1983
2269
  additionalProperties: false
1984
2270
  minProperties: 1
1985
2271
  description: "Body for `PATCH /api/admin/ops/{handle}/investigation/{investigationId}` — a partial update of one existing investigation record (typically the `working` run record you were handed). Send only the fields you want to change; at least one is required."
2272
+ OpsQuestionStatus:
2273
+ type: string
2274
+ enum:
2275
+ - open
2276
+ - completed
2277
+ - cancelled
2278
+ description: "Where a question stands — `open` (waiting on a person), `completed` (answered), or `cancelled` (withdrawn by the asker)."
2279
+ OpsQuestionDelivery:
2280
+ type: string
2281
+ enum:
2282
+ - resume
2283
+ - poll
2284
+ description: "How the answer gets back to the asker — `resume` re-fires the asking run's trigger connector on the item once every question that run asked is answered; `poll` fires nothing and the asker reads `GET .../questions`."
2285
+ OpsQuestionOption:
2286
+ type: object
2287
+ properties:
2288
+ label:
2289
+ type: string
2290
+ minLength: 1
2291
+ maxLength: 120
2292
+ description: The option's display text — short (1–5 words). Answers name options by this label.
2293
+ description:
2294
+ type: string
2295
+ maxLength: 500
2296
+ description: What picking this option means — its trade-off or consequence.
2297
+ required:
2298
+ - label
2299
+ additionalProperties: false
2300
+ description: One choice offered by a question — rendered as a radio, or a checkbox when the question is `multiSelect`.
2301
+ OpsQuestionAnswer:
2302
+ type: object
2303
+ properties:
2304
+ selected:
2305
+ type: array
2306
+ items:
2307
+ type: string
2308
+ description: The option labels the person picked (empty when they only answered "Other").
2309
+ other:
2310
+ anyOf:
2311
+ - type: string
2312
+ - type: "null"
2313
+ description: The free-text "Other" answer, or `null`.
2314
+ required:
2315
+ - selected
2316
+ - other
2317
+ additionalProperties: false
2318
+ description: A person's answer to a question.
2319
+ AskOpsQuestionInput:
2320
+ type: object
2321
+ properties:
2322
+ header:
2323
+ type: string
2324
+ minLength: 1
2325
+ maxLength: 24
2326
+ description: Very short chip label for the question (max 24 chars), e.g. `Auth method`.
2327
+ question:
2328
+ type: string
2329
+ minLength: 1
2330
+ maxLength: 2000
2331
+ description: The complete question, ending with a question mark (markdown).
2332
+ options:
2333
+ type: array
2334
+ minItems: 2
2335
+ maxItems: 4
2336
+ items:
2337
+ $ref: "#/OpsQuestionOption"
2338
+ description: 2–4 distinct choices. Do not add an "Other" option — a free-text answer is always offered.
2339
+ multiSelect:
2340
+ type: boolean
2341
+ default: false
2342
+ description: "`true` lets the person pick several options (checkboxes); `false` (the default) exactly one (radios)."
2343
+ required:
2344
+ - header
2345
+ - question
2346
+ - options
2347
+ additionalProperties: false
2348
+ description: One question to ask — the `AskUserQuestion` shape.
2349
+ AskOpsQuestionsRequest:
2350
+ type: object
2351
+ properties:
2352
+ questions:
2353
+ type: array
2354
+ minItems: 1
2355
+ maxItems: 4
2356
+ items:
2357
+ $ref: "#/AskOpsQuestionInput"
2358
+ description: 1–4 questions to ask at once.
2359
+ runId:
2360
+ type: string
2361
+ maxLength: 200
2362
+ description: The run (investigation record id) you are working the item under — the `runId` an ack or a launch handed you. Ties the questions to that run so a `resume` delivery continues it.
2363
+ agent:
2364
+ type: string
2365
+ enum:
2366
+ - jarvis
2367
+ - claude
2368
+ - cursor
2369
+ - copilot
2370
+ - jules
2371
+ description: The agent type asking — pass your own type when you are a coding agent. Defaults to the run's agent.
2372
+ delivery:
2373
+ $ref: "#/OpsQuestionDelivery"
2374
+ required:
2375
+ - questions
2376
+ additionalProperties: false
2377
+ description: "Body for `POST /api/admin/ops/{handle}/questions`."
2378
+ AskOpsQuestionsResponse:
2379
+ type: array
2380
+ items:
2381
+ $ref: "#/OpsQuestion"
2382
+ description: Response for `POST /api/admin/ops/{handle}/questions` — the created questions, in the order asked.
2383
+ AnswerOpsQuestionRequest:
2384
+ type: object
2385
+ properties:
2386
+ selected:
2387
+ type: array
2388
+ maxItems: 4
2389
+ items:
2390
+ type: string
2391
+ maxLength: 120
2392
+ description: The option labels picked — exactly one for a single-select question (unless answering only with `other`), one or more for `multiSelect`.
2393
+ other:
2394
+ type: string
2395
+ maxLength: 10000
2396
+ description: A free-text "Other" answer.
2397
+ additionalProperties: false
2398
+ minProperties: 1
2399
+ description: "Body for `POST /api/admin/ops/{handle}/questions/{questionId}/answer` — pick option labels, write a free-text answer, or both (multi-select only)."
2400
+ OpsQuestion:
2401
+ type: object
2402
+ properties:
2403
+ id:
2404
+ type: string
2405
+ description: Question id.
2406
+ feedbackId:
2407
+ type: string
2408
+ description: The queue item the question hangs off.
2409
+ header:
2410
+ type: string
2411
+ description: Short chip label for the question.
2412
+ question:
2413
+ type: string
2414
+ description: The full question (markdown).
2415
+ options:
2416
+ type: array
2417
+ items:
2418
+ type: object
2419
+ properties:
2420
+ label:
2421
+ type: string
2422
+ description: The option's display text.
2423
+ description:
2424
+ anyOf:
2425
+ - type: string
2426
+ - type: "null"
2427
+ description: What picking the option means, or `null`.
2428
+ required:
2429
+ - label
2430
+ - description
2431
+ additionalProperties: false
2432
+ description: One offered choice.
2433
+ description: The offered choices, in order.
2434
+ multiSelect:
2435
+ type: boolean
2436
+ description: Whether several options may be picked.
2437
+ status:
2438
+ $ref: "#/OpsQuestionStatus"
2439
+ answer:
2440
+ anyOf:
2441
+ - $ref: "#/OpsQuestionAnswer"
2442
+ - type: "null"
2443
+ description: The person's answer, or `null` while the question is open (or was withdrawn).
2444
+ answeredBy:
2445
+ anyOf:
2446
+ - type: string
2447
+ - type: "null"
2448
+ description: Email of the person who answered, or `null`.
2449
+ answeredAt:
2450
+ anyOf:
2451
+ - type: string
2452
+ - type: "null"
2453
+ description: ISO-8601 timestamp of the answer, or `null`.
2454
+ agent:
2455
+ anyOf:
2456
+ - type: string
2457
+ enum:
2458
+ - jarvis
2459
+ - claude
2460
+ - cursor
2461
+ - copilot
2462
+ - jules
2463
+ - type: "null"
2464
+ description: The agent that asked, or `null` (asked by a person or an unattributed key).
2465
+ askedBy:
2466
+ anyOf:
2467
+ - type: string
2468
+ - type: "null"
2469
+ description: Email of the person who asked, when a human asked, or `null`.
2470
+ runId:
2471
+ anyOf:
2472
+ - type: string
2473
+ - type: "null"
2474
+ description: The run (investigation record id) the question was asked under, or `null`.
2475
+ delivery:
2476
+ $ref: "#/OpsQuestionDelivery"
2477
+ deliveredAt:
2478
+ anyOf:
2479
+ - type: string
2480
+ - type: "null"
2481
+ description: ISO-8601 timestamp the answer was re-delivered to the asking run (`resume` only), or `null`.
2482
+ deliveryError:
2483
+ anyOf:
2484
+ - type: string
2485
+ - type: "null"
2486
+ description: Why a `resume` re-delivery failed, or `null`.
2487
+ createdAt:
2488
+ type: string
2489
+ description: ISO-8601 creation timestamp.
2490
+ updatedAt:
2491
+ type: string
2492
+ description: ISO-8601 last-update timestamp.
2493
+ required:
2494
+ - id
2495
+ - feedbackId
2496
+ - header
2497
+ - question
2498
+ - options
2499
+ - multiSelect
2500
+ - status
2501
+ - answer
2502
+ - answeredBy
2503
+ - answeredAt
2504
+ - agent
2505
+ - askedBy
2506
+ - runId
2507
+ - delivery
2508
+ - deliveredAt
2509
+ - deliveryError
2510
+ - createdAt
2511
+ - updatedAt
2512
+ additionalProperties: false
2513
+ description: One structured question on a queue item and, once answered, its answer.
2514
+ ListOpsQuestionsResponse:
2515
+ type: array
2516
+ items:
2517
+ $ref: "#/OpsQuestion"
2518
+ description: Response for `GET /api/admin/ops/{handle}/questions` — the item's questions, newest first (max 100).
1986
2519
  NotificationFeedItem:
1987
2520
  type: object
1988
2521
  properties: