@shipeasy/openapi 2.3.0 → 2.5.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 (46) hide show
  1. package/dist/{chunk-PRN4AEAM.js → chunk-DBTSD3W5.js} +1085 -261
  2. package/dist/chunk-DBTSD3W5.js.map +1 -0
  3. package/dist/{chunk-LYNWK55D.js → chunk-RDMD5XQT.js} +171 -1
  4. package/dist/chunk-RDMD5XQT.js.map +1 -0
  5. package/dist/{client-DO5HTb_L.d.ts → client-ObcuFHaV.d.ts} +5605 -2734
  6. package/dist/client.d.ts +1 -1
  7. package/dist/client.js +47 -1
  8. package/dist/custom.d.ts +9 -4
  9. package/dist/custom.js +57 -9
  10. package/dist/custom.js.map +1 -1
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.js +48 -2
  13. package/dist/index.js.map +1 -1
  14. package/dist/schemas.d.ts +3171 -485
  15. package/dist/schemas.js +229 -1
  16. package/openapi.json +13264 -8071
  17. package/openapi.yaml +5108 -1550
  18. package/package.json +1 -1
  19. package/spec/components/errors.yaml +3 -0
  20. package/spec/components/schemas/alerts.yaml +138 -0
  21. package/spec/components/schemas/attributes.yaml +53 -3
  22. package/spec/components/schemas/common.yaml +10 -0
  23. package/spec/components/schemas/configs.yaml +91 -3
  24. package/spec/components/schemas/connectors.yaml +5 -1
  25. package/spec/components/schemas/errors-api.yaml +51 -4
  26. package/spec/components/schemas/experiments.yaml +347 -87
  27. package/spec/components/schemas/gates.yaml +350 -277
  28. package/spec/components/schemas/i18n.yaml +169 -40
  29. package/spec/components/schemas/killswitches.yaml +36 -0
  30. package/spec/components/schemas/metrics.yaml +199 -7
  31. package/spec/components/schemas/ops.yaml +961 -29
  32. package/spec/components/schemas/projects.yaml +129 -3
  33. package/spec/openapi.yaml +58 -0
  34. package/spec/paths/alerts.yaml +184 -0
  35. package/spec/paths/attributes.yaml +23 -5
  36. package/spec/paths/configs.yaml +98 -21
  37. package/spec/paths/errors.yaml +16 -0
  38. package/spec/paths/experiments.yaml +236 -16
  39. package/spec/paths/gates.yaml +137 -0
  40. package/spec/paths/i18n.yaml +290 -6
  41. package/spec/paths/killswitches.yaml +6 -0
  42. package/spec/paths/metrics.yaml +186 -0
  43. package/spec/paths/ops.yaml +382 -0
  44. package/spec/paths/projects.yaml +60 -0
  45. package/dist/chunk-LYNWK55D.js.map +0 -1
  46. package/dist/chunk-PRN4AEAM.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,142 @@ 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
+ sessionUrl:
360
+ anyOf:
361
+ - type: string
362
+ - type: "null"
363
+ description: "The run's session-page deep link, or `null`. DERIVED (never stored): rebuilt from `sessionId` + the run's trigger connector — Claude's routine id (`?trigger=`), Copilot's repo (`/tasks/`), Cursor/Jules from the id alone."
364
+ startedAt:
365
+ type: string
366
+ description: ISO-8601 timestamp the run started (the ack time).
367
+ completedAt:
368
+ anyOf:
369
+ - type: string
370
+ - type: "null"
371
+ description: ISO-8601 timestamp the run closed, or `null` while still open.
372
+ completedAction:
373
+ $ref: "#/OpsRunActionOrNull"
374
+ prNumber:
375
+ anyOf:
376
+ - type: number
377
+ - type: "null"
378
+ description: The PR the run linked as its final action, or `null`.
379
+ prUrl:
380
+ anyOf:
381
+ - type: string
382
+ - type: "null"
383
+ description: HTML URL of that PR, or `null`.
384
+ required:
385
+ - id
386
+ - agent
387
+ - connectorId
388
+ - ackedBy
389
+ - sessionId
390
+ - sessionUrl
391
+ - startedAt
392
+ - completedAt
393
+ - completedAction
394
+ - prNumber
395
+ - prUrl
396
+ additionalProperties: false
397
+ 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
398
  OpsItemContext:
155
399
  type: object
156
400
  properties:
@@ -162,6 +406,38 @@ OpsItemContext:
162
406
  $ref: "#/OpsAlertContext"
163
407
  measurePlan:
164
408
  $ref: "#/OpsMeasurePlanContext"
409
+ errorChart:
410
+ type: object
411
+ properties:
412
+ series:
413
+ type: array
414
+ items:
415
+ type: object
416
+ properties:
417
+ t:
418
+ type: number
419
+ description: Bucket start — unix epoch **milliseconds** (hourly buckets).
420
+ v:
421
+ type: number
422
+ description: Occurrence count in the bucket (sample-rate weighted).
423
+ required:
424
+ - t
425
+ - v
426
+ additionalProperties: {}
427
+ description: One hourly occurrence bucket.
428
+ description: Hourly occurrence buckets, oldest first. Hours with no occurrences are omitted.
429
+ domainFrom:
430
+ type: number
431
+ description: Chart domain start — unix epoch milliseconds (24h before the read).
432
+ domainTo:
433
+ type: number
434
+ description: Chart domain end — unix epoch milliseconds (the read time).
435
+ required:
436
+ - series
437
+ - domainFrom
438
+ - domainTo
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."
165
441
  additionalProperties: {}
166
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."
167
443
  OpsBrowserContext:
@@ -555,33 +831,35 @@ GithubConnectorData:
555
831
  additionalProperties: {}
556
832
  description: The GitHub issue this item opened.
557
833
  pr:
558
- type: object
559
- properties:
560
- number:
561
- type: number
562
- description: Pull request number.
563
- url:
564
- type: string
565
- description: HTML URL of the linked pull request.
566
- linkedAt:
567
- type: string
568
- description: ISO-8601 timestamp the PR was linked.
569
- connectedToIssue:
570
- type: boolean
571
- description: "Whether the PR was wired to the issue on GitHub (via a closing keyword or a comment)."
572
- method:
573
- type: string
574
- enum:
575
- - closes
576
- - comment
577
- description: How the PR was connected to the issue.
578
- required:
579
- - number
580
- - url
581
- additionalProperties: {}
582
- description: The pull request linked to this item via `link-pr`.
834
+ $ref: "#/GithubPrLink"
583
835
  additionalProperties: {}
584
836
  description: "GitHub connector trace — the issue it opened and, once linked, the pull request."
837
+ GithubPrLink:
838
+ type: object
839
+ properties:
840
+ number:
841
+ type: number
842
+ description: Pull request number.
843
+ url:
844
+ type: string
845
+ description: HTML URL of the linked pull request.
846
+ linkedAt:
847
+ type: string
848
+ description: ISO-8601 timestamp the PR was linked.
849
+ connectedToIssue:
850
+ type: boolean
851
+ description: "Whether the PR was wired to the issue on GitHub (via a closing keyword or a comment)."
852
+ method:
853
+ type: string
854
+ enum:
855
+ - closes
856
+ - comment
857
+ description: How the PR was connected to the issue.
858
+ required:
859
+ - number
860
+ - url
861
+ additionalProperties: {}
862
+ description: The pull request linked to a queue item via `link-pr` (stored on `connectorData.github.pr`).
585
863
  SlackConnectorData:
586
864
  type: object
587
865
  properties:
@@ -638,6 +916,28 @@ CreateBugRequest:
638
916
  - $ref: "#/OpsItemPriority"
639
917
  - type: "null"
640
918
  description: Initial triage priority, or `null`.
919
+ status:
920
+ anyOf:
921
+ - $ref: "#/OpsItemStatus"
922
+ description: Initial lifecycle status; defaults to `open` when omitted.
923
+ assigneeId:
924
+ anyOf:
925
+ - type: string
926
+ - type: "null"
927
+ description: The `users.id` of the person to assign as owner at creation, or `null`.
928
+ subscribers:
929
+ type: array
930
+ items:
931
+ type: string
932
+ format: email
933
+ default: []
934
+ description: Emails of teammates to subscribe to this item's Slack pings at creation.
935
+ tags:
936
+ type: array
937
+ items:
938
+ type: string
939
+ default: []
940
+ description: Tag names to attach at creation (get-or-created by name, deduped case-insensitively).
641
941
  reporterEmail:
642
942
  anyOf:
643
943
  - type: string
@@ -707,6 +1007,28 @@ CreateFeatureRequestRequest:
707
1007
  - $ref: "#/OpsItemPriority"
708
1008
  - type: "null"
709
1009
  description: Initial triage priority, or `null`.
1010
+ status:
1011
+ anyOf:
1012
+ - $ref: "#/OpsItemStatus"
1013
+ description: Initial lifecycle status; defaults to `open` when omitted.
1014
+ assigneeId:
1015
+ anyOf:
1016
+ - type: string
1017
+ - type: "null"
1018
+ description: The `users.id` of the person to assign as owner at creation, or `null`.
1019
+ subscribers:
1020
+ type: array
1021
+ items:
1022
+ type: string
1023
+ format: email
1024
+ default: []
1025
+ description: Emails of teammates to subscribe to this item's Slack pings at creation.
1026
+ tags:
1027
+ type: array
1028
+ items:
1029
+ type: string
1030
+ default: []
1031
+ description: Tag names to attach at creation (get-or-created by name, deduped case-insensitively).
710
1032
  reporterEmail:
711
1033
  anyOf:
712
1034
  - type: string
@@ -773,17 +1095,23 @@ OpsItemStatus:
773
1095
  - pending_approval
774
1096
  - triage
775
1097
  - triaged
1098
+ - investigating_by_ai
776
1099
  - in_progress
1100
+ - blocked
777
1101
  - ready_for_qa
778
1102
  - resolved
779
1103
  - wont_fix
780
1104
  description: >-
781
1105
  Lifecycle status of a queue item. The working flow is `open` → `triaged` →
782
1106
  `in_progress` → `ready_for_qa` → `resolved` (or `wont_fix`, terminal from
783
- any earlier stage). `ready_for_qa` is what a developer sets once a fix
1107
+ any earlier stage). `blocked` marks an item that can't progress until an
1108
+ external dependency clears — a working state a human sets and clears.
1109
+ `ready_for_qa` is what a developer sets once a fix
784
1110
  lands; `resolved` is the QA sign-off, normally flipped in the dashboard
785
1111
  after verification — set it directly from code only when the fix has been
786
- verified end-to-end. Two
1112
+ verified end-to-end. `investigating_by_ai` is a system-owned display state —
1113
+ set when the AI agent (Jarvis) picks an item up to investigate, never chosen
1114
+ by a human — so it is shown but not offered as a manual choice. Two
787
1115
  human-gated holding states park an item OUT of the work queue until a human
788
1116
  promotes it to `open` in the dashboard, so `GET /api/admin/ops` excludes
789
1117
  them under `status=all`/default and returns them only when requested as an
@@ -806,6 +1134,31 @@ OpsItemPriority:
806
1134
  Triage priority of a queue item. The lowest tier is `nice_to_have` (not
807
1135
  `low`) — carried over from the feature-request "importance" scale this
808
1136
  priority set replaced.
1137
+ OpsInvestigationState:
1138
+ type: string
1139
+ enum:
1140
+ - pr_ready
1141
+ - investigated
1142
+ - detected
1143
+ - question
1144
+ - ready_for_qa
1145
+ - pending_approval
1146
+ - needs_triage
1147
+ - working
1148
+ - triaged_low
1149
+ - backlog
1150
+ description: >-
1151
+ Where automation has taken an item in the investigation lifecycle — the
1152
+ signal the ops cockpit renders as "what AI did" plus the one action expected
1153
+ of the user. It is **written as a side-effect of the actions that already
1154
+ happen**, never authored on its own: linking a PR sets `pr_ready`, moving to
1155
+ `in_progress` sets `working`, `ready_for_qa` sets `ready_for_qa`, a
1156
+ system/assistant reply sets `question`, resolving clears it, and creation
1157
+ seeds `needs_triage`/`backlog` (by priority) or `investigated`/`detected`
1158
+ for auto-filed error/alert tickets. `triaged_low` marks a low-signal item AI
1159
+ has looked at but that nothing is moving. Absent on rows filed before the
1160
+ field existed — consumers should treat a missing value as "derive from the
1161
+ other fields".
809
1162
  OpsItemPriorityOrNull:
810
1163
  anyOf:
811
1164
  - $ref: "#/OpsItemPriority"
@@ -816,6 +1169,22 @@ OpsItemNotifyOrNull:
816
1169
  - $ref: ./common.yaml#/NotificationTarget
817
1170
  - type: "null"
818
1171
  description: Where this item's completion notification lands, or `null`.
1172
+ OpsRunAction:
1173
+ type: string
1174
+ enum:
1175
+ - link_pr
1176
+ - notify
1177
+ - status
1178
+ - superseded
1179
+ description: >-
1180
+ The final action that closed a run record — `link_pr`/`notify` are the
1181
+ agent's terminal ops actions, `status` a completion status flip
1182
+ (ready_for_qa/resolved), `superseded` a newer ack replacing an open run.
1183
+ OpsRunActionOrNull:
1184
+ anyOf:
1185
+ - $ref: "#/OpsRunAction"
1186
+ - type: "null"
1187
+ description: Which final action closed the run, or `null` while it is open (or a non-run record).
819
1188
  UpdateOpsItemStatusRequest:
820
1189
  type: object
821
1190
  properties:
@@ -933,10 +1302,129 @@ LinkPrToOpsItemResponse:
933
1302
  id:
934
1303
  type: string
935
1304
  description: Item id that was updated.
1305
+ pr:
1306
+ anyOf:
1307
+ - $ref: "#/GithubPrLink"
1308
+ - type: "null"
1309
+ description: "The PR link now recorded on the item (`connectorData.github.pr`), or `null` after an unlink (`prNumber: null`)."
936
1310
  required:
937
1311
  - id
1312
+ - pr
938
1313
  additionalProperties: false
939
- description: Response for the update / link-pr endpoints.
1314
+ description: Response for `POST /api/admin/ops/{handle}/link-pr` — the item id and the resulting PR link.
1315
+ AckOpsItemRequest:
1316
+ type: object
1317
+ properties:
1318
+ agent:
1319
+ type: string
1320
+ enum:
1321
+ - claude
1322
+ - cursor
1323
+ - copilot
1324
+ - jules
1325
+ - gemini
1326
+ - jarvis
1327
+ description: >-
1328
+ The AI agent type acking on the item's behalf — pass your own type when
1329
+ you are a coding agent (Claude Code passes `claude`, Cursor `cursor`,
1330
+ Copilot `copilot`, Jules/Gemini `jules`). Omit entirely for a human ack
1331
+ by the authenticated caller.
1332
+ sessionId:
1333
+ type: string
1334
+ maxLength: 300
1335
+ description: >-
1336
+ The agent-run session id (e.g. Claude's `session_01…`), so the dashboard
1337
+ can deep-link to the exact run page. Omit when the harness has no
1338
+ session id.
1339
+ additionalProperties: false
1340
+ description: >-
1341
+ Body for `POST /api/admin/ops/{handle}/ack`. With `agent` set this is an AI
1342
+ ack — the named agent type must have a connected trigger connector in the
1343
+ project, or the call fails with `AGENT_NOT_CONNECTED` and instructions to
1344
+ query the available agents (`ops agents list`). `gemini` is accepted as an
1345
+ alias for `jules`. Without `agent` it is a HUMAN ack by the authenticated
1346
+ caller.
1347
+ AckOpsItemResponse:
1348
+ type: object
1349
+ properties:
1350
+ id:
1351
+ type: string
1352
+ description: Item id that was acked.
1353
+ number:
1354
+ anyOf:
1355
+ - type: number
1356
+ - type: "null"
1357
+ description: Per-project item number.
1358
+ status:
1359
+ type: string
1360
+ description: The working status the ack moved the item into (`investigating_by_ai` for an AI ack, `in_progress` for a human one).
1361
+ runId:
1362
+ type: string
1363
+ description: Id of the run record the ack opened.
1364
+ agent:
1365
+ anyOf:
1366
+ - type: string
1367
+ - type: "null"
1368
+ description: The AI agent type working the item; `null` for a human ack.
1369
+ connectorName:
1370
+ anyOf:
1371
+ - type: string
1372
+ - type: "null"
1373
+ description: Display name of the connected agent (the connector's name); `null` for a human ack.
1374
+ sessionId:
1375
+ anyOf:
1376
+ - type: string
1377
+ - type: "null"
1378
+ description: The session id recorded on the run, if one was supplied.
1379
+ startedAt:
1380
+ type: string
1381
+ description: ISO-8601 timestamp the run started (the ack time).
1382
+ required:
1383
+ - id
1384
+ - number
1385
+ - status
1386
+ - runId
1387
+ - agent
1388
+ - connectorName
1389
+ - sessionId
1390
+ - startedAt
1391
+ additionalProperties: false
1392
+ description: Response for `POST /api/admin/ops/{handle}/ack` — the opened run.
1393
+ OpsAgentProfile:
1394
+ type: object
1395
+ properties:
1396
+ connectorId:
1397
+ type: string
1398
+ description: The connector row id — what an agent assignment stores.
1399
+ provider:
1400
+ type: string
1401
+ enum:
1402
+ - claude_trigger
1403
+ - cursor_trigger
1404
+ - copilot_trigger
1405
+ - jules_trigger
1406
+ description: The trigger-connector provider backing this agent.
1407
+ name:
1408
+ type: string
1409
+ description: Display name — the connector's `name`, or the provider default (e.g. "Claude").
1410
+ handle:
1411
+ type: string
1412
+ description: Mention/search handle — the kebab-cased name (e.g. `claude`).
1413
+ required:
1414
+ - connectorId
1415
+ - provider
1416
+ - name
1417
+ - handle
1418
+ additionalProperties: false
1419
+ description: One connected, assignable AI agent (an authenticated trigger connector).
1420
+ ListOpsAgentsResponse:
1421
+ type: array
1422
+ items:
1423
+ $ref: "#/OpsAgentProfile"
1424
+ description: >-
1425
+ The project's connected AI agents — the agent types `POST
1426
+ /api/admin/ops/{handle}/ack` accepts. Empty when no trigger connector is
1427
+ connected yet.
940
1428
  OpsCommentAuthorType:
941
1429
  type: string
942
1430
  enum:
@@ -1112,3 +1600,447 @@ ListSlackChannelsResponse:
1112
1600
  - channels
1113
1601
  additionalProperties: false
1114
1602
  description: Response for `GET /api/admin/slack/channels`.
1603
+ DeleteOpsItemResponse:
1604
+ type: object
1605
+ properties:
1606
+ ok:
1607
+ type: boolean
1608
+ const: true
1609
+ description: Always `true` — the item (and its comments, attachments, tags, and investigation records) was deleted.
1610
+ required:
1611
+ - ok
1612
+ additionalProperties: false
1613
+ description: Response for `DELETE /api/admin/ops/{handle}`.
1614
+ OpsInvestigation:
1615
+ type: object
1616
+ properties:
1617
+ id:
1618
+ type: string
1619
+ description: Investigation record id.
1620
+ feedbackId:
1621
+ type: string
1622
+ description: The queue item this record hangs off.
1623
+ kind:
1624
+ type: string
1625
+ enum:
1626
+ - investigated
1627
+ - detected
1628
+ - question
1629
+ - ready_for_qa
1630
+ - working
1631
+ - note
1632
+ description: "Which lifecycle stage the record documents — mirrors the investigation-state buckets the cockpit renders. `working` records double as run rows (see `OpsRun`)."
1633
+ summary:
1634
+ anyOf:
1635
+ - type: string
1636
+ - type: "null"
1637
+ description: One-line summary of the record, or `null`.
1638
+ findings:
1639
+ anyOf:
1640
+ - type: string
1641
+ - type: "null"
1642
+ description: The agent's full findings write-up (markdown), or `null`.
1643
+ question:
1644
+ anyOf:
1645
+ - type: string
1646
+ - type: "null"
1647
+ description: A blocking question for the team (markdown), or `null`.
1648
+ qaNotes:
1649
+ anyOf:
1650
+ - type: string
1651
+ - type: "null"
1652
+ description: How to verify the fix — QA notes (markdown), or `null`.
1653
+ agent:
1654
+ anyOf:
1655
+ - type: string
1656
+ enum:
1657
+ - jarvis
1658
+ - claude
1659
+ - cursor
1660
+ - copilot
1661
+ - jules
1662
+ - type: "null"
1663
+ description: Which agent produced the record (`jarvis` is the in-house assistant; the rest are trigger-connector coding agents), or `null`.
1664
+ model:
1665
+ anyOf:
1666
+ - type: string
1667
+ - type: "null"
1668
+ description: The model the agent ran on (self-reported), or `null`.
1669
+ connectorId:
1670
+ anyOf:
1671
+ - type: string
1672
+ - type: "null"
1673
+ description: The trigger-connector row id the agent ran through, or `null`.
1674
+ prNumber:
1675
+ anyOf:
1676
+ - type: number
1677
+ - type: "null"
1678
+ description: A PR the record references (e.g. the run's fixing PR), or `null`.
1679
+ prUrl:
1680
+ anyOf:
1681
+ - type: string
1682
+ - type: "null"
1683
+ description: HTML URL of that PR, or `null`.
1684
+ sources:
1685
+ anyOf:
1686
+ - type: array
1687
+ items:
1688
+ type: object
1689
+ properties:
1690
+ path:
1691
+ type: string
1692
+ description: Repo-relative file path the agent inspected.
1693
+ url:
1694
+ type: string
1695
+ description: External link the agent consulted.
1696
+ label:
1697
+ type: string
1698
+ description: Human-readable label for the source.
1699
+ additionalProperties: false
1700
+ description: One file/link the agent inspected while producing the record.
1701
+ - type: "null"
1702
+ description: The files/links the agent inspected, or `null`.
1703
+ confidence:
1704
+ anyOf:
1705
+ - type: string
1706
+ enum:
1707
+ - low
1708
+ - medium
1709
+ - high
1710
+ - type: "null"
1711
+ description: The agent's self-reported confidence, or `null`.
1712
+ tokensUsed:
1713
+ anyOf:
1714
+ - type: number
1715
+ - type: "null"
1716
+ description: Tokens the run consumed (self-reported), or `null`.
1717
+ durationMs:
1718
+ anyOf:
1719
+ - type: number
1720
+ - type: "null"
1721
+ description: Run duration in milliseconds, or `null`.
1722
+ visibility:
1723
+ type: string
1724
+ enum:
1725
+ - draft
1726
+ - published
1727
+ description: "`draft` records are the agent's scratch state; only `published` ones render in the panel (and are returned by default)."
1728
+ startedAt:
1729
+ anyOf:
1730
+ - type: string
1731
+ - type: "null"
1732
+ description: ISO-8601 timestamp the work started, or `null`.
1733
+ completedAt:
1734
+ anyOf:
1735
+ - type: string
1736
+ - type: "null"
1737
+ description: ISO-8601 timestamp the work finished, or `null`.
1738
+ sessionId:
1739
+ anyOf:
1740
+ - type: string
1741
+ - type: "null"
1742
+ description: "The agent-run session id, or `null`."
1743
+ sessionUrl:
1744
+ anyOf:
1745
+ - type: string
1746
+ - type: "null"
1747
+ description: "The run's session-page deep link, or `null`. DERIVED (never stored): rebuilt from `sessionId` + the run's trigger connector — Claude's routine id (`?trigger=`), Copilot's repo (`/tasks/`), Cursor/Jules from the id alone. Only `working` run records carry one."
1748
+ ackedBy:
1749
+ anyOf:
1750
+ - type: string
1751
+ - type: "null"
1752
+ description: Email of the human who acked (run records for a human ack), or `null`.
1753
+ completedAction:
1754
+ $ref: "#/OpsRunActionOrNull"
1755
+ createdAt:
1756
+ type: string
1757
+ description: ISO-8601 creation timestamp.
1758
+ updatedAt:
1759
+ type: string
1760
+ description: ISO-8601 last-update timestamp.
1761
+ required:
1762
+ - id
1763
+ - feedbackId
1764
+ - kind
1765
+ - summary
1766
+ - findings
1767
+ - question
1768
+ - qaNotes
1769
+ - agent
1770
+ - model
1771
+ - connectorId
1772
+ - prNumber
1773
+ - prUrl
1774
+ - sources
1775
+ - confidence
1776
+ - tokensUsed
1777
+ - durationMs
1778
+ - visibility
1779
+ - startedAt
1780
+ - completedAt
1781
+ - sessionId
1782
+ - sessionUrl
1783
+ - ackedBy
1784
+ - completedAction
1785
+ - createdAt
1786
+ - updatedAt
1787
+ additionalProperties: false
1788
+ 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."
1789
+ ListOpsInvestigationsResponse:
1790
+ type: array
1791
+ items:
1792
+ $ref: "#/OpsInvestigation"
1793
+ description: Response for `GET /api/admin/ops/{handle}/investigation` — the item's `published` investigation records, newest first (max 50).
1794
+ CreateOpsInvestigationRequest:
1795
+ type: object
1796
+ properties:
1797
+ kind:
1798
+ type: string
1799
+ enum:
1800
+ - investigated
1801
+ - detected
1802
+ - question
1803
+ - ready_for_qa
1804
+ - working
1805
+ - note
1806
+ description: Which lifecycle stage the record documents.
1807
+ summary:
1808
+ type: string
1809
+ maxLength: 2000
1810
+ description: One-line summary of the record.
1811
+ findings:
1812
+ type: string
1813
+ maxLength: 50000
1814
+ description: The full findings write-up (markdown).
1815
+ question:
1816
+ type: string
1817
+ maxLength: 10000
1818
+ description: A blocking question for the team (markdown).
1819
+ qaNotes:
1820
+ type: string
1821
+ maxLength: 50000
1822
+ description: How to verify the fix — QA notes (markdown).
1823
+ agent:
1824
+ type: string
1825
+ enum:
1826
+ - jarvis
1827
+ - claude
1828
+ - cursor
1829
+ - copilot
1830
+ - jules
1831
+ description: The agent type producing the record — pass your own type when you are a coding agent.
1832
+ model:
1833
+ type: string
1834
+ maxLength: 200
1835
+ description: The model the agent ran on.
1836
+ connectorId:
1837
+ type: string
1838
+ maxLength: 200
1839
+ description: The trigger-connector row id the agent ran through.
1840
+ prNumber:
1841
+ type: integer
1842
+ description: A PR the record references.
1843
+ prUrl:
1844
+ type: string
1845
+ format: uri
1846
+ maxLength: 2000
1847
+ description: HTML URL of that PR.
1848
+ sources:
1849
+ type: array
1850
+ maxItems: 200
1851
+ items:
1852
+ type: object
1853
+ properties:
1854
+ path:
1855
+ type: string
1856
+ description: Repo-relative file path inspected.
1857
+ url:
1858
+ type: string
1859
+ description: External link consulted.
1860
+ label:
1861
+ type: string
1862
+ description: Human-readable label for the source.
1863
+ additionalProperties: false
1864
+ description: One file/link inspected while producing the record.
1865
+ description: The files/links inspected.
1866
+ confidence:
1867
+ type: string
1868
+ enum:
1869
+ - low
1870
+ - medium
1871
+ - high
1872
+ description: Self-reported confidence in the record.
1873
+ tokensUsed:
1874
+ type: integer
1875
+ description: Tokens the run consumed.
1876
+ durationMs:
1877
+ type: integer
1878
+ description: Run duration in milliseconds.
1879
+ visibility:
1880
+ type: string
1881
+ enum:
1882
+ - draft
1883
+ - published
1884
+ description: Record visibility. Defaults to `published`; `draft` keeps it out of the panel.
1885
+ startedAt:
1886
+ type: string
1887
+ description: ISO-8601 timestamp the work started.
1888
+ completedAt:
1889
+ type: string
1890
+ description: ISO-8601 timestamp the work finished.
1891
+ sessionId:
1892
+ type: string
1893
+ maxLength: 300
1894
+ description: The agent-run session id, so the dashboard can deep-link to the run.
1895
+ required:
1896
+ - kind
1897
+ additionalProperties: false
1898
+ 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."
1899
+ UpdateOpsInvestigationRequest:
1900
+ type: object
1901
+ properties:
1902
+ kind:
1903
+ type: string
1904
+ enum:
1905
+ - investigated
1906
+ - detected
1907
+ - question
1908
+ - ready_for_qa
1909
+ - working
1910
+ - note
1911
+ description: Reclassify the record's lifecycle stage (e.g. flip a `working` run into `investigated` once findings land).
1912
+ summary:
1913
+ type: string
1914
+ maxLength: 2000
1915
+ description: One-line summary of the record.
1916
+ findings:
1917
+ type: string
1918
+ maxLength: 50000
1919
+ description: The full findings write-up (markdown).
1920
+ question:
1921
+ type: string
1922
+ maxLength: 10000
1923
+ description: A blocking question for the team (markdown).
1924
+ qaNotes:
1925
+ type: string
1926
+ maxLength: 50000
1927
+ description: How to verify the fix — QA notes (markdown).
1928
+ model:
1929
+ type: string
1930
+ maxLength: 200
1931
+ description: The model the agent ran on.
1932
+ prNumber:
1933
+ type: integer
1934
+ description: A PR the record references.
1935
+ prUrl:
1936
+ type: string
1937
+ format: uri
1938
+ maxLength: 2000
1939
+ description: HTML URL of that PR.
1940
+ sources:
1941
+ type: array
1942
+ maxItems: 200
1943
+ items:
1944
+ type: object
1945
+ properties:
1946
+ path:
1947
+ type: string
1948
+ description: Repo-relative file path inspected.
1949
+ url:
1950
+ type: string
1951
+ description: External link consulted.
1952
+ label:
1953
+ type: string
1954
+ description: Human-readable label for the source.
1955
+ additionalProperties: false
1956
+ description: One file/link inspected while producing the record.
1957
+ description: The files/links inspected.
1958
+ confidence:
1959
+ type: string
1960
+ enum:
1961
+ - low
1962
+ - medium
1963
+ - high
1964
+ description: Self-reported confidence in the record.
1965
+ tokensUsed:
1966
+ type: integer
1967
+ description: Tokens the run consumed.
1968
+ durationMs:
1969
+ type: integer
1970
+ description: Run duration in milliseconds.
1971
+ visibility:
1972
+ type: string
1973
+ enum:
1974
+ - draft
1975
+ - published
1976
+ description: Record visibility. `draft` keeps it out of the panel; `published` surfaces it.
1977
+ completedAt:
1978
+ type: string
1979
+ description: ISO-8601 timestamp the work finished. Set it (or flip `kind` off `working`) to mark a run record done.
1980
+ sessionId:
1981
+ type: string
1982
+ maxLength: 300
1983
+ description: The agent-run session id, so the dashboard can deep-link to the run.
1984
+ additionalProperties: false
1985
+ minProperties: 1
1986
+ 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."
1987
+ NotificationFeedItem:
1988
+ type: object
1989
+ properties:
1990
+ id:
1991
+ type: string
1992
+ description: Notification id (pass to the mark-read `POST` to mark just this one).
1993
+ event:
1994
+ type: string
1995
+ description: The notification's event key (e.g. `ops.attention`, `feedback.completed`, `comment.mention`).
1996
+ title:
1997
+ type: string
1998
+ description: One-line headline.
1999
+ body:
2000
+ type: string
2001
+ description: "Notification body. For `ops.attention` escalations: line 1 = summary, following lines = numbered unblock steps."
2002
+ href:
2003
+ anyOf:
2004
+ - type: string
2005
+ - type: "null"
2006
+ description: Dashboard-relative deep link to the related item, or `null`.
2007
+ createdAt:
2008
+ type: string
2009
+ description: ISO-8601 creation timestamp.
2010
+ read:
2011
+ type: boolean
2012
+ description: Whether the notification has been marked read.
2013
+ required:
2014
+ - id
2015
+ - event
2016
+ - title
2017
+ - body
2018
+ - href
2019
+ - createdAt
2020
+ - read
2021
+ additionalProperties: false
2022
+ description: One in-app notification as the bell feed renders it.
2023
+ ListNotificationFeedResponse:
2024
+ type: object
2025
+ properties:
2026
+ notifications:
2027
+ type: array
2028
+ items:
2029
+ $ref: "#/NotificationFeedItem"
2030
+ 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.
2031
+ unread:
2032
+ type: integer
2033
+ description: Count of the caller's unread (visible, unmuted) notifications.
2034
+ required:
2035
+ - notifications
2036
+ - unread
2037
+ additionalProperties: false
2038
+ description: Response for `GET /api/admin/notifications/feed` — the bell feed plus its unread badge count.
2039
+ MarkNotificationsReadRequest:
2040
+ type: object
2041
+ properties:
2042
+ id:
2043
+ type: string
2044
+ description: Mark just this notification read. Omit to mark the caller's whole feed read.
2045
+ additionalProperties: false
2046
+ description: "Body for `POST /api/admin/notifications/feed`. An empty body (`{}`) marks ALL of the caller's notifications read."