@shipeasy/openapi 2.2.0 → 2.4.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 (52) hide show
  1. package/dist/{chunk-643YSMLU.js → chunk-4QSU744W.js} +183 -1
  2. package/dist/chunk-4QSU744W.js.map +1 -0
  3. package/dist/{chunk-MRW3DJ57.js → chunk-ZPKHTUVV.js} +1238 -335
  4. package/dist/chunk-ZPKHTUVV.js.map +1 -0
  5. package/dist/{client-K0ShmsC7.d.ts → client-WGNXT4xl.d.ts} +5818 -2647
  6. package/dist/client.d.ts +1 -1
  7. package/dist/client.js +51 -1
  8. package/dist/custom.js +4 -4
  9. package/dist/custom.js.map +1 -1
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.js +52 -2
  12. package/dist/index.js.map +1 -1
  13. package/dist/schemas.d.ts +3538 -534
  14. package/dist/schemas.js +253 -5
  15. package/openapi.json +12914 -7158
  16. package/openapi.yaml +7672 -3742
  17. package/package.json +1 -1
  18. package/spec/components/errors.yaml +33 -1
  19. package/spec/components/schemas/alerts.yaml +138 -0
  20. package/spec/components/schemas/attributes.yaml +53 -3
  21. package/spec/components/schemas/common.yaml +16 -0
  22. package/spec/components/schemas/configs.yaml +58 -0
  23. package/spec/components/schemas/connectors.yaml +5 -1
  24. package/spec/components/schemas/errors-api.yaml +116 -6
  25. package/spec/components/schemas/experiment-api-row.yaml +293 -0
  26. package/spec/components/schemas/experiments.yaml +395 -380
  27. package/spec/components/schemas/gates.yaml +355 -272
  28. package/spec/components/schemas/i18n.yaml +169 -40
  29. package/spec/components/schemas/keys.yaml +2 -1
  30. package/spec/components/schemas/killswitches.yaml +36 -0
  31. package/spec/components/schemas/metrics.yaml +200 -23
  32. package/spec/components/schemas/ops.yaml +918 -29
  33. package/spec/components/schemas/projects.yaml +246 -2
  34. package/spec/components/schemas/universes.yaml +83 -1
  35. package/spec/openapi.yaml +61 -0
  36. package/spec/paths/alert-rules.yaml +1 -0
  37. package/spec/paths/alerts.yaml +184 -0
  38. package/spec/paths/attributes.yaml +23 -5
  39. package/spec/paths/configs.yaml +71 -0
  40. package/spec/paths/errors.yaml +112 -2
  41. package/spec/paths/events.yaml +1 -0
  42. package/spec/paths/experiments.yaml +244 -16
  43. package/spec/paths/gates.yaml +138 -0
  44. package/spec/paths/i18n.yaml +290 -6
  45. package/spec/paths/keys.yaml +1 -0
  46. package/spec/paths/killswitches.yaml +7 -0
  47. package/spec/paths/metrics.yaml +187 -0
  48. package/spec/paths/ops.yaml +410 -0
  49. package/spec/paths/projects.yaml +62 -2
  50. package/spec/paths/universes.yaml +1 -0
  51. package/dist/chunk-643YSMLU.js.map +0 -1
  52. package/dist/chunk-MRW3DJ57.js.map +0 -1
@@ -35,9 +35,88 @@ ListOpsItemsResponse:
35
35
  anyOf:
36
36
  - type: string
37
37
  - type: "null"
38
+ investigationState:
39
+ anyOf:
40
+ - $ref: "#/OpsInvestigationState"
41
+ - type: "null"
42
+ description: >-
43
+ Where automation has taken this item in the investigation lifecycle
44
+ (see `OpsInvestigationState`). Optional — absent/`null` on rows filed
45
+ before the field existed; derive from `status`/`type` in that case.
46
+ source:
47
+ type: string
48
+ enum:
49
+ - team
50
+ - system
51
+ description: "How the item was filed: `team` (a human admin/teammate — bug/feature) or `system` (auto-filed — error/alert/measure_plan)."
52
+ reporterEmail:
53
+ anyOf:
54
+ - type: string
55
+ - type: "null"
56
+ description: Reporter email (bug/feature), or `null`.
57
+ stepsToReproduce:
58
+ type: string
59
+ description: Reproduction steps — populated for `bug`, empty string otherwise.
60
+ actualResult:
61
+ type: string
62
+ description: What actually happened — `bug` only, empty string otherwise.
63
+ expectedResult:
64
+ type: string
65
+ description: What was expected — `bug` only, empty string otherwise.
66
+ description:
67
+ type: string
68
+ description: Feature description — populated for `feature_request`, empty string otherwise.
69
+ useCase:
70
+ type: string
71
+ description: Feature use case — `feature_request` only, empty string otherwise.
72
+ context:
73
+ anyOf:
74
+ - $ref: "#/OpsItemContext"
75
+ - type: "null"
76
+ description: "The RAW stored capture context on the row — NOT hydrated: list rows carry only what was captured at file time (e.g. `context.browser` for bug/feature, the trigger subset for auto-filed tickets). The live `error`/`alert` readings and `errorChart` are added only by the single-item read (`GET /api/admin/ops/{handle}`). `null` when nothing was captured."
77
+ connectorData:
78
+ anyOf:
79
+ - $ref: "#/ConnectorData"
80
+ - type: "null"
81
+ description: "Per-connector linkage recorded for this item, keyed by connector provider. `null` if no connector has touched the item."
82
+ notify:
83
+ anyOf:
84
+ - $ref: ./common.yaml#/NotificationTarget
85
+ - type: "null"
86
+ description: Per-item completion-notification target, or `null` (falls back to the project default).
87
+ assigneeId:
88
+ anyOf:
89
+ - type: string
90
+ - type: "null"
91
+ description: The PERSON owner — a `users.id` (resolved into `owner.user`), or `null` when unassigned.
92
+ assigneeConnectorId:
93
+ anyOf:
94
+ - type: string
95
+ - type: "null"
96
+ description: The AGENT owner when it is a connected trigger connector — a `connectors` row id (resolved into `owner.agent`), or `null`. Mutually exclusive with `assigneeAgent`.
97
+ assigneeAgent:
98
+ anyOf:
99
+ - type: string
100
+ - type: "null"
101
+ description: The AGENT owner when it is a built-in hosted Shipeasy agent — currently only `jarvis` — or `null`. Mutually exclusive with `assigneeConnectorId`.
102
+ owner:
103
+ $ref: "#/OpsItemOwner"
104
+ run:
105
+ anyOf:
106
+ - $ref: "#/OpsRun"
107
+ - type: "null"
108
+ description: The currently OPEN run on this item (someone acked it and is actively working — the cockpit's live working indicator), or `null` when nothing is in flight.
109
+ lastRun:
110
+ anyOf:
111
+ - $ref: "#/OpsRun"
112
+ - type: "null"
113
+ description: The most recently COMPLETED run (the run result — final action, PR, duration), excluding superseded runs; `null` when no run has completed yet.
38
114
  createdAt:
39
115
  type: string
40
116
  description: ISO-8601 creation timestamp.
117
+ updatedAt:
118
+ type: string
119
+ description: ISO-8601 last-update timestamp.
41
120
  required:
42
121
  - id
43
122
  - number
@@ -45,9 +124,14 @@ ListOpsItemsResponse:
45
124
  - title
46
125
  - status
47
126
  - priority
127
+ - source
128
+ - owner
129
+ - run
130
+ - lastRun
48
131
  - createdAt
132
+ - updatedAt
49
133
  additionalProperties: {}
50
- description: One queue item — any type.
134
+ description: One queue item — any type — plus its resolved `owner` and run state.
51
135
  description: A page of queue items, newest first.
52
136
  GetOpsItemResponse:
53
137
  type: object
@@ -90,6 +174,16 @@ GetOpsItemResponse:
90
174
  - type: string
91
175
  - type: "null"
92
176
  description: "Stable key of the originating record for auto-filed tickets (error fingerprint, `<alert source>:<dedupeKey>`, or measurement-plan ref); `null` for human-filed bugs/features."
177
+ investigationState:
178
+ anyOf:
179
+ - $ref: "#/OpsInvestigationState"
180
+ - type: "null"
181
+ description: >-
182
+ Where automation has taken this item in the investigation lifecycle
183
+ (see `OpsInvestigationState`). Written as a side-effect of the actions
184
+ that already happen (link a PR, change status, an assistant reply);
185
+ `null` on rows filed before the field existed — derive from
186
+ `status`/`type` in that case.
93
187
  reporterEmail:
94
188
  anyOf:
95
189
  - type: string
@@ -132,6 +226,23 @@ GetOpsItemResponse:
132
226
  - $ref: ./common.yaml#/NotificationTarget
133
227
  - type: "null"
134
228
  description: Per-item completion-notification target, or `null` (falls back to the project default).
229
+ assigneeId:
230
+ anyOf:
231
+ - type: string
232
+ - type: "null"
233
+ description: The PERSON owner — a `users.id` (resolved into `owner.user`), or `null` when unassigned.
234
+ assigneeConnectorId:
235
+ anyOf:
236
+ - type: string
237
+ - type: "null"
238
+ description: The AGENT owner when it is a connected trigger connector — a `connectors` row id (resolved into `owner.agent`), or `null`. Mutually exclusive with `assigneeAgent`.
239
+ assigneeAgent:
240
+ anyOf:
241
+ - type: string
242
+ - type: "null"
243
+ description: The AGENT owner when it is a built-in hosted Shipeasy agent — currently only `jarvis` — or `null`. Mutually exclusive with `assigneeConnectorId`.
244
+ owner:
245
+ $ref: "#/OpsItemOwner"
135
246
  createdAt:
136
247
  type: string
137
248
  description: ISO-8601 creation timestamp.
@@ -148,9 +259,144 @@ GetOpsItemResponse:
148
259
  - context
149
260
  - attachments
150
261
  - related
262
+ - owner
151
263
  - createdAt
152
264
  additionalProperties: {}
153
265
  description: "One queue item, any of the five types. Shared fields apply to all; `stepsToReproduce`/`actualResult`/`expectedResult` are bug-specific, `description`/`useCase` feature-specific. The auto-collected browser fields (page URL, user-agent, viewport) live under `context.browser` for bug/feature. `context` also carries the hydrated per-type payload for auto-filed `error`/`alert`/`measure_plan` tickets, `attachments` lists any uploaded files, and `related` gives deep links to the underlying resources."
266
+ OpsItemOwner:
267
+ type: object
268
+ properties:
269
+ user:
270
+ anyOf:
271
+ - type: object
272
+ properties:
273
+ id:
274
+ type: string
275
+ description: The `users.id` of the assigned person (what `assigneeId` stores).
276
+ email:
277
+ type: string
278
+ description: The person's email.
279
+ name:
280
+ anyOf:
281
+ - type: string
282
+ - type: "null"
283
+ description: The person's display name, or `null` when none is set.
284
+ required:
285
+ - id
286
+ - email
287
+ - name
288
+ additionalProperties: false
289
+ description: The resolved person owner.
290
+ - type: "null"
291
+ description: The PERSON half of the owner (resolved from `assigneeId`), or `null` when no person is assigned.
292
+ agent:
293
+ anyOf:
294
+ - type: object
295
+ properties:
296
+ connectorId:
297
+ anyOf:
298
+ - type: string
299
+ - type: "null"
300
+ description: The `connectors` row id for a connector-backed agent; `null` for the built-in one.
301
+ builtin:
302
+ anyOf:
303
+ - type: string
304
+ const: jarvis
305
+ - type: "null"
306
+ description: The built-in-agent key (`jarvis`) when this is the hosted Shipeasy agent; `null` for a connector-backed one.
307
+ provider:
308
+ type: string
309
+ enum:
310
+ - claude_trigger
311
+ - cursor_trigger
312
+ - copilot_trigger
313
+ - jules_trigger
314
+ - jarvis
315
+ description: The trigger-connector provider backing this agent, or `jarvis` for the built-in hosted agent.
316
+ name:
317
+ type: string
318
+ description: Display name — the connector's `name`, the provider default (e.g. "Claude"), or "Jarvis".
319
+ required:
320
+ - connectorId
321
+ - builtin
322
+ - provider
323
+ - name
324
+ additionalProperties: false
325
+ description: The resolved agent owner. Exactly one of `connectorId` / `builtin` is set.
326
+ - type: "null"
327
+ description: The AGENT half of the owner (resolved from `assigneeConnectorId` / `assigneeAgent`), or `null` when no agent is assigned.
328
+ required:
329
+ - user
330
+ - agent
331
+ additionalProperties: false
332
+ description: "The fully-resolved owner of a queue item — a person and/or an AI agent. The two halves are independent: an item may have a person, an agent, both, or neither (both `null`)."
333
+ OpsRun:
334
+ type: object
335
+ properties:
336
+ id:
337
+ type: string
338
+ description: Run record id.
339
+ agent:
340
+ anyOf:
341
+ - type: string
342
+ - type: "null"
343
+ description: "The AI agent type working the run (`jarvis` | `claude` | `cursor` | `copilot` | `jules`); `null` for a human ack."
344
+ connectorId:
345
+ anyOf:
346
+ - type: string
347
+ - type: "null"
348
+ description: The trigger-connector row id backing the acking agent; `null` for a human ack or the built-in Jarvis agent.
349
+ ackedBy:
350
+ anyOf:
351
+ - type: string
352
+ - type: "null"
353
+ description: Email of the human who acked; `null` for an AI ack.
354
+ sessionId:
355
+ anyOf:
356
+ - type: string
357
+ - type: "null"
358
+ description: The agent-run session id recorded on the ack (dashboard deep-links to the run page), or `null`.
359
+ startedAt:
360
+ type: string
361
+ description: ISO-8601 timestamp the run started (the ack time).
362
+ completedAt:
363
+ anyOf:
364
+ - type: string
365
+ - type: "null"
366
+ description: ISO-8601 timestamp the run closed, or `null` while still open.
367
+ completedAction:
368
+ anyOf:
369
+ - type: string
370
+ enum:
371
+ - link_pr
372
+ - notify
373
+ - status
374
+ - superseded
375
+ - type: "null"
376
+ description: "Which final action closed the run — `link_pr`/`notify` are the agent's terminal ops actions, `status` a completion status flip (ready_for_qa/resolved), `superseded` a newer ack replacing it. `null` while the run is open."
377
+ prNumber:
378
+ anyOf:
379
+ - type: number
380
+ - type: "null"
381
+ description: The PR the run linked as its final action, or `null`.
382
+ prUrl:
383
+ anyOf:
384
+ - type: string
385
+ - type: "null"
386
+ description: HTML URL of that PR, or `null`.
387
+ required:
388
+ - id
389
+ - agent
390
+ - connectorId
391
+ - ackedBy
392
+ - sessionId
393
+ - startedAt
394
+ - completedAt
395
+ - completedAction
396
+ - prNumber
397
+ - prUrl
398
+ additionalProperties: false
399
+ description: "One run on a queue item — who (person or AI agent) picked it up when, and, once closed, how it ended (final action + PR + session link). Opened by `POST /api/admin/ops/{handle}/ack`."
154
400
  OpsItemContext:
155
401
  type: object
156
402
  properties:
@@ -162,6 +408,38 @@ OpsItemContext:
162
408
  $ref: "#/OpsAlertContext"
163
409
  measurePlan:
164
410
  $ref: "#/OpsMeasurePlanContext"
411
+ errorChart:
412
+ type: object
413
+ properties:
414
+ series:
415
+ type: array
416
+ items:
417
+ type: object
418
+ properties:
419
+ t:
420
+ type: number
421
+ description: Bucket start — unix epoch **milliseconds** (hourly buckets).
422
+ v:
423
+ type: number
424
+ description: Occurrence count in the bucket (sample-rate weighted).
425
+ required:
426
+ - t
427
+ - v
428
+ additionalProperties: {}
429
+ description: One hourly occurrence bucket.
430
+ description: Hourly occurrence buckets, oldest first. Hours with no occurrences are omitted.
431
+ domainFrom:
432
+ type: number
433
+ description: Chart domain start — unix epoch milliseconds (24h before the read).
434
+ domainTo:
435
+ type: number
436
+ description: Chart domain end — unix epoch milliseconds (the read time).
437
+ required:
438
+ - series
439
+ - domainFrom
440
+ - domainTo
441
+ additionalProperties: {}
442
+ 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."
165
443
  additionalProperties: {}
166
444
  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."
167
445
  OpsBrowserContext:
@@ -245,6 +523,11 @@ OpsErrorContext:
245
523
  items:
246
524
  type: string
247
525
  description: "Distinct, id-normalized routes this error has surfaced on (UUIDs/ids collapsed to `#`)."
526
+ stackTail:
527
+ anyOf:
528
+ - type: string
529
+ - type: "null"
530
+ description: "The last 3 non-empty lines of the latest occurrence's stack — the innermost frames closest to where the throw bubbled out, baked in as an at-a-glance locator. `null` when the source supplied no stack. Fetch the full stack via `related.error`."
248
531
  sdkVersion:
249
532
  anyOf:
250
533
  - type: string
@@ -380,6 +663,11 @@ OpsAlertMetricSummary:
380
663
  OpsMeasurePlanContext:
381
664
  type: object
382
665
  properties:
666
+ goal:
667
+ anyOf:
668
+ - type: string
669
+ - type: "null"
670
+ description: "The customer's underlying intent in their own words — WHAT they want to learn or achieve and WHY, independent of the specific steps. The plan below is a best-effort proposal made without repo access; when the code reveals a better path, this goal is the target you optimize for, not literal step-adherence."
383
671
  created:
384
672
  type: array
385
673
  items:
@@ -545,33 +833,35 @@ GithubConnectorData:
545
833
  additionalProperties: {}
546
834
  description: The GitHub issue this item opened.
547
835
  pr:
548
- type: object
549
- properties:
550
- number:
551
- type: number
552
- description: Pull request number.
553
- url:
554
- type: string
555
- description: HTML URL of the linked pull request.
556
- linkedAt:
557
- type: string
558
- description: ISO-8601 timestamp the PR was linked.
559
- connectedToIssue:
560
- type: boolean
561
- description: "Whether the PR was wired to the issue on GitHub (via a closing keyword or a comment)."
562
- method:
563
- type: string
564
- enum:
565
- - closes
566
- - comment
567
- description: How the PR was connected to the issue.
568
- required:
569
- - number
570
- - url
571
- additionalProperties: {}
572
- description: The pull request linked to this item via `link-pr`.
836
+ $ref: "#/GithubPrLink"
573
837
  additionalProperties: {}
574
838
  description: "GitHub connector trace — the issue it opened and, once linked, the pull request."
839
+ GithubPrLink:
840
+ type: object
841
+ properties:
842
+ number:
843
+ type: number
844
+ description: Pull request number.
845
+ url:
846
+ type: string
847
+ description: HTML URL of the linked pull request.
848
+ linkedAt:
849
+ type: string
850
+ description: ISO-8601 timestamp the PR was linked.
851
+ connectedToIssue:
852
+ type: boolean
853
+ description: "Whether the PR was wired to the issue on GitHub (via a closing keyword or a comment)."
854
+ method:
855
+ type: string
856
+ enum:
857
+ - closes
858
+ - comment
859
+ description: How the PR was connected to the issue.
860
+ required:
861
+ - number
862
+ - url
863
+ additionalProperties: {}
864
+ description: The pull request linked to a queue item via `link-pr` (stored on `connectorData.github.pr`).
575
865
  SlackConnectorData:
576
866
  type: object
577
867
  properties:
@@ -763,17 +1053,23 @@ OpsItemStatus:
763
1053
  - pending_approval
764
1054
  - triage
765
1055
  - triaged
1056
+ - investigating_by_ai
766
1057
  - in_progress
1058
+ - blocked
767
1059
  - ready_for_qa
768
1060
  - resolved
769
1061
  - wont_fix
770
1062
  description: >-
771
1063
  Lifecycle status of a queue item. The working flow is `open` → `triaged` →
772
1064
  `in_progress` → `ready_for_qa` → `resolved` (or `wont_fix`, terminal from
773
- any earlier stage). `ready_for_qa` is what a developer sets once a fix
1065
+ any earlier stage). `blocked` marks an item that can't progress until an
1066
+ external dependency clears — a working state a human sets and clears.
1067
+ `ready_for_qa` is what a developer sets once a fix
774
1068
  lands; `resolved` is the QA sign-off, normally flipped in the dashboard
775
1069
  after verification — set it directly from code only when the fix has been
776
- verified end-to-end. Two
1070
+ verified end-to-end. `investigating_by_ai` is a system-owned display state —
1071
+ set when the AI agent (Jarvis) picks an item up to investigate, never chosen
1072
+ by a human — so it is shown but not offered as a manual choice. Two
777
1073
  human-gated holding states park an item OUT of the work queue until a human
778
1074
  promotes it to `open` in the dashboard, so `GET /api/admin/ops` excludes
779
1075
  them under `status=all`/default and returns them only when requested as an
@@ -796,6 +1092,31 @@ OpsItemPriority:
796
1092
  Triage priority of a queue item. The lowest tier is `nice_to_have` (not
797
1093
  `low`) — carried over from the feature-request "importance" scale this
798
1094
  priority set replaced.
1095
+ OpsInvestigationState:
1096
+ type: string
1097
+ enum:
1098
+ - pr_ready
1099
+ - investigated
1100
+ - detected
1101
+ - question
1102
+ - ready_for_qa
1103
+ - pending_approval
1104
+ - needs_triage
1105
+ - working
1106
+ - triaged_low
1107
+ - backlog
1108
+ description: >-
1109
+ Where automation has taken an item in the investigation lifecycle — the
1110
+ signal the ops cockpit renders as "what AI did" plus the one action expected
1111
+ of the user. It is **written as a side-effect of the actions that already
1112
+ happen**, never authored on its own: linking a PR sets `pr_ready`, moving to
1113
+ `in_progress` sets `working`, `ready_for_qa` sets `ready_for_qa`, a
1114
+ system/assistant reply sets `question`, resolving clears it, and creation
1115
+ seeds `needs_triage`/`backlog` (by priority) or `investigated`/`detected`
1116
+ for auto-filed error/alert tickets. `triaged_low` marks a low-signal item AI
1117
+ has looked at but that nothing is moving. Absent on rows filed before the
1118
+ field existed — consumers should treat a missing value as "derive from the
1119
+ other fields".
799
1120
  OpsItemPriorityOrNull:
800
1121
  anyOf:
801
1122
  - $ref: "#/OpsItemPriority"
@@ -923,10 +1244,220 @@ LinkPrToOpsItemResponse:
923
1244
  id:
924
1245
  type: string
925
1246
  description: Item id that was updated.
1247
+ pr:
1248
+ anyOf:
1249
+ - $ref: "#/GithubPrLink"
1250
+ - type: "null"
1251
+ description: "The PR link now recorded on the item (`connectorData.github.pr`), or `null` after an unlink (`prNumber: null`)."
926
1252
  required:
927
1253
  - id
1254
+ - pr
928
1255
  additionalProperties: false
929
- description: Response for the update / link-pr endpoints.
1256
+ description: Response for `POST /api/admin/ops/{handle}/link-pr` — the item id and the resulting PR link.
1257
+ AckOpsItemRequest:
1258
+ type: object
1259
+ properties:
1260
+ agent:
1261
+ type: string
1262
+ enum:
1263
+ - claude
1264
+ - cursor
1265
+ - copilot
1266
+ - jules
1267
+ - gemini
1268
+ - jarvis
1269
+ description: >-
1270
+ The AI agent type acking on the item's behalf — pass your own type when
1271
+ you are a coding agent (Claude Code passes `claude`, Cursor `cursor`,
1272
+ Copilot `copilot`, Jules/Gemini `jules`). Omit entirely for a human ack
1273
+ by the authenticated caller.
1274
+ sessionId:
1275
+ type: string
1276
+ maxLength: 300
1277
+ description: >-
1278
+ The agent-run session id (e.g. Claude's `session_01…`), so the dashboard
1279
+ can deep-link to the exact run page. Omit when the harness has no
1280
+ session id.
1281
+ additionalProperties: false
1282
+ description: >-
1283
+ Body for `POST /api/admin/ops/{handle}/ack`. With `agent` set this is an AI
1284
+ ack — the named agent type must have a connected trigger connector in the
1285
+ project, or the call fails with `AGENT_NOT_CONNECTED` and instructions to
1286
+ query the available agents (`ops agents list`). `gemini` is accepted as an
1287
+ alias for `jules`. Without `agent` it is a HUMAN ack by the authenticated
1288
+ caller.
1289
+ AckOpsItemResponse:
1290
+ type: object
1291
+ properties:
1292
+ id:
1293
+ type: string
1294
+ description: Item id that was acked.
1295
+ number:
1296
+ anyOf:
1297
+ - type: number
1298
+ - type: "null"
1299
+ description: Per-project item number.
1300
+ status:
1301
+ type: string
1302
+ description: The working status the ack moved the item into (`investigating_by_ai` for an AI ack, `in_progress` for a human one).
1303
+ runId:
1304
+ type: string
1305
+ description: Id of the run record the ack opened.
1306
+ agent:
1307
+ anyOf:
1308
+ - type: string
1309
+ - type: "null"
1310
+ description: The AI agent type working the item; `null` for a human ack.
1311
+ connectorName:
1312
+ anyOf:
1313
+ - type: string
1314
+ - type: "null"
1315
+ description: Display name of the connected agent (the connector's name); `null` for a human ack.
1316
+ sessionId:
1317
+ anyOf:
1318
+ - type: string
1319
+ - type: "null"
1320
+ description: The session id recorded on the run, if one was supplied.
1321
+ startedAt:
1322
+ type: string
1323
+ description: ISO-8601 timestamp the run started (the ack time).
1324
+ required:
1325
+ - id
1326
+ - number
1327
+ - status
1328
+ - runId
1329
+ - agent
1330
+ - connectorName
1331
+ - sessionId
1332
+ - startedAt
1333
+ additionalProperties: false
1334
+ description: Response for `POST /api/admin/ops/{handle}/ack` — the opened run.
1335
+ OpsAgentProfile:
1336
+ type: object
1337
+ properties:
1338
+ connectorId:
1339
+ type: string
1340
+ description: The connector row id — what an agent assignment stores.
1341
+ provider:
1342
+ type: string
1343
+ enum:
1344
+ - claude_trigger
1345
+ - cursor_trigger
1346
+ - copilot_trigger
1347
+ - jules_trigger
1348
+ description: The trigger-connector provider backing this agent.
1349
+ name:
1350
+ type: string
1351
+ description: Display name — the connector's `name`, or the provider default (e.g. "Claude").
1352
+ handle:
1353
+ type: string
1354
+ description: Mention/search handle — the kebab-cased name (e.g. `claude`).
1355
+ required:
1356
+ - connectorId
1357
+ - provider
1358
+ - name
1359
+ - handle
1360
+ additionalProperties: false
1361
+ description: One connected, assignable AI agent (an authenticated trigger connector).
1362
+ ListOpsAgentsResponse:
1363
+ type: array
1364
+ items:
1365
+ $ref: "#/OpsAgentProfile"
1366
+ description: >-
1367
+ The project's connected AI agents — the agent types `POST
1368
+ /api/admin/ops/{handle}/ack` accepts. Empty when no trigger connector is
1369
+ connected yet.
1370
+ OpsCommentAuthorType:
1371
+ type: string
1372
+ enum:
1373
+ - user
1374
+ - system
1375
+ description: >-
1376
+ Who wrote a comment. `user` is a teammate (their email is in `authorEmail`);
1377
+ `system` is Jarvis — the AI agent — which authors comments when an ops-notify
1378
+ escalation lands on the item and when it is `@shipeasy`-mentioned in a thread.
1379
+ OpsComment:
1380
+ type: object
1381
+ properties:
1382
+ id:
1383
+ type: string
1384
+ description: Comment id.
1385
+ feedbackId:
1386
+ type: string
1387
+ description: The queue item this comment hangs off.
1388
+ parentId:
1389
+ anyOf:
1390
+ - type: string
1391
+ - type: "null"
1392
+ description: The top-level comment this is a reply to, or `null` for a top-level comment.
1393
+ authorType:
1394
+ $ref: "#/OpsCommentAuthorType"
1395
+ authorEmail:
1396
+ anyOf:
1397
+ - type: string
1398
+ - type: "null"
1399
+ description: The teammate who wrote it, or `null` for a `system` (Jarvis) comment.
1400
+ body:
1401
+ type: string
1402
+ description: Comment body as markdown (may contain sanitised inline image/video embeds).
1403
+ createdAt:
1404
+ type: string
1405
+ description: ISO-8601 creation timestamp.
1406
+ updatedAt:
1407
+ type: string
1408
+ description: ISO-8601 last-edit timestamp.
1409
+ required:
1410
+ - id
1411
+ - feedbackId
1412
+ - parentId
1413
+ - authorType
1414
+ - authorEmail
1415
+ - body
1416
+ - createdAt
1417
+ - updatedAt
1418
+ additionalProperties: false
1419
+ description: A single comment on a queue item.
1420
+ ListOpsCommentsResponse:
1421
+ type: object
1422
+ properties:
1423
+ comments:
1424
+ type: array
1425
+ items:
1426
+ $ref: "#/OpsComment"
1427
+ required:
1428
+ - comments
1429
+ additionalProperties: false
1430
+ description: Response for `GET /api/admin/ops/{handle}/comments` — the thread, oldest first.
1431
+ CreateOpsCommentRequest:
1432
+ type: object
1433
+ properties:
1434
+ body:
1435
+ type: string
1436
+ minLength: 1
1437
+ maxLength: 10000
1438
+ description: The comment body as markdown. Mentions (`@teammate`, `@shipeasy`) are parsed from it.
1439
+ parentId:
1440
+ anyOf:
1441
+ - type: string
1442
+ - type: "null"
1443
+ description: >-
1444
+ Reply under this top-level comment. Omit / `null` for a top-level
1445
+ comment. Replying to a reply attaches to the same top-level parent
1446
+ (threading is one level deep).
1447
+ required:
1448
+ - body
1449
+ additionalProperties: false
1450
+ description: Body for `POST /api/admin/ops/{handle}/comments`.
1451
+ CreateOpsCommentResponse:
1452
+ type: object
1453
+ properties:
1454
+ id:
1455
+ type: string
1456
+ description: Newly created comment id.
1457
+ required:
1458
+ - id
1459
+ additionalProperties: false
1460
+ description: Response for `POST /api/admin/ops/{handle}/comments`.
930
1461
  NotifyOpsRequest:
931
1462
  type: object
932
1463
  properties:
@@ -1011,3 +1542,361 @@ ListSlackChannelsResponse:
1011
1542
  - channels
1012
1543
  additionalProperties: false
1013
1544
  description: Response for `GET /api/admin/slack/channels`.
1545
+ DeleteOpsItemResponse:
1546
+ type: object
1547
+ properties:
1548
+ ok:
1549
+ type: boolean
1550
+ const: true
1551
+ description: Always `true` — the item (and its comments, attachments, tags, and investigation records) was deleted.
1552
+ required:
1553
+ - ok
1554
+ additionalProperties: false
1555
+ description: Response for `DELETE /api/admin/ops/{handle}`.
1556
+ OpsInvestigation:
1557
+ type: object
1558
+ properties:
1559
+ id:
1560
+ type: string
1561
+ description: Investigation record id.
1562
+ feedbackId:
1563
+ type: string
1564
+ description: The queue item this record hangs off.
1565
+ kind:
1566
+ type: string
1567
+ enum:
1568
+ - investigated
1569
+ - detected
1570
+ - question
1571
+ - ready_for_qa
1572
+ - working
1573
+ - note
1574
+ description: "Which lifecycle stage the record documents — mirrors the investigation-state buckets the cockpit renders. `working` records double as run rows (see `OpsRun`)."
1575
+ summary:
1576
+ anyOf:
1577
+ - type: string
1578
+ - type: "null"
1579
+ description: One-line summary of the record, or `null`.
1580
+ findings:
1581
+ anyOf:
1582
+ - type: string
1583
+ - type: "null"
1584
+ description: The agent's full findings write-up (markdown), or `null`.
1585
+ question:
1586
+ anyOf:
1587
+ - type: string
1588
+ - type: "null"
1589
+ description: A blocking question for the team (markdown), or `null`.
1590
+ qaNotes:
1591
+ anyOf:
1592
+ - type: string
1593
+ - type: "null"
1594
+ description: How to verify the fix — QA notes (markdown), or `null`.
1595
+ agent:
1596
+ anyOf:
1597
+ - type: string
1598
+ enum:
1599
+ - jarvis
1600
+ - claude
1601
+ - cursor
1602
+ - copilot
1603
+ - jules
1604
+ - type: "null"
1605
+ description: Which agent produced the record (`jarvis` is the in-house assistant; the rest are trigger-connector coding agents), or `null`.
1606
+ model:
1607
+ anyOf:
1608
+ - type: string
1609
+ - type: "null"
1610
+ description: The model the agent ran on (self-reported), or `null`.
1611
+ connectorId:
1612
+ anyOf:
1613
+ - type: string
1614
+ - type: "null"
1615
+ description: The trigger-connector row id the agent ran through, or `null`.
1616
+ prNumber:
1617
+ anyOf:
1618
+ - type: number
1619
+ - type: "null"
1620
+ description: A PR the record references (e.g. the run's fixing PR), or `null`.
1621
+ prUrl:
1622
+ anyOf:
1623
+ - type: string
1624
+ - type: "null"
1625
+ description: HTML URL of that PR, or `null`.
1626
+ sources:
1627
+ anyOf:
1628
+ - type: array
1629
+ items:
1630
+ type: object
1631
+ properties:
1632
+ path:
1633
+ type: string
1634
+ description: Repo-relative file path the agent inspected.
1635
+ url:
1636
+ type: string
1637
+ description: External link the agent consulted.
1638
+ label:
1639
+ type: string
1640
+ description: Human-readable label for the source.
1641
+ additionalProperties: false
1642
+ description: One file/link the agent inspected while producing the record.
1643
+ - type: "null"
1644
+ description: The files/links the agent inspected, or `null`.
1645
+ confidence:
1646
+ anyOf:
1647
+ - type: string
1648
+ enum:
1649
+ - low
1650
+ - medium
1651
+ - high
1652
+ - type: "null"
1653
+ description: The agent's self-reported confidence, or `null`.
1654
+ tokensUsed:
1655
+ anyOf:
1656
+ - type: number
1657
+ - type: "null"
1658
+ description: Tokens the run consumed (self-reported), or `null`.
1659
+ durationMs:
1660
+ anyOf:
1661
+ - type: number
1662
+ - type: "null"
1663
+ description: Run duration in milliseconds, or `null`.
1664
+ visibility:
1665
+ type: string
1666
+ enum:
1667
+ - draft
1668
+ - published
1669
+ description: "`draft` records are the agent's scratch state; only `published` ones render in the panel (and are returned by default)."
1670
+ startedAt:
1671
+ anyOf:
1672
+ - type: string
1673
+ - type: "null"
1674
+ description: ISO-8601 timestamp the work started, or `null`.
1675
+ completedAt:
1676
+ anyOf:
1677
+ - type: string
1678
+ - type: "null"
1679
+ description: ISO-8601 timestamp the work finished, or `null`.
1680
+ sessionId:
1681
+ anyOf:
1682
+ - type: string
1683
+ - type: "null"
1684
+ description: The agent-run session id, or `null`.
1685
+ ackedBy:
1686
+ anyOf:
1687
+ - type: string
1688
+ - type: "null"
1689
+ description: Email of the human who acked (run records for a human ack), or `null`.
1690
+ completedAction:
1691
+ anyOf:
1692
+ - type: string
1693
+ enum:
1694
+ - link_pr
1695
+ - notify
1696
+ - status
1697
+ - superseded
1698
+ - type: "null"
1699
+ description: "Which final action closed a `working` run record, or `null` (open run / non-run record)."
1700
+ createdAt:
1701
+ type: string
1702
+ description: ISO-8601 creation timestamp.
1703
+ updatedAt:
1704
+ type: string
1705
+ description: ISO-8601 last-update timestamp.
1706
+ required:
1707
+ - id
1708
+ - feedbackId
1709
+ - kind
1710
+ - summary
1711
+ - findings
1712
+ - question
1713
+ - qaNotes
1714
+ - agent
1715
+ - model
1716
+ - connectorId
1717
+ - prNumber
1718
+ - prUrl
1719
+ - sources
1720
+ - confidence
1721
+ - tokensUsed
1722
+ - durationMs
1723
+ - visibility
1724
+ - startedAt
1725
+ - completedAt
1726
+ - sessionId
1727
+ - ackedBy
1728
+ - completedAction
1729
+ - createdAt
1730
+ - updatedAt
1731
+ additionalProperties: false
1732
+ description: "One structured investigation record on a queue item — the read-only write-up an AI agent produces while working it (findings / blocking question / QA notes), rendered by the cockpit's detail panel."
1733
+ ListOpsInvestigationsResponse:
1734
+ type: array
1735
+ items:
1736
+ $ref: "#/OpsInvestigation"
1737
+ description: Response for `GET /api/admin/ops/{handle}/investigation` — the item's `published` investigation records, newest first (max 50).
1738
+ CreateOpsInvestigationRequest:
1739
+ type: object
1740
+ properties:
1741
+ kind:
1742
+ type: string
1743
+ enum:
1744
+ - investigated
1745
+ - detected
1746
+ - question
1747
+ - ready_for_qa
1748
+ - working
1749
+ - note
1750
+ description: Which lifecycle stage the record documents.
1751
+ summary:
1752
+ type: string
1753
+ maxLength: 2000
1754
+ description: One-line summary of the record.
1755
+ findings:
1756
+ type: string
1757
+ maxLength: 50000
1758
+ description: The full findings write-up (markdown).
1759
+ question:
1760
+ type: string
1761
+ maxLength: 10000
1762
+ description: A blocking question for the team (markdown).
1763
+ qaNotes:
1764
+ type: string
1765
+ maxLength: 50000
1766
+ description: How to verify the fix — QA notes (markdown).
1767
+ agent:
1768
+ type: string
1769
+ enum:
1770
+ - jarvis
1771
+ - claude
1772
+ - cursor
1773
+ - copilot
1774
+ - jules
1775
+ description: The agent type producing the record — pass your own type when you are a coding agent.
1776
+ model:
1777
+ type: string
1778
+ maxLength: 200
1779
+ description: The model the agent ran on.
1780
+ connectorId:
1781
+ type: string
1782
+ maxLength: 200
1783
+ description: The trigger-connector row id the agent ran through.
1784
+ prNumber:
1785
+ type: integer
1786
+ description: A PR the record references.
1787
+ prUrl:
1788
+ type: string
1789
+ format: uri
1790
+ maxLength: 2000
1791
+ description: HTML URL of that PR.
1792
+ sources:
1793
+ type: array
1794
+ maxItems: 200
1795
+ items:
1796
+ type: object
1797
+ properties:
1798
+ path:
1799
+ type: string
1800
+ description: Repo-relative file path inspected.
1801
+ url:
1802
+ type: string
1803
+ description: External link consulted.
1804
+ label:
1805
+ type: string
1806
+ description: Human-readable label for the source.
1807
+ additionalProperties: false
1808
+ description: One file/link inspected while producing the record.
1809
+ description: The files/links inspected.
1810
+ confidence:
1811
+ type: string
1812
+ enum:
1813
+ - low
1814
+ - medium
1815
+ - high
1816
+ description: Self-reported confidence in the record.
1817
+ tokensUsed:
1818
+ type: integer
1819
+ description: Tokens the run consumed.
1820
+ durationMs:
1821
+ type: integer
1822
+ description: Run duration in milliseconds.
1823
+ visibility:
1824
+ type: string
1825
+ enum:
1826
+ - draft
1827
+ - published
1828
+ description: Record visibility. Defaults to `published`; `draft` keeps it out of the panel.
1829
+ startedAt:
1830
+ type: string
1831
+ description: ISO-8601 timestamp the work started.
1832
+ completedAt:
1833
+ type: string
1834
+ description: ISO-8601 timestamp the work finished.
1835
+ sessionId:
1836
+ type: string
1837
+ maxLength: 300
1838
+ description: The agent-run session id, so the dashboard can deep-link to the run.
1839
+ required:
1840
+ - kind
1841
+ additionalProperties: false
1842
+ description: "Body for `POST /api/admin/ops/{handle}/investigation`. `kind` is required; include at least one content field (`summary`/`findings`/`question`/`qaNotes`) — the panel renders whatever it gets."
1843
+ NotificationFeedItem:
1844
+ type: object
1845
+ properties:
1846
+ id:
1847
+ type: string
1848
+ description: Notification id (pass to the mark-read `POST` to mark just this one).
1849
+ event:
1850
+ type: string
1851
+ description: The notification's event key (e.g. `ops.attention`, `feedback.completed`, `comment.mention`).
1852
+ title:
1853
+ type: string
1854
+ description: One-line headline.
1855
+ body:
1856
+ type: string
1857
+ description: "Notification body. For `ops.attention` escalations: line 1 = summary, following lines = numbered unblock steps."
1858
+ href:
1859
+ anyOf:
1860
+ - type: string
1861
+ - type: "null"
1862
+ description: Dashboard-relative deep link to the related item, or `null`.
1863
+ createdAt:
1864
+ type: string
1865
+ description: ISO-8601 creation timestamp.
1866
+ read:
1867
+ type: boolean
1868
+ description: Whether the notification has been marked read.
1869
+ required:
1870
+ - id
1871
+ - event
1872
+ - title
1873
+ - body
1874
+ - href
1875
+ - createdAt
1876
+ - read
1877
+ additionalProperties: false
1878
+ description: One in-app notification as the bell feed renders it.
1879
+ ListNotificationFeedResponse:
1880
+ type: object
1881
+ properties:
1882
+ notifications:
1883
+ type: array
1884
+ items:
1885
+ $ref: "#/NotificationFeedItem"
1886
+ description: The feed, newest first (max 30). Project-wide broadcasts plus notifications addressed to the caller; events muted for the in-app channel are omitted.
1887
+ unread:
1888
+ type: integer
1889
+ description: Count of the caller's unread (visible, unmuted) notifications.
1890
+ required:
1891
+ - notifications
1892
+ - unread
1893
+ additionalProperties: false
1894
+ description: Response for `GET /api/admin/notifications/feed` — the bell feed plus its unread badge count.
1895
+ MarkNotificationsReadRequest:
1896
+ type: object
1897
+ properties:
1898
+ id:
1899
+ type: string
1900
+ description: Mark just this notification read. Omit to mark the caller's whole feed read.
1901
+ additionalProperties: false
1902
+ description: "Body for `POST /api/admin/notifications/feed`. An empty body (`{}`) marks ALL of the caller's notifications read."