@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
@@ -0,0 +1,91 @@
1
+ TaggableEntityType:
2
+ type: string
3
+ enum:
4
+ - ops
5
+ - flag
6
+ - config
7
+ - killswitch
8
+ - metric
9
+ - error
10
+ - alert_rule
11
+ - experiment
12
+ description: >-
13
+ The kind of item a tag set hangs off: `ops` (any queue item — bug, feature
14
+ request, error/alert/measure-plan ticket), `flag` (feature gate), `config`
15
+ (dynamic config), `killswitch`, `metric`, `error` (tracked error group),
16
+ `alert_rule`, or `experiment`.
17
+ TagName:
18
+ type: string
19
+ minLength: 1
20
+ maxLength: 64
21
+ description: A tag name. Trimmed; matched case-insensitively against the project's existing tags.
22
+ Tag:
23
+ type: object
24
+ properties:
25
+ id:
26
+ type: string
27
+ description: Stable opaque tag id.
28
+ name:
29
+ type: string
30
+ description: Display name — also the tag's identity, unique case-insensitively within the project.
31
+ required:
32
+ - id
33
+ - name
34
+ additionalProperties: false
35
+ ListTagsResponse:
36
+ type: array
37
+ items:
38
+ $ref: "#/Tag"
39
+ description: The project's tags, sorted by name.
40
+ EntityTagsResponse:
41
+ type: object
42
+ properties:
43
+ entityType:
44
+ $ref: "#/TaggableEntityType"
45
+ entityId:
46
+ type: string
47
+ description: The item's canonical id (the handle you passed, resolved).
48
+ tags:
49
+ type: array
50
+ items:
51
+ type: string
52
+ description: The tag names now attached to the item, sorted by name.
53
+ required:
54
+ - entityType
55
+ - entityId
56
+ - tags
57
+ additionalProperties: false
58
+ SetEntityTagsRequest:
59
+ type: object
60
+ properties:
61
+ tags:
62
+ type: array
63
+ maxItems: 50
64
+ items:
65
+ $ref: "#/TagName"
66
+ description: >-
67
+ The complete tag set the item should carry — tags not listed are
68
+ detached. Names are get-or-created (a new name mints a project tag),
69
+ deduped case-insensitively; `[]` clears every tag.
70
+ required:
71
+ - tags
72
+ additionalProperties: false
73
+ UpdateEntityTagsRequest:
74
+ type: object
75
+ properties:
76
+ add:
77
+ type: array
78
+ maxItems: 50
79
+ items:
80
+ $ref: "#/TagName"
81
+ default: []
82
+ description: Tag names to attach (get-or-created by name, case-insensitive). Already-attached names are a no-op.
83
+ remove:
84
+ type: array
85
+ maxItems: 50
86
+ items:
87
+ $ref: "#/TagName"
88
+ default: []
89
+ description: Tag names to detach (case-insensitive). Names the item doesn't carry are a no-op. A name in both lists is removed.
90
+ additionalProperties: false
91
+ description: Incremental tag edit — pass `add`, `remove`, or both. Every other tag on the item is left as is.
package/spec/openapi.yaml CHANGED
@@ -218,6 +218,24 @@ tags:
218
218
  the AI-write seam the cockpit's detail panel renders: `list` reads what a
219
219
  previous run found, `create` appends a new record, and `update` fills in the
220
220
  `working` run record you were handed (findings, PR, confidence) as you work.
221
+ - name: Questions
222
+ parent: Ops
223
+ description: |-
224
+ Structured questions an agent asks the team about a queue item — the
225
+ `AskUserQuestion` shape: a short `header`, the `question`, 2–4 `options`
226
+ (label + description), and `multiSelect` for checkboxes instead of radios.
227
+ Every question also accepts a free-text "Other" answer. Open questions sit
228
+ at the very top of the item's detail panel and mark the row in the queue.
229
+
230
+ **Asking.** `ask` posts 1–4 questions at once. Several agents (or several
231
+ runs) may have questions open on the same item at the same time.
232
+
233
+ **Getting the answer back.** `delivery: resume` (the default for a run
234
+ launched through a trigger connector) re-fires that same agent on the
235
+ item once every question its run asked is answered, continuing the same
236
+ run record with the answers in the prompt. `delivery: poll` (the default
237
+ for a live, connector-less session such as Claude Code in a terminal)
238
+ fires nothing — call `list` until the status reads `completed`.
221
239
  - name: Projects
222
240
  description: |-
223
241
  Projects: the account-level container every other resource is scoped to.
@@ -260,6 +278,19 @@ tags:
260
278
  Continue) schedule on their own surface — typically a GitHub Actions
261
279
  `schedule:` cron running the platform's headless CLI with the shared
262
280
  trigger prompt.
281
+ - name: Tags
282
+ description: |-
283
+ Tags: free-form, project-scoped labels any item can carry — queue items
284
+ (bugs, feature requests, error/alert tickets), flags, configs, kill
285
+ switches, metrics, tracked errors, alert rules, and experiments all share
286
+ one tag roster.
287
+
288
+ **Identity.** A tag is its name, unique case-insensitively per project. A
289
+ tag is born the first time it's attached — there is no separate create.
290
+
291
+ **Addressing.** An item is named by `entityType` + its handle (an ops
292
+ item's number, a resource's name, or any id). `set` replaces the full tag
293
+ set; `update` adds/removes names incrementally.
263
294
  - name: Connectors
264
295
  description: |-
265
296
  Outbound integrations: the per-project destinations feedback + trigger
@@ -370,6 +401,12 @@ paths:
370
401
  $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1investigation
371
402
  /api/admin/ops/{handle}/investigation/{investigationId}:
372
403
  $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1investigation~1{investigationId}
404
+ /api/admin/ops/{handle}/questions:
405
+ $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1questions
406
+ /api/admin/ops/{handle}/questions/{questionId}/answer:
407
+ $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1questions~1{questionId}~1answer
408
+ /api/admin/ops/{handle}/questions/{questionId}/cancel:
409
+ $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1questions~1{questionId}~1cancel
373
410
  /api/admin/agent-profiles:
374
411
  $ref: ./paths/ops.yaml#/~1api~1admin~1agent-profiles
375
412
  /api/admin/ops/{handle}/comments:
@@ -434,10 +471,16 @@ paths:
434
471
  $ref: ./paths/connectors.yaml#/~1api~1admin~1connectors~1trigger
435
472
  /api/admin/keys:
436
473
  $ref: ./paths/keys.yaml#/~1api~1admin~1keys
474
+ /api/admin/keys/{id}:
475
+ $ref: ./paths/keys.yaml#/~1api~1admin~1keys~1{id}
437
476
  /api/admin/keys/{id}/revoke:
438
477
  $ref: ./paths/keys.yaml#/~1api~1admin~1keys~1{id}~1revoke
439
478
  /api/admin/search:
440
479
  $ref: ./paths/search.yaml#/~1api~1admin~1search
480
+ /api/admin/tags:
481
+ $ref: ./paths/tags.yaml#/~1api~1admin~1tags
482
+ /api/admin/tags/{entityType}/{entityId}:
483
+ $ref: ./paths/tags.yaml#/~1api~1admin~1tags~1{entityType}~1{entityId}
441
484
  components:
442
485
  securitySchemes:
443
486
  bearerSdkKey:
@@ -5,7 +5,9 @@
5
5
  description: |-
6
6
  Returns the project's FIRED alerts as a **bare JSON array** (no pagination envelope), ordered by `createdAt desc`. Defaults to the currently-firing ones (`status=active`); pass a `status` to widen to resolved/dismissed history or `all`.
7
7
 
8
- Fired alerts are raised only by the platform — the UI's killswitch handlers plus the worker's analysis consumer and alerts cron — never filed by hand, so this surface is list + triage (via PATCH), with no create. The rules that *define* metric-threshold alerts live at `/api/admin/alert-rules`.
8
+ A fired alert is an **instance** of an alert rule, and an instance IS its ops queue item — the same row `/api/admin/ops` returns with `type: "alert"`, viewed through the alert lens. One rule produces many instances over its life and at most one is open at a time: when the condition clears the instance closes, and the next firing is a NEW instance with its own id and history. That is why `severity` reads off the rule (the queue item carries it as `priority`) and why resolving the queue item and clearing the alert are one act, not two rows to keep in step.
9
+
10
+ Instances are opened only by the platform — the UI's killswitch handlers plus the worker's analysis consumer and alerts cron — never filed by hand, so this surface is list + triage (via PATCH), with no create. The rules that *define* metric-threshold alerts live at `/api/admin/alert-rules`.
9
11
 
10
12
  **Use case:** Snapshot what is currently firing for an on-call view or the home Alerts block, or pull `status=all` to audit how a noisy rule has behaved over time.
11
13
  tags:
@@ -89,7 +91,7 @@
89
91
  description: |-
90
92
  Triage writes on one fired alert — the only mutations this surface allows. All body fields are optional (at least one required); only the fields present are changed.
91
93
 
92
- - **`status`** — flip between `active` / `resolved` / `dismissed`. `resolved` and `dismissed` stamp `resolvedAt` / `dismissedAt`; `active` re-opens and clears both. A resolved alert re-fires (as the same row, re-activated) if its condition is raised again.
94
+ - **`status`** — flip between `active` / `resolved` / `dismissed`. `resolved` and `dismissed` stamp `resolvedAt` / `dismissedAt`; `active` re-opens and clears both. These write the underlying queue item's own status (`resolved` / `wont_fix` / `open`), so clearing an alert here and resolving it in the ops queue are the same act. A cleared instance is never revived: if the condition fires again it opens a NEW instance with its own id.
93
95
  - **`assigneeId`** — the PERSON owner (a `users.id`), or `null` to unassign.
94
96
  - **`agent`** — the AGENT owner: a connected trigger connector's id, or the built-in `"jarvis"` (**Enterprise plan only** — `403` otherwise), or `null` to clear. Person and agent halves are independent.
95
97
 
@@ -106,7 +108,7 @@
106
108
  - name: id
107
109
  in: path
108
110
  required: true
109
- description: Stable opaque alert id (`al_…`).
111
+ description: Stable opaque instance id — the same id as the `alert` ops item this instance is.
110
112
  schema:
111
113
  $ref: ../components/schemas/common.yaml#/ResourceId
112
114
  requestBody:
@@ -128,11 +128,12 @@
128
128
  - name: limit
129
129
  in: query
130
130
  required: false
131
- description: Max keys to return (1–500).
131
+ description: Max keys to return (1–500). Defaults to 200.
132
132
  schema:
133
133
  type: integer
134
134
  minimum: 1
135
135
  maximum: 500
136
+ default: 200
136
137
  - name: offset
137
138
  in: query
138
139
  required: false
@@ -32,6 +32,7 @@
32
32
  expires_at: null
33
33
  created_by_email: ana@example.com
34
34
  name: production back-end
35
+ description: Held by the checkout service; rotate with the quarterly credential sweep
35
36
  scopes:
36
37
  - gates:evaluate
37
38
  - events:write
@@ -131,6 +132,84 @@
131
132
  - PLAN_LIMIT
132
133
  x-cli:
133
134
  name: create
135
+ /api/admin/keys/{id}:
136
+ patch:
137
+ operationId: updateKey
138
+ summary: Update an API key's label
139
+ description: |-
140
+ Renames a key or re-notes what it is for. **Only `name` and `description` are editable** — everything that gives the key its authority (`type`, `env`, `scopes`, `expires_at`) is fixed at mint, because the worker derives the read env and permissions from the key itself. To change any of those, rotate: mint a replacement and revoke this one.
141
+
142
+ Omitted fields are left untouched; send `null` to clear one. Returns the updated key row. Revoked keys can still be relabelled (the audit trail outlives the credential). Returns `404` if no such key exists in the project.
143
+
144
+ **Use case:** A key minted by `shipeasy setup` carries an auto-composed provenance label — rename it to the service that actually holds it and note the rotation owner.
145
+ tags:
146
+ - API Keys
147
+ parameters:
148
+ - $ref: ../components/parameters.yaml#/ProjectId
149
+ - name: id
150
+ in: path
151
+ required: true
152
+ description: Stable opaque key id (UUID) returned by `create` / `list`.
153
+ schema:
154
+ $ref: ../components/schemas/common.yaml#/ResourceId
155
+ requestBody:
156
+ required: true
157
+ content:
158
+ application/json:
159
+ schema:
160
+ $ref: ../components/schemas/keys.yaml#/UpdateKeyRequest
161
+ examples:
162
+ rename:
163
+ summary: Rename and note the key
164
+ value:
165
+ name: checkout-service · production
166
+ description: Held by the checkout service; rotation owner is the payments team
167
+ clearDescription:
168
+ summary: Clear the note
169
+ value:
170
+ description: null
171
+ responses:
172
+ "200":
173
+ description: Update an API key's label
174
+ content:
175
+ application/json:
176
+ schema:
177
+ $ref: ../components/schemas/keys.yaml#/KeyRecord
178
+ example:
179
+ id: 3f2a9b1c-7d4e-4a8f-9c2b-1e5d6f7a8b90
180
+ type: server
181
+ env: prod
182
+ created_at: 2026-05-09T16:01:22.000Z
183
+ revoked_at: null
184
+ expires_at: null
185
+ created_by_email: ana@example.com
186
+ name: checkout-service · production
187
+ description: Held by the checkout service; rotation owner is the payments team
188
+ scopes:
189
+ - gates:evaluate
190
+ - events:write
191
+ last4: a1b2
192
+ "400":
193
+ $ref: ../components/responses.yaml#/BadRequest
194
+ "401":
195
+ $ref: ../components/responses.yaml#/Unauthorized
196
+ "403":
197
+ $ref: ../components/responses.yaml#/Forbidden
198
+ "404":
199
+ $ref: ../components/responses.yaml#/NotFound
200
+ "409":
201
+ $ref: ../components/responses.yaml#/Conflict
202
+ "422":
203
+ $ref: ../components/responses.yaml#/UnprocessableEntity
204
+ x-error-codes:
205
+ - UNAUTHORIZED
206
+ - FORBIDDEN
207
+ - NOT_FOUND
208
+ - VALIDATION
209
+ x-cli:
210
+ name: update
211
+ positional:
212
+ - id
134
213
  /api/admin/keys/{id}/revoke:
135
214
  post:
136
215
  operationId: revokeKey
@@ -23,11 +23,14 @@
23
23
  name: checkouts
24
24
  folder: null
25
25
  eventName: checkout_completed
26
- query: count_users(checkout_completed)
26
+ query: count(checkout_completed)
27
27
  queryIr:
28
- agg: { kind: count_users }
29
- metric: checkout_completed
30
- filters: []
28
+ v: 2
29
+ expr:
30
+ node: agg
31
+ event: checkout_completed
32
+ agg: { kind: count }
33
+ filters: []
31
34
  direction: higher_better
32
35
  version: 1
33
36
  "400":
@@ -61,7 +64,7 @@
61
64
 
62
65
  **Use cases**
63
66
 
64
- - **Track an event** — `count_users(<event>)` for unique-user counts.
67
+ - **Track an event** — `count(<event>)` for event counts.
65
68
  - **Sum a value** — `sum(<event>, <label>)` for revenue / quantity metrics.
66
69
  - **Experiment success metric** — create the metric, then attach its id to an experiment.
67
70
  tags:
@@ -75,13 +78,13 @@
75
78
  schema:
76
79
  $ref: ../components/schemas/metrics.yaml#/CreateMetricRequest
77
80
  examples:
78
- countUsers:
79
- summary: Count unique users (DSL)
80
- description: Unique users who completed checkout, expressed with the query DSL.
81
+ countEvents:
82
+ summary: Count an event (DSL)
83
+ description: Completed checkouts, expressed with the query DSL.
81
84
  value:
82
85
  name: checkouts
83
86
  event_name: checkout_completed
84
- query: count_users(checkout_completed)
87
+ query: count(checkout_completed)
85
88
  sumRevenue:
86
89
  summary: Sum a value label (DSL)
87
90
  description: Total revenue, summing the `amount` property of the `purchase` event.
@@ -98,10 +101,13 @@
98
101
  name: checkouts
99
102
  event_name: checkout_completed
100
103
  query_ir:
101
- agg:
102
- kind: count_users
103
- metric: checkout_completed
104
- filters: []
104
+ v: 2
105
+ expr:
106
+ node: agg
107
+ event: checkout_completed
108
+ agg:
109
+ kind: count
110
+ filters: []
105
111
  responses:
106
112
  "201":
107
113
  description: Create a metric
@@ -179,10 +185,13 @@
179
185
  eventName: purchase
180
186
  query: sum(purchase, amount)
181
187
  queryIr:
182
- agg: { kind: sum }
183
- metric: purchase
184
- valueLabel: amount
185
- filters: []
188
+ v: 2
189
+ expr:
190
+ node: agg
191
+ event: purchase
192
+ agg: { kind: sum }
193
+ valueLabel: amount
194
+ filters: []
186
195
  direction: higher_better
187
196
  winsorizePct: 99
188
197
  version: 1