@curviate/sdk 0.30.0 → 0.32.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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,97 @@ Versioning: semantic. Minor for additive changes, patch for bug fixes; no stabil
7
7
 
8
8
  ---
9
9
 
10
+ ## [0.32.0] - 2026-09-15
11
+
12
+ Seat discovery for connecting an account. Additive; nothing removed or renamed.
13
+
14
+ Fixture and types regenerated against the deployed staging document
15
+ (`https://api.staging.curviate.com`, 127 paths); the exact source commit is
16
+ recorded in `fixtures/PROVENANCE.json`.
17
+
18
+ ### Added
19
+
20
+ - **`accounts.listSeats()`** (`GET /v1/accounts/seats`). Returns
21
+ `{ object: "seat_list", items: { seat_id, occupied, account_id }[] }`: the
22
+ workspace's live seats, whether an account occupies each, and that account
23
+ (`null` when free). Not paginated. An empty seat is listed only when
24
+ connecting an account to it would be accepted right now, so an empty seat
25
+ that is provisional, cancelling, on an ended trial or blocked by billing is
26
+ left out, and `items` can be `[]` while the workspace still has seats. Any seat with `occupied: false` is a valid `seat_id` for connecting a new
27
+ account with `auth.intent`, so a connect no longer needs a seat id copied
28
+ from the dashboard. Carries no billing fields. The response type is
29
+ exported as `SeatList`.
30
+
31
+ - **Types only: `GET` and `PATCH /v1/safety-policy`** (tenant-wide safety
32
+ defaults per limit profile and budget row). The generated `paths` type now
33
+ describes them; there is no resource method yet, so call them through your
34
+ own request if you need them today.
35
+
36
+ ### Changed
37
+
38
+ - `auth.intent` documentation now points to `accounts.listSeats()` for finding
39
+ a free seat, matching the regenerated `seat_id` description.
40
+ - Regenerated descriptions on `GET` and `PATCH /v1/{account_id}/safety-policy`:
41
+ an account's values now resolve from its own setting, then the tenant
42
+ default for its `limit_profile`, then the Curviate default, and `null` on the
43
+ account write restores the tenant default where one is set. Documentation
44
+ only; no type moved.
45
+
46
+ ---
47
+
48
+ ## [0.31.0] - 2026-09-11
49
+
50
+ Step two of the tier retirement, plus one billing refusal this SDK was about to
51
+ erase to `INTERNAL`. **Breaking** for any caller still branching on the two
52
+ retired codes; additive otherwise.
53
+
54
+ The trigger 0.30.0 named for the removal is met: every deployment now carries
55
+ the seat-based entitlement contract, so neither retired code can arrive.
56
+
57
+ Fixture and types regenerated against the deployed staging document
58
+ (`https://api.staging.curviate.com`, 125 paths); the exact source commit is
59
+ recorded in `fixtures/PROVENANCE.json`.
60
+
61
+ ### Removed
62
+
63
+ - **`TIER_NOT_ACTIVE` and `PREMIUM_CONFLICT` are gone from `ErrorCode`,
64
+ `ERROR_CODES` and `KNOWN_ERROR_CODES`.** Deprecated in 0.30.0; no deployment
65
+ emits either any more. A `case "TIER_NOT_ACTIVE"` or
66
+ `case "PREMIUM_CONFLICT"` now fails to type-check, which is the point: it was
67
+ a branch that could never be taken. Handle `NO_ACTIVE_SEAT` for the seat
68
+ refusal; `PREMIUM_CONFLICT` has no replacement, because the current connect
69
+ input cannot express the conflict it reported.
70
+
71
+ Should a wire body ever carry either code, it decodes to `INTERNAL` like any
72
+ unknown code.
73
+
74
+ - **`seat_tier_mismatch` is gone from the safety-policy types**, on the read
75
+ response, the write response and the write body. Seats no longer carry a
76
+ tier, so there is nothing for it to disagree with, and the API has stopped
77
+ returning it. Read `limit_profile` for what LinkedIn grants the account.
78
+
79
+ ### Changed
80
+
81
+ - Two regenerated descriptions: job search `paging.total_count` now says it
82
+ counts matching job postings and is `0` on an empty page, and the connect
83
+ body's `recruiter_contract_id` is described by the LinkedIn Recruiter
84
+ subscription rather than a Curviate tier. Documentation only; no type moved.
85
+
86
+ ### Added
87
+
88
+ - **`STRIPE_DRIFT_DETECTED` (503).** Checkout refuses closed when Curviate's
89
+ own seat-price configuration disagrees with the price it displays, so no one
90
+ is charged an amount they were never shown. It is a Curviate-side
91
+ misconfiguration: `userFixable` is `false`, a retry fails the same way until
92
+ Curviate corrects the price, and nothing was charged. Surface it to a human
93
+ or to support instead of backing off. Not in the transport's retryable set,
94
+ so a GET carrying it is fetched once.
95
+
96
+ Without this entry the refusal would have decoded to `INTERNAL`, reading as
97
+ a generic server fault and being retried as one.
98
+
99
+ ---
100
+
10
101
  ## [0.30.0] - 2026-09-09
11
102
 
12
103
  Fixture and types regenerated against the deployed staging document
package/README.md CHANGED
@@ -113,7 +113,8 @@ try {
113
113
  // Curviate's OWN account-safety ceiling, not a request-rate limit:
114
114
  // nothing reached LinkedIn and nothing was spent, so backing off is the
115
115
  // wrong move. Wait until err.resetAt, or raise the setting the hint
116
- // names on PATCH /v1/{account_id}/safety-policy.
116
+ // names on PATCH /v1/{account_id}/safety-policy. The ceiling comes from the
117
+ // account's safety policy or the tenant default (GET/PATCH /v1/safety-policy).
117
118
  // resetAt is null in the two cases no clock frees: the pending_invites
118
119
  // backlog, and an InMail credit pool LinkedIn regrants on its own schedule.
119
120
  console.warn(`${err.budgetRow} is spent until ${err.resetAt ?? "no fixed time"}`);