@neetru/sdk 1.1.1 → 2.1.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 (95) hide show
  1. package/CHANGELOG.md +284 -214
  2. package/README.md +194 -218
  3. package/dist/auth.cjs +4181 -346
  4. package/dist/auth.cjs.map +1 -1
  5. package/dist/auth.d.cts +5 -1
  6. package/dist/auth.d.ts +5 -1
  7. package/dist/auth.mjs +4181 -346
  8. package/dist/auth.mjs.map +1 -1
  9. package/dist/catalog.cjs +63 -24
  10. package/dist/catalog.cjs.map +1 -1
  11. package/dist/catalog.d.cts +6 -2
  12. package/dist/catalog.d.ts +6 -2
  13. package/dist/catalog.mjs +63 -24
  14. package/dist/catalog.mjs.map +1 -1
  15. package/dist/checkout.cjs +60 -18
  16. package/dist/checkout.cjs.map +1 -1
  17. package/dist/checkout.d.cts +5 -1
  18. package/dist/checkout.d.ts +5 -1
  19. package/dist/checkout.mjs +60 -18
  20. package/dist/checkout.mjs.map +1 -1
  21. package/dist/collection-ref-BBvTTXoG.d.cts +423 -0
  22. package/dist/collection-ref-BBvTTXoG.d.ts +423 -0
  23. package/dist/db-react.cjs +136 -0
  24. package/dist/db-react.cjs.map +1 -0
  25. package/dist/db-react.d.cts +99 -0
  26. package/dist/db-react.d.ts +99 -0
  27. package/dist/db-react.mjs +112 -0
  28. package/dist/db-react.mjs.map +1 -0
  29. package/dist/db.cjs +3652 -143
  30. package/dist/db.cjs.map +1 -1
  31. package/dist/db.d.cts +5 -8
  32. package/dist/db.d.ts +5 -8
  33. package/dist/db.mjs +3649 -143
  34. package/dist/db.mjs.map +1 -1
  35. package/dist/entitlements.cjs +101 -24
  36. package/dist/entitlements.cjs.map +1 -1
  37. package/dist/entitlements.d.cts +15 -5
  38. package/dist/entitlements.d.ts +15 -5
  39. package/dist/entitlements.mjs +101 -24
  40. package/dist/entitlements.mjs.map +1 -1
  41. package/dist/errors.cjs.map +1 -1
  42. package/dist/errors.mjs.map +1 -1
  43. package/dist/index.cjs +4341 -282
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.cts +13 -6
  46. package/dist/index.d.ts +13 -6
  47. package/dist/index.mjs +4243 -189
  48. package/dist/index.mjs.map +1 -1
  49. package/dist/mocks.cjs +186 -9
  50. package/dist/mocks.cjs.map +1 -1
  51. package/dist/mocks.d.cts +21 -6
  52. package/dist/mocks.d.ts +21 -6
  53. package/dist/mocks.mjs +186 -9
  54. package/dist/mocks.mjs.map +1 -1
  55. package/dist/notifications.cjs +296 -0
  56. package/dist/notifications.cjs.map +1 -0
  57. package/dist/notifications.d.cts +5 -0
  58. package/dist/notifications.d.ts +5 -0
  59. package/dist/notifications.mjs +293 -0
  60. package/dist/notifications.mjs.map +1 -0
  61. package/dist/react.cjs +7 -3
  62. package/dist/react.cjs.map +1 -1
  63. package/dist/react.d.cts +5 -1
  64. package/dist/react.d.ts +5 -1
  65. package/dist/react.mjs +7 -3
  66. package/dist/react.mjs.map +1 -1
  67. package/dist/support.cjs +60 -18
  68. package/dist/support.cjs.map +1 -1
  69. package/dist/support.d.cts +5 -1
  70. package/dist/support.d.ts +5 -1
  71. package/dist/support.mjs +60 -18
  72. package/dist/support.mjs.map +1 -1
  73. package/dist/telemetry.cjs +130 -19
  74. package/dist/telemetry.cjs.map +1 -1
  75. package/dist/telemetry.d.cts +21 -1
  76. package/dist/telemetry.d.ts +21 -1
  77. package/dist/telemetry.mjs +130 -19
  78. package/dist/telemetry.mjs.map +1 -1
  79. package/dist/types-B1jylbMC.d.ts +1364 -0
  80. package/dist/types-Kmt4y1FQ.d.cts +1364 -0
  81. package/dist/usage.cjs +60 -18
  82. package/dist/usage.cjs.map +1 -1
  83. package/dist/usage.d.cts +5 -1
  84. package/dist/usage.d.ts +5 -1
  85. package/dist/usage.mjs +60 -18
  86. package/dist/usage.mjs.map +1 -1
  87. package/dist/webhooks.cjs +316 -0
  88. package/dist/webhooks.cjs.map +1 -0
  89. package/dist/webhooks.d.cts +5 -0
  90. package/dist/webhooks.d.ts +5 -0
  91. package/dist/webhooks.mjs +312 -0
  92. package/dist/webhooks.mjs.map +1 -0
  93. package/package.json +133 -101
  94. package/dist/types-BA53dd8S.d.cts +0 -490
  95. package/dist/types-BA53dd8S.d.ts +0 -490
package/CHANGELOG.md CHANGED
@@ -1,214 +1,284 @@
1
- # Changelog
2
-
3
- All notable changes to `@neetru/sdk` will be documented in this file.
4
-
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
- and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
-
8
- ## [Unreleased]
9
-
10
- ### Planned (post-1.1)
11
- - Telemetry batching + flush on unload.
12
- - LRU cache em entitlements.check (TTL configurável).
13
- - size-limit budget no CI (<12KB gz core com db namespace).
14
- - CDN distribution (`cdn.neetru.com/sdk/v1/`).
15
-
16
- ## [1.1.0] - 2026-05-08 — **Checkout namespace + React helpers**
17
-
18
- Adiciona o namespace `client.checkout` (start/get/cancel intent) com auto-redirect
19
- em browser. Suporte ao fluxo Sprint 13 onde produtos SaaS delegam checkout pro
20
- portal `minhaconta.neetru.com` via `POST /api/v1/checkout/intents`.
21
-
22
- ### Added
23
- - **`client.checkout.start({productId, planId, callbackUrl, tenantType?, tenantId?})`** cria
24
- `checkout_intents/{intentId}` no Core e (em browser) redireciona automaticamente
25
- pra `minhaconta.neetru.com/portal/checkout/{intentId}`. Em Node/SSR retorna
26
- `{intentId, redirectUrl}` sem efeito colateral.
27
- - **`client.checkout.get(intentId)`** — estado atual do intent.
28
- - **`client.checkout.cancel(intentId)`** marca intent como `cancelled`.
29
- - **Subpath `@neetru/sdk/react`** — componente `<CheckoutLink>` (wrapper de `<a>`
30
- que dispara `start()` no click) + `<EntitlementGate mode="block|readonly">`
31
- + hook `useEntitlementContext()` pra desabilitar escritas quando free tier
32
- estoura limite (decisão CEO §5 read-only sempre, não hard-block).
33
- - **`MockCheckout`** implementação dev (`NEETRU_ENV=dev`) sem network. Retorna
34
- URL fake `https://localhost:9003/portal/checkout/{intentId}` pra dev externo
35
- testar UI sem provisionar conta Neetru.
36
- - **Peer dep `react ^18 || ^19`** marcado opcional (só carregado se import `/react`).
37
-
38
- ### Changed
39
- - `VERSION` const bump `1.0.0 1.1.0`.
40
- - `NeetruClient.checkout` adicionado backward-compatible (caller que não usa
41
- o namespace não é afetado).
42
-
43
- ### Notes
44
- - API stability test (`api-surface-stability.test.ts`) atualizado pra incluir
45
- `checkout` no inventário canônico.
46
-
47
- ## [1.0.0] - 2026-05-06 **GA (General Availability)**
48
-
49
- Marco de estabilidade. A partir desta versão, **a superfície pública do SDK
50
- está congelada** — breaking changes só em majors (semver estrito).
51
-
52
- ### Added
53
- - **API stability lock** — todos os contratos (`createNeetruClient`,
54
- `NeetruClient`, namespaces `auth`/`catalog`/`entitlements`/`telemetry`/
55
- `usage`/`support`/`db`, `NeetruError`) ficam estáveis em v1.x. Coberto
56
- por `api-surface-stability.test.ts` que falha o build se algum método
57
- muda forma.
58
- - **JSDoc completo** em toda função/método público — base pra `npm run docs:gen`
59
- (typedoc → `sdk/docs-html/`).
60
- - **`docs:gen` script** + `scripts/typedoc.config.json` — gera HTML
61
- navigable das APIs.
62
- - **`engines.node`** relaxado de `>=20` `>=18` (suporta runtimes Node 18 LTS
63
- ainda em uso por consumers).
64
-
65
- ### Changed
66
- - `VERSION` bump `0.3.0` → `1.0.0`.
67
- - README atualizado com seção de migração v0.3 → v1.0 (no breaking changes —
68
- upgrade transparente).
69
-
70
- ### Migration v0.3 v1.0
71
- - **Sem breaking changes.** Upgrade direto via `npm install @neetru/sdk@1.0.0`.
72
- - `initNeetru` continua deprecated mas funcional. **Será removido em v2.0.0.**
73
- - `NeetruConfig` continua deprecated. Use `NeetruClientConfig`.
74
-
75
- ### Stability promise (v1.x)
76
- A partir de v1.0:
77
- - Métodos novos podem ser adicionados a namespaces existentes (minor bump).
78
- - Métodos podem ser marcados `@deprecated` em qualquer minor removidos
79
- em major.
80
- - Tipos nunca ganham campos required em minor ( optional ou via union).
81
- - `NeetruErrorCode` é union fechado em v1.0 — qualquer novo código bumpa minor.
82
-
83
- ### Notes
84
- - Pacote ainda **privado** (`private: true`). Publicação no npm é
85
- responsabilidade do owner — gate no CHANGELOG continua trancado até decisão.
86
-
87
- ## [0.3.0] - 2026-05-06
88
-
89
- ### Added
90
- - Namespace `client.db` (v0.3) wrapper minimalista pra coleções tenant-scoped:
91
- - `client.db.collection(name).list({ limit? })`
92
- - `client.db.collection(name).get(id)` (retorna null em not_found)
93
- - `client.db.collection(name).set(id, data)` upsert
94
- - `client.db.collection(name).remove(id)` delete
95
- - Endpoints: `/sdk/v1/datastore/{collection}/{id?}` (placeholder REST — Sprint 9
96
- finaliza; SDK expõe interface estável).
97
- - `MockDb` (in-memory) ativo em `NEETRU_ENV=dev`.
98
- - Namespace `client.usage` ganhou `report()` e `check()`:
99
- - `usage.report(resource, qty?)` → `POST /sdk/v1/usage/record` canônico
100
- (Sprint 7) incrementa atomicamente `usage_counters/{tid}_{pid}_{r}_{yyyymm}`.
101
- - `usage.check(resource)` `GET /sdk/v1/entitlements?productId&tenantId&feature`
102
- retorna `{allowed, reason, remaining, limit, planId, planFeatures}`.
103
- - `NeetruClientConfig.productId` / `.tenantId` defaults pra `usage.report` /
104
- `usage.check` / `db.collection` quando não passado em options.
105
- - Mock helpers: `MockDb`, `MockUsage.report()`, `MockUsage.check()`.
106
-
107
- ### Changed
108
- - `VERSION` bump `0.2.0` → `0.3.0`.
109
- - `NeetruClient` agora expõe `.db` além dos antigos.
110
- - `ResolvedConfig` ganhou `productId` + `tenantId` opcionais.
111
-
112
- ### Backend (acompanha esta release)
113
- - Novos endpoints (Sprint 7):
114
- - `POST /sdk/v1/usage/record` atomic increment + 80%/100% notifications + audit.
115
- - `GET /sdk/v1/entitlements` lookup canônico subscription→plan→counter.
116
- - `POST /sdk/v1/telemetry/log` — batch logger pra `logs/{productId}/{yyyymmdd}/`.
117
-
118
- ## [0.2.0] - 2026-05-06
119
-
120
- ### Added
121
- - Namespace `client.auth` (v0.2 — OIDC + dev mocks):
122
- - `signIn(options?)` — redireciona pra auth.neetru.com authorize endpoint
123
- (browser) ou retorna mock user em dev (`NEETRU_ENV=dev`).
124
- - `signOut()` limpa `localStorage.neetru_id_token` + revoga refresh
125
- server-side (best-effort).
126
- - `getUser()` decodifica id_token cached e retorna `NeetruUser` ou null.
127
- - `onAuthStateChanged(listener)` — sub a mudanças, dispatcha sync no subscribe.
128
- - Namespace `client.usage` (v0.2meter):
129
- - `track(event, props?)` → `POST /sdk/v1/usage/record` com Bearer.
130
- - `getQuota(metric)` `GET /sdk/v1/usage/quota?metric=` returns
131
- `{ metric, used, limit, plan, resetsAt? }`.
132
- - Namespace `client.support` (v0.2 tickets):
133
- - `createTicket({subject, message, severity?, productSlug?})` →
134
- `POST /api/v1/products/{slug}/tickets` (default `_default`).
135
- - `listMyTickets()` → `GET ...` retorna array (aceita envelope `{tickets:[]}`).
136
- - `mocks` module (`@neetru/sdk/mocks`):
137
- - `MockAuth`, `MockUsage`, `MockSupport`, `MockEntitlements` overridáveis
138
- via `createNeetruClient({ mocks: { auth: MockAuth(...), ... } })`.
139
- - `DEV_FIXTURE_USER` constante exportada.
140
- - `NEETRU_ENV` resolution chain: config arg > `process.env.NEETRU_ENV` >
141
- `globalThis.NEETRU_ENV` > default `prod`. `dev` ativa mocks automáticos.
142
- - Subpath exports adicionais: `@neetru/sdk/{auth,usage,support,mocks}`.
143
- - Tipos novos: `NeetruUser`, `AuthNamespace`, `UsageNamespace`,
144
- `SupportNamespace`, `SignInOptions`, `SupportTicket`, `UsageQuota`,
145
- `NeetruEnv`, `CreateTicketInput`.
146
-
147
- ### Changed
148
- - `VERSION` bump `0.1.0` `0.2.0`.
149
- - `NeetruClientConfig` ganhou campos `env` + `mocks`.
150
- - `ResolvedConfig` ganhou `env` resolved.
151
- - `NeetruClient` agora expõe `.auth`, `.usage`, `.support` além dos antigos.
152
-
153
- ### Backend (acompanha esta release — endpoints documentados em `docs/SDK_OPENAPI.md`)
154
- - `POST /sdk/v1/usage/record` record event meterado.
155
- - `GET /sdk/v1/usage/quota?metric=`ler quota atual.
156
- - `POST /api/v1/products/{slug}/tickets` — criar ticket.
157
- - `GET /api/v1/products/{slug}/tickets` listar meus tickets.
158
- - (auth) `auth.neetru.com/oauth/authorize` — já live (Sprint 1 OIDC).
159
- - (auth) `auth.neetru.com/oauth/revoke` — revoga refresh token.
160
-
161
- ### Notes
162
- - Pacote ainda **privado** (`private: true`) não publicado no npm.
163
- - Carry-over: integração OIDC live aguarda owner habilitar redirect_uri pro
164
- domain do consumer (configurar em `oidc_clients/{client_id}.redirect_uris`).
165
- - TODO: `support.listMyTickets` precisa parametrizar productSlug (fixed
166
- `_default` na v0.2).
167
-
168
- ## [0.1.0] - 2026-05-05
169
-
170
- ### Added
171
- - `createNeetruClient(config)` factory entry point principal.
172
- - Resolve `apiKey` (arg explícito > `NEETRU_API_KEY` env em Node).
173
- - Resolve `baseUrl` (default `https://api.neetru.com`).
174
- - Resolve `fetch` (arg > `globalThis.fetch`).
175
- - Namespace `client.catalog`:
176
- - `list(opts?)` → `GET /api/v1/cli/catalog`. Aceita `includeDrafts`.
177
- - `get(slug)` → `GET /api/v1/cli/catalog/{slug}`.
178
- - Namespace `client.entitlements`:
179
- - `check(slug, feature)` boolean.
180
- - `checkDetailed(slug, feature)` `EntitlementCheck` com `reason`.
181
- - Backed por `GET /api/v1/sdk/entitlements/check`.
182
- - Namespace `client.telemetry`:
183
- - `event({ name, properties?, timestamp? })` → `POST /api/v1/sdk/telemetry/event`.
184
- - Subpath exports map: `@neetru/sdk/{catalog,entitlements,telemetry,errors}`.
185
- - HTTP transport com mapeamento status `NeetruError.code` estável.
186
- - Tipos exportados: `NeetruClient`, `NeetruClientConfig`, `Product`, `ProductPlan`,
187
- `EntitlementCheck`, `TelemetryEventInput`, `TelemetryEventAck`, `NeetruErrorCode`.
188
- - Compat alias `initNeetru` (deprecated, será removido em v1.0).
189
-
190
- ### Changed
191
- - `VERSION` bump `0.0.1` `0.1.0`.
192
- - tsup config multi-entry pra subpath imports.
193
-
194
- ### Backend (acompanha esta release)
195
- - `GET /api/v1/cli/catalog/{slug}` — produto único.
196
- - `GET /api/v1/sdk/entitlements/check?slug=&feature=` verificação por user.
197
- - `POST /api/v1/sdk/telemetry/event` — persiste em `usage_events`.
198
-
199
- ### Notes
200
- - Pacote ainda **privado** (`private: true`). Publicação no npm é
201
- responsabilidade do owner em Sprint 6.
202
- - API instável; pré-1.0 segue regra "breaking allowed em qualquer minor".
203
-
204
- ## [0.0.1] - 2026-05-04
205
-
206
- ### Added
207
- - Scaffold inicial do pacote `@neetru/sdk` (private, não publicado no npm ainda).
208
- - `initNeetru(config)` com validação de `apiUrl` e injeção opcional de `fetch`.
209
- - `NeetruError` com `code`, `status` e `requestId` opcionais.
210
- - `NeetruConfig` e `NeetruClient` types públicos.
211
- - `VERSION` const exportada.
212
- - Build pipeline com tsup (dual ESM + CJS + `.d.ts`).
213
- - README + CHANGELOG.
214
- - `tsconfig.json` strict ES2022 ESNext.
1
+ # Changelog
2
+
3
+ All notable changes to `@neetru/sdk` will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Planned (post-2.0)
11
+ - size-limit budget no CI (<12KB gz core com db namespace).
12
+ - CDN distribution (`cdn.neetru.com/sdk/v2/`).
13
+ - Endpoint batch `/api/v1/sdk/telemetry/batch` (substitui drenagem N×1 do `track()` por 1 request).
14
+
15
+ ## [2.0.0] - 2026-05-22 — **client.db NeetruDb (Documentos engine-aware + SQL) [M2]**
16
+
17
+ Major bump — breaking changes no namespace `db`. Liga todos os building blocks M2 na superfície pública.
18
+
19
+ ### Breaking Changes
20
+
21
+ - **`client.db`** troca de `DbNamespace` (v0.3 REST simples) para `NeetruDb` (v2.0 offline-first engine-aware).
22
+ - `collection().list()` agora retorna `DbListResult<T>` (com `docs`, `nextCursor`, `fromCache`, `stale`, `hasPendingWrites`, `changes`) em vez de `T[]`.
23
+ - `collection().get(id)` retorna `DbGetResult<T> | null` em vez de `T | null`.
24
+ - `db_unavailable` não significa mais "sem rede" só ciclo de vida do banco. Offline é transparente.
25
+ - Novos métodos obrigatórios na superfície: `sql()`, `syncState`, `flush()`, `clearCache()`, `getConflicts()`, `onSyncStateChanged()`, `batch()`, `onDoc()`, `onSnapshot()`, `doc()`.
26
+ - **`db.sql(schema)` lança `NeetruDbError('db_unavailable')` em `NEETRU_ENV=dev`** — sem Postgres local, sem acesso SQL. Use `neetru dev` para subir o container.
27
+ - **`initNeetru`** — mantido como stub funcional mas não mapeia mais `apiUrl → baseUrl`. Remover em v3.0.
28
+ - **`MockDb`** foi atualizado para implementar `NeetruDb` (v2.0) em vez de `DbNamespace` (v0.3).
29
+
30
+ ### Added
31
+
32
+ - **`client.db.collection<T>(name)`** retorna `DbCollectionRef<T>` offline-first, engine-aware. Funciona sem rede. Sync automático quando conectado.
33
+ - CRUD: `add`, `set`, `update`, `remove`, `get`, `list` (com query, cursor, orderBy, where, limit).
34
+ - Batch: `batch(ops)` operações atômicas (client-side).
35
+ - Realtime: `onSnapshot(query, cb)`, `onDoc(id, cb)` — subscriptions permanentes, delivery imediato do cache.
36
+ - Doc ref: `doc(id).get()`, `.set()`, `.update()`, `.remove()`, `.onSnapshot()`.
37
+ - **`client.db.sql<TSchema>(schema)`** — lease SQL. Retorna `NeetruSqlClient<TSchema>` com `orm` (Drizzle `NodePgDatabase`) + `transaction()` + `close()`.
38
+ - **`client.db.syncState`** — estado de sincronização observável (`status`, `pendingWrites`, `lastSyncedAt`, `isLeaderTab`).
39
+ - **`client.db.onSyncStateChanged(cb)`** subscrição de mudanças de sync state.
40
+ - **`client.db.flush()`**força ciclo de sync imediato.
41
+ - **`client.db.clearCache(collections?)`** — limpa o cache local (IndexedDB).
42
+ - **`client.db.getConflicts(collection?)`** — lista conflitos LWW pendentes.
43
+ - **Engine detection** via `NeetruDbOptions.engine`: `'firestore'` | `'nosql-vm'` | `'rest'` (default MVP).
44
+ - **Subpath `@neetru/sdk/db/react`** hooks React: `useCollection`, `useDoc` (exporta via `dist/db-react.{mjs,cjs}`).
45
+ - **Novos tipos públicos exportados**: `NeetruDb`, `NeetruDbEngine`, `NeetruDbOptions`, `NeetruSqlClient`, `DbSqlLease`, `DbCollectionRef`, `DbDocRef`, `DbQuery`, `DbDoc`, `DbListResult`, `DbGetResult`, `DbBatchOp`, `DbChangeType`, `NeetruDbError`, `NeetruDbErrorCode`.
46
+ - **`createNeetruDb(config, opts)`** — factory async (para uso fora do `createNeetruClient`).
47
+ - **`createNeetruDbSync(config, opts)`**factory sync com lazy init IndexedDB (usada internamente em `createNeetruClient`).
48
+
49
+ ### Changed
50
+
51
+ - **`NeetruClientConfig.db`** — aceita `NeetruDbOptions` (engine, dbId, collections, dbName, etc.).
52
+ - **`client.config.mocks.db`** — agora é `NeetruDb` em vez de `DbNamespace`.
53
+ - **`VERSION`** bumped para `'2.0.0'`.
54
+
55
+ ## [1.2.0] - 2026-05-19 **Webhooks + Notifications + DX (cache, retry, batch)**
56
+
57
+ Release de qualidade fechando 3 CRITICAL + 6 IMPORTANT do code review interno + 4 melhorias de DX. Adiciona `webhooks` + `notifications` no `NeetruClient`.
58
+
59
+ ### Added
60
+ - **`client.webhooks`** — `register`/`list`/`unregister`/`test` pra endpoints HTTP do produto receberem eventos do Core (subscription.activated, usage.quota_exceeded, etc).
61
+ - **`verifyWebhookSignature(payload, signature, secret)`** — util pura (HMAC SHA-256 constant-time compare via `node:crypto`) pra consumidor validar payloads recebidos.
62
+ - **`client.notifications`** `send`/`list`/`markRead`/`dismiss` pra produto integrar com a bandeja in-app do Neetru.
63
+ - **`client.telemetry.track(input)`** + `client.telemetry.flush()` — fire-and-forget batch (500ms debounce). Ideal pra alta frequência (page-views, cliques). `event()` segue como single-shot com `eventId` ack.
64
+ - **`client.entitlements.check(..., { cacheBust })`** — cache LRU em memória (60s TTL, 100 entries). Corta 90%+ requests em renders repetidos do `<EntitlementGate>`. `cacheBust: true` força ida ao servidor.
65
+ - **httpRequest retry/backoff** — 2 retries default em `rate_limited` (429), `server_error` (5xx), `network_error`. Honra `Retry-After` header. Caller opt-out com `opts.retries: 0`.
66
+ - **Subpaths novos**: `@neetru/sdk/webhooks`, `@neetru/sdk/notifications`.
67
+
68
+ ### Changed
69
+ - **`client.catalog.list()` / `get()`** agora consomem `/api/sdk/v1/catalog` (público, sem Bearer) em vez de `/api/v1/cli/catalog` (staff). Consumidor não precisa mais de chave staff só pra ler catálogo. `includeDrafts` é ignorado — rascunhos só via CLI.
70
+ - **`auth.signOut()`** revoga token em `auth.neetru.com/api/v1/oauth/revoke` (canônico), não mais `api.neetru.com/oauth/revoke` (404 em prod).
71
+ - **`<EntitlementGate>`** passa `tenantId` (do `client.config.tenantId`) pra `usage.check`. Sem tenantId, cai pra `entitlements.check` em vez de chamar `usage.check` e travar em `validation_failed` silencioso.
72
+ - **`engines.node`** subiu pra `>=20` (alinha com `target: node20` do tsup; Node 18 EOL).
73
+
74
+ ### Fixed
75
+ - **CRITICAL** `webhooks` e `notifications` lançavam `'invalid_input'`, código ausente da union `NeetruErrorCode`. Todas as 17 ocorrências viraram `'validation_failed'`.
76
+ - **CRITICAL** `telemetry.log()` chamava `/sdk/v1/telemetry/log` (404). Corrigido pra `/api/sdk/v1/telemetry/log`.
77
+ - **CRITICAL** `db` namespace tinha o mesmo bug em 6 paths (`/sdk/v1/datastore/...`). Corrigido em massa pra `/api/sdk/v1/datastore/...`.
78
+ - **CRITICAL** 8 `httpRequest` calls em `webhooks` e `notifications` não passavam `requireAuth: true` todos hits em prod retornavam 401. Corrigido.
79
+ - **`MockSupport.mockTicketSeq`** virou instance field (era module-level, poluía tests entre suites).
80
+ - **`db.list()`** removeu variável `query` dead code (refactor incompleto de pre-1.1).
81
+
82
+ ### Internal
83
+ - 51 testes novos (webhooks: 22, notifications: 20, react: 9). Total: 215 testes (16 files), 100% passing. tsc clean.
84
+ - `api-surface-stability.test.ts` agora lock `webhooks` + `notifications` no `NeetruClient`.
85
+
86
+ ## [1.1.0] - 2026-05-08 — **Checkout namespace + React helpers**
87
+
88
+ Adiciona o namespace `client.checkout` (start/get/cancel intent) com auto-redirect
89
+ em browser. Suporte ao fluxo Sprint 13 onde produtos SaaS delegam checkout pro
90
+ portal `minhaconta.neetru.com` via `POST /api/v1/checkout/intents`.
91
+
92
+ ### Added
93
+ - **`client.checkout.start({productId, planId, callbackUrl, tenantType?, tenantId?})`** — cria
94
+ `checkout_intents/{intentId}` no Core e (em browser) redireciona automaticamente
95
+ pra `minhaconta.neetru.com/portal/checkout/{intentId}`. Em Node/SSR retorna
96
+ `{intentId, redirectUrl}` sem efeito colateral.
97
+ - **`client.checkout.get(intentId)`** estado atual do intent.
98
+ - **`client.checkout.cancel(intentId)`** marca intent como `cancelled`.
99
+ - **Subpath `@neetru/sdk/react`** — componente `<CheckoutLink>` (wrapper de `<a>`
100
+ que dispara `start()` no click) + `<EntitlementGate mode="block|readonly">`
101
+ + hook `useEntitlementContext()` pra desabilitar escritas quando free tier
102
+ estoura limite (decisão CEO §5 — read-only sempre, não hard-block).
103
+ - **`MockCheckout`**implementação dev (`NEETRU_ENV=dev`) sem network. Retorna
104
+ URL fake `https://localhost:9003/portal/checkout/{intentId}` pra dev externo
105
+ testar UI sem provisionar conta Neetru.
106
+ - **Peer dep `react ^18 || ^19`** marcado opcional (só carregado se import `/react`).
107
+
108
+ ### Changed
109
+ - `VERSION` const bump `1.0.0 1.1.0`.
110
+ - `NeetruClient.checkout` adicionado backward-compatible (caller que não usa
111
+ o namespace não é afetado).
112
+
113
+ ### Notes
114
+ - API stability test (`api-surface-stability.test.ts`) atualizado pra incluir
115
+ `checkout` no inventário canônico.
116
+
117
+ ## [1.0.0] - 2026-05-06 — **GA (General Availability)**
118
+
119
+ Marco de estabilidade. A partir desta versão, **a superfície pública do SDK
120
+ está congelada** — breaking changes só em majors (semver estrito).
121
+
122
+ ### Added
123
+ - **API stability lock** todos os contratos (`createNeetruClient`,
124
+ `NeetruClient`, namespaces `auth`/`catalog`/`entitlements`/`telemetry`/
125
+ `usage`/`support`/`db`, `NeetruError`) ficam estáveis em v1.x. Coberto
126
+ por `api-surface-stability.test.ts` que falha o build se algum método
127
+ muda forma.
128
+ - **JSDoc completo** em toda função/método público base pra `npm run docs:gen`
129
+ (typedoc → `sdk/docs-html/`).
130
+ - **`docs:gen` script** + `scripts/typedoc.config.json` — gera HTML
131
+ navigable das APIs.
132
+ - **`engines.node`** relaxado de `>=20` → `>=18` (suporta runtimes Node 18 LTS
133
+ ainda em uso por consumers).
134
+
135
+ ### Changed
136
+ - `VERSION` bump `0.3.0` → `1.0.0`.
137
+ - README atualizado com seção de migração v0.3 → v1.0 (no breaking changes
138
+ upgrade transparente).
139
+
140
+ ### Migration v0.3 v1.0
141
+ - **Sem breaking changes.** Upgrade direto via `npm install @neetru/sdk@1.0.0`.
142
+ - `initNeetru` continua deprecated mas funcional. **Será removido em v2.0.0.**
143
+ - `NeetruConfig` continua deprecated. Use `NeetruClientConfig`.
144
+
145
+ ### Stability promise (v1.x)
146
+ A partir de v1.0:
147
+ - Métodos novos podem ser adicionados a namespaces existentes (minor bump).
148
+ - Métodos podem ser marcados `@deprecated` em qualquer minor — só removidos
149
+ em major.
150
+ - Tipos nunca ganham campos required em minor (só optional ou via union).
151
+ - `NeetruErrorCode` é union fechado em v1.0 qualquer novo código bumpa minor.
152
+
153
+ ### Notes
154
+ - Pacote ainda **privado** (`private: true`). Publicação no npm é
155
+ responsabilidade do owner gate no CHANGELOG continua trancado até decisão.
156
+
157
+ ## [0.3.0] - 2026-05-06
158
+
159
+ ### Added
160
+ - Namespace `client.db` (v0.3) — wrapper minimalista pra coleções tenant-scoped:
161
+ - `client.db.collection(name).list({ limit? })`
162
+ - `client.db.collection(name).get(id)` (retorna null em not_found)
163
+ - `client.db.collection(name).set(id, data)` upsert
164
+ - `client.db.collection(name).remove(id)` delete
165
+ - Endpoints: `/sdk/v1/datastore/{collection}/{id?}` (placeholder REST Sprint 9
166
+ finaliza; SDK já expõe interface estável).
167
+ - `MockDb` (in-memory) ativo em `NEETRU_ENV=dev`.
168
+ - Namespace `client.usage` ganhou `report()` e `check()`:
169
+ - `usage.report(resource, qty?)` → `POST /sdk/v1/usage/record` canônico
170
+ (Sprint 7) — incrementa atomicamente `usage_counters/{tid}_{pid}_{r}_{yyyymm}`.
171
+ - `usage.check(resource)` `GET /sdk/v1/entitlements?productId&tenantId&feature`
172
+ retorna `{allowed, reason, remaining, limit, planId, planFeatures}`.
173
+ - `NeetruClientConfig.productId` / `.tenantId` — defaults pra `usage.report` /
174
+ `usage.check` / `db.collection` quando não passado em options.
175
+ - Mock helpers: `MockDb`, `MockUsage.report()`, `MockUsage.check()`.
176
+
177
+ ### Changed
178
+ - `VERSION` bump `0.2.0` → `0.3.0`.
179
+ - `NeetruClient` agora expõe `.db` além dos antigos.
180
+ - `ResolvedConfig` ganhou `productId` + `tenantId` opcionais.
181
+
182
+ ### Backend (acompanha esta release)
183
+ - Novos endpoints (Sprint 7):
184
+ - `POST /sdk/v1/usage/record` — atomic increment + 80%/100% notifications + audit.
185
+ - `GET /sdk/v1/entitlements` lookup canônico subscriptionplan→counter.
186
+ - `POST /sdk/v1/telemetry/log` batch logger pra `logs/{productId}/{yyyymmdd}/`.
187
+
188
+ ## [0.2.0] - 2026-05-06
189
+
190
+ ### Added
191
+ - Namespace `client.auth` (v0.2 — OIDC + dev mocks):
192
+ - `signIn(options?)` redireciona pra auth.neetru.com authorize endpoint
193
+ (browser) ou retorna mock user em dev (`NEETRU_ENV=dev`).
194
+ - `signOut()` limpa `localStorage.neetru_id_token` + revoga refresh
195
+ server-side (best-effort).
196
+ - `getUser()`decodifica id_token cached e retorna `NeetruUser` ou null.
197
+ - `onAuthStateChanged(listener)` — sub a mudanças, dispatcha sync no subscribe.
198
+ - Namespace `client.usage` (v0.2 — meter):
199
+ - `track(event, props?)` → `POST /sdk/v1/usage/record` com Bearer.
200
+ - `getQuota(metric)` `GET /sdk/v1/usage/quota?metric=` returns
201
+ `{ metric, used, limit, plan, resetsAt? }`.
202
+ - Namespace `client.support` (v0.2 tickets):
203
+ - `createTicket({subject, message, severity?, productSlug?})` →
204
+ `POST /api/v1/products/{slug}/tickets` (default `_default`).
205
+ - `listMyTickets()` → `GET ...` retorna array (aceita envelope `{tickets:[]}`).
206
+ - `mocks` module (`@neetru/sdk/mocks`):
207
+ - `MockAuth`, `MockUsage`, `MockSupport`, `MockEntitlements` overridáveis
208
+ via `createNeetruClient({ mocks: { auth: MockAuth(...), ... } })`.
209
+ - `DEV_FIXTURE_USER` constante exportada.
210
+ - `NEETRU_ENV` resolution chain: config arg > `process.env.NEETRU_ENV` >
211
+ `globalThis.NEETRU_ENV` > default `prod`. `dev` ativa mocks automáticos.
212
+ - Subpath exports adicionais: `@neetru/sdk/{auth,usage,support,mocks}`.
213
+ - Tipos novos: `NeetruUser`, `AuthNamespace`, `UsageNamespace`,
214
+ `SupportNamespace`, `SignInOptions`, `SupportTicket`, `UsageQuota`,
215
+ `NeetruEnv`, `CreateTicketInput`.
216
+
217
+ ### Changed
218
+ - `VERSION` bump `0.1.0` → `0.2.0`.
219
+ - `NeetruClientConfig` ganhou campos `env` + `mocks`.
220
+ - `ResolvedConfig` ganhou `env` resolved.
221
+ - `NeetruClient` agora expõe `.auth`, `.usage`, `.support` além dos antigos.
222
+
223
+ ### Backend (acompanha esta release — endpoints documentados em `docs/SDK_OPENAPI.md`)
224
+ - `POST /sdk/v1/usage/record` — record event meterado.
225
+ - `GET /sdk/v1/usage/quota?metric=` — ler quota atual.
226
+ - `POST /api/v1/products/{slug}/tickets` — criar ticket.
227
+ - `GET /api/v1/products/{slug}/tickets` — listar meus tickets.
228
+ - (auth) `auth.neetru.com/oauth/authorize` — já live (Sprint 1 OIDC).
229
+ - (auth) `auth.neetru.com/oauth/revoke` — revoga refresh token.
230
+
231
+ ### Notes
232
+ - Pacote ainda **privado** (`private: true`) — não publicado no npm.
233
+ - Carry-over: integração OIDC live aguarda owner habilitar redirect_uri pro
234
+ domain do consumer (configurar em `oidc_clients/{client_id}.redirect_uris`).
235
+ - TODO: `support.listMyTickets` precisa parametrizar productSlug (fixed
236
+ `_default` na v0.2).
237
+
238
+ ## [0.1.0] - 2026-05-05
239
+
240
+ ### Added
241
+ - `createNeetruClient(config)` factory — entry point principal.
242
+ - Resolve `apiKey` (arg explícito > `NEETRU_API_KEY` env em Node).
243
+ - Resolve `baseUrl` (default `https://api.neetru.com`).
244
+ - Resolve `fetch` (arg > `globalThis.fetch`).
245
+ - Namespace `client.catalog`:
246
+ - `list(opts?)` → `GET /api/v1/cli/catalog`. Aceita `includeDrafts`.
247
+ - `get(slug)` → `GET /api/v1/cli/catalog/{slug}`.
248
+ - Namespace `client.entitlements`:
249
+ - `check(slug, feature)` → boolean.
250
+ - `checkDetailed(slug, feature)` → `EntitlementCheck` com `reason`.
251
+ - Backed por `GET /api/v1/sdk/entitlements/check`.
252
+ - Namespace `client.telemetry`:
253
+ - `event({ name, properties?, timestamp? })` → `POST /api/v1/sdk/telemetry/event`.
254
+ - Subpath exports map: `@neetru/sdk/{catalog,entitlements,telemetry,errors}`.
255
+ - HTTP transport com mapeamento status → `NeetruError.code` estável.
256
+ - Tipos exportados: `NeetruClient`, `NeetruClientConfig`, `Product`, `ProductPlan`,
257
+ `EntitlementCheck`, `TelemetryEventInput`, `TelemetryEventAck`, `NeetruErrorCode`.
258
+ - Compat alias `initNeetru` (deprecated, será removido em v1.0).
259
+
260
+ ### Changed
261
+ - `VERSION` bump `0.0.1` → `0.1.0`.
262
+ - tsup config multi-entry pra subpath imports.
263
+
264
+ ### Backend (acompanha esta release)
265
+ - `GET /api/v1/cli/catalog/{slug}` — produto único.
266
+ - `GET /api/v1/sdk/entitlements/check?slug=&feature=` — verificação por user.
267
+ - `POST /api/v1/sdk/telemetry/event` — persiste em `usage_events`.
268
+
269
+ ### Notes
270
+ - Pacote ainda **privado** (`private: true`). Publicação no npm é
271
+ responsabilidade do owner em Sprint 6.
272
+ - API instável; pré-1.0 segue regra "breaking allowed em qualquer minor".
273
+
274
+ ## [0.0.1] - 2026-05-04
275
+
276
+ ### Added
277
+ - Scaffold inicial do pacote `@neetru/sdk` (private, não publicado no npm ainda).
278
+ - `initNeetru(config)` com validação de `apiUrl` e injeção opcional de `fetch`.
279
+ - `NeetruError` com `code`, `status` e `requestId` opcionais.
280
+ - `NeetruConfig` e `NeetruClient` types públicos.
281
+ - `VERSION` const exportada.
282
+ - Build pipeline com tsup (dual ESM + CJS + `.d.ts`).
283
+ - README + CHANGELOG.
284
+ - `tsconfig.json` strict ES2022 ESNext.