@shipeasy/openapi 3.2.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 (39) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-RTN572TI.js → chunk-75Z4SQOM.js} +75 -1
  3. package/dist/chunk-75Z4SQOM.js.map +1 -0
  4. package/dist/{chunk-DW33MG4B.js → chunk-ZYK74ZIW.js} +426 -121
  5. package/dist/chunk-ZYK74ZIW.js.map +1 -0
  6. package/dist/{client-BPVn4hMC.d.ts → client-DAGqRpF1.d.ts} +1362 -238
  7. package/dist/client.d.ts +1 -1
  8. package/dist/client.js +19 -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 +20 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/schemas.d.ts +1648 -907
  16. package/dist/schemas.js +113 -1
  17. package/openapi-sdk.json +31 -9
  18. package/openapi.json +4040 -2083
  19. package/openapi.yaml +1775 -408
  20. package/package.json +1 -1
  21. package/spec/components/schemas/alert-rules.yaml +405 -7
  22. package/spec/components/schemas/alerts.yaml +9 -7
  23. package/spec/components/schemas/common.yaml +2 -2
  24. package/spec/components/schemas/connectors.yaml +69 -6
  25. package/spec/components/schemas/events.yaml +20 -9
  26. package/spec/components/schemas/keys.yaml +30 -0
  27. package/spec/components/schemas/metrics.yaml +131 -251
  28. package/spec/components/schemas/ops.yaml +377 -29
  29. package/spec/components/schemas/projects.yaml +18 -0
  30. package/spec/components/schemas/tags.yaml +91 -0
  31. package/spec/openapi.yaml +43 -0
  32. package/spec/paths/alerts.yaml +5 -3
  33. package/spec/paths/i18n.yaml +2 -1
  34. package/spec/paths/keys.yaml +79 -0
  35. package/spec/paths/metrics.yaml +26 -17
  36. package/spec/paths/ops.yaml +388 -11
  37. package/spec/paths/tags.yaml +270 -0
  38. package/dist/chunk-DW33MG4B.js.map +0 -1
  39. package/dist/chunk-RTN572TI.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
@@ -1110,10 +1157,17 @@ CreatePublicBugRequest:
1110
1157
  description: Emails of teammates to subscribe to this item's Slack pings at creation.
1111
1158
  tags:
1112
1159
  type: array
1160
+ maxItems: 50
1113
1161
  items:
1114
- type: string
1162
+ $ref: ./tags.yaml#/TagName
1115
1163
  default: []
1116
- description: Tag names to attach at creation (get-or-created by name, deduped case-insensitively).
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.
1117
1171
  reporterEmail:
1118
1172
  anyOf:
1119
1173
  - type: string
@@ -1144,6 +1198,20 @@ CreatePublicBugRequest:
1144
1198
  additionalProperties: {}
1145
1199
  - type: "null"
1146
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.
1147
1215
  notify:
1148
1216
  anyOf:
1149
1217
  - $ref: ./common.yaml#/NotificationTarget
@@ -1152,7 +1220,7 @@ CreatePublicBugRequest:
1152
1220
  required:
1153
1221
  - title
1154
1222
  additionalProperties: false
1155
- description: "Body for `POST /ops/bug`. The same bug fields as `CreateBugRequest`, minus the `type` discriminator — the path already says what is being filed."
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`."
1156
1224
  CreatePublicFeatureRequestRequest:
1157
1225
  type: object
1158
1226
  properties:
@@ -1195,10 +1263,17 @@ CreatePublicFeatureRequestRequest:
1195
1263
  description: Emails of teammates to subscribe to this item's Slack pings at creation.
1196
1264
  tags:
1197
1265
  type: array
1266
+ maxItems: 50
1198
1267
  items:
1199
- type: string
1268
+ $ref: ./tags.yaml#/TagName
1200
1269
  default: []
1201
- description: Tag names to attach at creation (get-or-created by name, deduped case-insensitively).
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.
1202
1277
  reporterEmail:
1203
1278
  anyOf:
1204
1279
  - type: string
@@ -1223,6 +1298,15 @@ CreatePublicFeatureRequestRequest:
1223
1298
  additionalProperties: {}
1224
1299
  - type: "null"
1225
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.
1226
1310
  notify:
1227
1311
  anyOf:
1228
1312
  - $ref: ./common.yaml#/NotificationTarget
@@ -1231,7 +1315,7 @@ CreatePublicFeatureRequestRequest:
1231
1315
  required:
1232
1316
  - title
1233
1317
  additionalProperties: false
1234
- 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."
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`."
1235
1319
  CreateOpsItemRequest:
1236
1320
  oneOf:
1237
1321
  - $ref: "#/CreateBugRequest"
@@ -1254,10 +1338,13 @@ CreatePublicTicketResponse:
1254
1338
  deduped:
1255
1339
  type: boolean
1256
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."
1257
1344
  required:
1258
1345
  - number
1259
1346
  additionalProperties: false
1260
- 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`."
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."
1261
1348
  CreateOpsItemResponse:
1262
1349
  type: object
1263
1350
  properties:
@@ -1321,6 +1408,7 @@ OpsInvestigationState:
1321
1408
  enum:
1322
1409
  - pr_ready
1323
1410
  - pr_merged
1411
+ - pr_closed
1324
1412
  - investigated
1325
1413
  - detected
1326
1414
  - question
@@ -1335,14 +1423,17 @@ OpsInvestigationState:
1335
1423
  happen**, never authored on its own: linking a PR sets `pr_ready`, moving to
1336
1424
  `in_progress` sets `working`, `ready_for_qa` sets `ready_for_qa`, a
1337
1425
  system/assistant reply sets `question`, resolving clears it, and creation
1338
- seeds `backlog` or `investigated`/`detected` for auto-filed error/alert
1339
- tickets. `backlog` is the single "nothing has happened yet" state — how
1340
- urgent that is reads off `priority`, not off a separate state, and its one
1341
- action is to hand the item to an agent. `pr_merged` is derived client-side
1342
- by scanning the linked pull request on GitHub, so it is accepted on write
1343
- but not currently emitted by the API. Absent on rows filed before the field
1344
- existed — consumers should treat a missing value as "derive from the other
1345
- 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".
1346
1437
  OpsItemPriorityOrNull:
1347
1438
  anyOf:
1348
1439
  - $ref: "#/OpsItemPriority"
@@ -1520,6 +1611,16 @@ AckOpsItemRequest:
1520
1611
  The agent-run session id (e.g. Claude's `session_01…`), so the dashboard
1521
1612
  can deep-link to the exact run page. Omit when the harness has no
1522
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.
1523
1624
  additionalProperties: false
1524
1625
  description: >-
1525
1626
  Body for `POST /api/admin/ops/{handle}/ack`. With `agent` set this is an AI
@@ -2168,6 +2269,253 @@ UpdateOpsInvestigationRequest:
2168
2269
  additionalProperties: false
2169
2270
  minProperties: 1
2170
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).
2171
2519
  NotificationFeedItem:
2172
2520
  type: object
2173
2521
  properties:
@@ -171,6 +171,12 @@ GetCurrentProjectResponse:
171
171
  - type: boolean
172
172
  - type: number
173
173
  description: Whether key-authenticated public ticket creation (`POST /cli/report`) is allowed into this project. Off by default.
174
+ errorAutocloseDays:
175
+ type: integer
176
+ description: Days an `open` tracked error may go unseen before the nightly sweep auto-resolves it. `0` disables auto-close for this project. Ingest reopens a resolved error the moment it recurs, so this never hides a live issue.
177
+ errorTicketMinOccurrences:
178
+ type: integer
179
+ description: Occurrence count a tracked error must cross before an `error` ticket is auto-filed into the ops queue. Customising it requires a paid plan; unentitled projects always run at the platform default of 10.
174
180
  stripeSubscriptionId:
175
181
  anyOf:
176
182
  - type: string
@@ -250,6 +256,8 @@ GetCurrentProjectResponse:
250
256
  - moduleUser
251
257
  - moduleEvents
252
258
  - allowPublicTickets
259
+ - errorAutocloseDays
260
+ - errorTicketMinOccurrences
253
261
  - slug
254
262
  - logo
255
263
  - defaultEnv
@@ -462,5 +470,15 @@ UpdateProjectRequest:
462
470
  minimum: 0.0001
463
471
  maximum: 0.05
464
472
  description: SRM chi-square p-value below which the run is called invalid.
473
+ errorAutocloseDays:
474
+ type: integer
475
+ minimum: 0
476
+ maximum: 365
477
+ description: Days an `open` tracked error may go unseen before the nightly sweep auto-resolves it. `0` disables auto-close for this project.
478
+ errorTicketMinOccurrences:
479
+ type: integer
480
+ minimum: 1
481
+ maximum: 10000
482
+ description: Occurrence count a tracked error must cross before an `error` ticket is auto-filed into the ops queue. Requires a paid plan — the request is rejected with 403 on a plan without the `ops_auto_error_issues` entitlement.
465
483
  additionalProperties: false
466
484
  description: "Body for `PATCH /api/admin/projects/{id}`. Partial — every field is optional; only supplied fields change. The project id in the path must match the caller's own project."