@norbix.ai/ts 1.0.1
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/LICENSE +21 -0
- package/README.md +628 -0
- package/dist/api/index.cjs +1104 -0
- package/dist/api/index.cjs.map +1 -0
- package/dist/api/index.d.cts +3 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.js +1102 -0
- package/dist/api/index.js.map +1 -0
- package/dist/hub/index.cjs +5854 -0
- package/dist/hub/index.cjs.map +1 -0
- package/dist/hub/index.d.cts +2174 -0
- package/dist/hub/index.d.ts +2174 -0
- package/dist/hub/index.js +5852 -0
- package/dist/hub/index.js.map +1 -0
- package/dist/index-BARFtiR-.d.cts +459 -0
- package/dist/index-t6pXnReB.d.ts +459 -0
- package/dist/index.cjs +7628 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +225 -0
- package/dist/index.d.ts +225 -0
- package/dist/index.js +7619 -0
- package/dist/index.js.map +1 -0
- package/dist/transport-c4_dsqN0.d.cts +269 -0
- package/dist/transport-c4_dsqN0.d.ts +269 -0
- package/dist/types/api2.dtos.cjs +3802 -0
- package/dist/types/api2.dtos.cjs.map +1 -0
- package/dist/types/api2.dtos.d.cts +2055 -0
- package/dist/types/api2.dtos.d.ts +2055 -0
- package/dist/types/api2.dtos.js +3802 -0
- package/dist/types/api2.dtos.js.map +1 -0
- package/dist/types/hub2.dtos.cjs +19537 -0
- package/dist/types/hub2.dtos.cjs.map +1 -0
- package/dist/types/hub2.dtos.d.cts +10399 -0
- package/dist/types/hub2.dtos.d.ts +10399 -0
- package/dist/types/hub2.dtos.js +19537 -0
- package/dist/types/hub2.dtos.js.map +1 -0
- package/package.json +112 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 UAB Isidos
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
<!-- BEGIN: HERO -->
|
|
2
|
+
<p align="center">
|
|
3
|
+
<a href="https://norbix.ai">
|
|
4
|
+
<img src="https://norbix.ai/brand/wordmark.svg" alt="Norbix" height="64" />
|
|
5
|
+
</a>
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
<div align="center">
|
|
9
|
+
<h1>Norbix TypeScript SDK</h1>
|
|
10
|
+
<p><strong>The MCP-native Backend-as-a-Service for the agentic era.</strong></p>
|
|
11
|
+
|
|
12
|
+
<p>
|
|
13
|
+
<a href="https://github.com/norbix-code/sdk-ts/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/badge/license-MIT-blue.svg" /></a>
|
|
14
|
+
<a href="https://github.com/norbix-code/sdk-ts/actions"><img alt="CI" src="https://github.com/norbix-code/sdk-ts/actions/workflows/ci.yml/badge.svg" /></a>
|
|
15
|
+
<a href="https://www.npmjs.com/package/@norbix.ai/ts"><img alt="@norbix.ai/ts" src="https://img.shields.io/npm/v/@norbix.ai/ts.svg?label=@norbix.ai/ts&logo=npm" /></a>
|
|
16
|
+
<a href="https://nodejs.org"><img alt="node" src="https://img.shields.io/badge/node-%3E=18-success?logo=node.js" /></a>
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<p>
|
|
20
|
+
<a href="#getting-started"><strong>Quickstart</strong></a>
|
|
21
|
+
·
|
|
22
|
+
<a href="https://norbix.ai">Website</a>
|
|
23
|
+
·
|
|
24
|
+
<a href="https://docs.norbix.ai">Docs</a>
|
|
25
|
+
·
|
|
26
|
+
<a href="https://github.com/norbix-code/examples">Examples</a>
|
|
27
|
+
·
|
|
28
|
+
<a href="https://norbix.ai/blog">Blog</a>
|
|
29
|
+
·
|
|
30
|
+
<a href="https://x.com/norbix">X</a>
|
|
31
|
+
·
|
|
32
|
+
<a href="https://www.youtube.com/@norbix">YouTube</a>
|
|
33
|
+
·
|
|
34
|
+
<a href="https://norbix.ai/discord">Discord</a>
|
|
35
|
+
</p>
|
|
36
|
+
|
|
37
|
+
<p>
|
|
38
|
+
<a href="https://www.youtube.com/watch?v=NORBIX_TS_DEMO_ID">
|
|
39
|
+
<img src="https://norbix.ai/og/sdk-ts-video.png" alt="Watch the 90-second TypeScript SDK demo on YouTube" width="720" />
|
|
40
|
+
</a>
|
|
41
|
+
</p>
|
|
42
|
+
<p><em>↑ 90-second demo — <a href="https://www.youtube.com/watch?v=NORBIX_TS_DEMO_ID">watch on YouTube</a></em></p>
|
|
43
|
+
|
|
44
|
+
<hr />
|
|
45
|
+
</div>
|
|
46
|
+
<!-- END: HERO -->
|
|
47
|
+
|
|
48
|
+
<!-- BEGIN: WHAT_IS_NORBIX -->
|
|
49
|
+
|
|
50
|
+
## What is Norbix?
|
|
51
|
+
|
|
52
|
+
Norbix is a **Backend-as-a-Service** built for the agentic era. One platform exposes everything an app needs — auth, database, file storage, email, push, payments, code functions, logging — as both a typed SDK _and_ an MCP server, so a developer and their agent can call the same backend the same way.
|
|
53
|
+
|
|
54
|
+
It runs three ways: as a fully **managed cloud** at [`cloud.norbix.ai`](https://cloud.norbix.ai) (zero DevOps), **self-hosted** on your own machine or server, or as **enterprise** in your VPC. Same modules, same APIs, same SDKs — pick the runway, not the runtime.
|
|
55
|
+
|
|
56
|
+
This repo is the **TypeScript SDK** — one package on npm (`@norbix.ai/ts`) that exposes both the runtime **API** and the configuration **Hub** as separate import paths so you only ship the surface you actually use. Plus a third surface, the [Norbix MCP server](#norbix-mcp--same-modules-agent-native), that exposes the same modules to your IDE. Works in Node 18+ and modern browsers.
|
|
57
|
+
|
|
58
|
+
<!-- END: WHAT_IS_NORBIX -->
|
|
59
|
+
|
|
60
|
+
<!-- BEGIN: API_VS_HUB -->
|
|
61
|
+
|
|
62
|
+
## Two surfaces in one package — API or Hub?
|
|
63
|
+
|
|
64
|
+
Norbix has two surfaces, and each is its own import path. The npm package is one (`@norbix.ai/ts`), but tree-shaking is per-subpath — pick the one that matches what your code is doing. Most apps need only the API in production code; the Hub is for admin tooling, internal dashboards, and infrastructure-as-code.
|
|
65
|
+
|
|
66
|
+
| | **`@norbix.ai/ts/api`** | **`@norbix.ai/ts/hub`** |
|
|
67
|
+
| -------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
68
|
+
| **Surface** | Runtime — what your app does at request time | Control plane — how Norbix is configured |
|
|
69
|
+
| **Scope** | Project-scoped data | Project & account configuration |
|
|
70
|
+
| **Default base URL** | `https://api.norbix.ai` | `https://hub.norbix.ai` |
|
|
71
|
+
| **Typical caller** | Your app's backend, your mobile app, your AI agent | Your admin UI, your CLI, your IaC scripts |
|
|
72
|
+
| **Examples** | Sign in users · query collections · send transactional email · charge a card · invoke a function · run an AI chat | Define schemas · configure an SMTP provider · invite a teammate · open a billing portal · set up a webhook |
|
|
73
|
+
|
|
74
|
+
```sh
|
|
75
|
+
# One install — pick the import path you need
|
|
76
|
+
npm install @norbix.ai/ts
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
// App / runtime code
|
|
81
|
+
import { Norbix } from '@norbix.ai/ts';
|
|
82
|
+
|
|
83
|
+
// Both surfaces are reachable from one client:
|
|
84
|
+
norbix.api.database.find({ collectionName: 'orders' });
|
|
85
|
+
norbix.hub.database.getAllDatabaseSchemas();
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Both surfaces share the same authentication model, the same error model, and the same configuration shape. Want a third option that's not a package at all? See [Norbix MCP](#norbix-mcp--same-modules-agent-native) — same modules, exposed to your IDE.
|
|
89
|
+
|
|
90
|
+
<!-- END: API_VS_HUB -->
|
|
91
|
+
|
|
92
|
+
<!-- BEGIN: GETTING_STARTED -->
|
|
93
|
+
|
|
94
|
+
## Getting started
|
|
95
|
+
|
|
96
|
+
The Getting Started examples below use the **API** surface because that's what most apps need first. The Hub follows the same shape — see [Hub example](#hub-example) below.
|
|
97
|
+
|
|
98
|
+
### Install
|
|
99
|
+
|
|
100
|
+
```sh
|
|
101
|
+
npm install @norbix.ai/ts
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Three real things in 30 lines
|
|
105
|
+
|
|
106
|
+
The examples below assume an API key from the [Norbix Cloud Dashboard](https://cloud.norbix.ai) and a project ID. The same code works against self-hosted and enterprise deployments — only the base URL changes (see [Authentication & configuration](#authentication--configuration)).
|
|
107
|
+
|
|
108
|
+
#### 1. Register a user
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
import { Norbix } from '@norbix.ai/ts';
|
|
112
|
+
|
|
113
|
+
const norbix = new Norbix({
|
|
114
|
+
apiKey: process.env.NORBIX_API_KEY,
|
|
115
|
+
projectId: 'proj_123',
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const user = await norbix.api.membership.saveEmailUser({
|
|
119
|
+
email: 'ada@example.com',
|
|
120
|
+
password: 'correct-horse-battery-staple',
|
|
121
|
+
firstName: 'Ada',
|
|
122
|
+
lastName: 'Lovelace',
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
console.log(user.id);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### 2. Insert a record
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
const order = await norbix.api.database.insertOne({
|
|
132
|
+
collectionName: 'orders',
|
|
133
|
+
document: {
|
|
134
|
+
userId: user.id,
|
|
135
|
+
amount: 4900,
|
|
136
|
+
currency: 'EUR',
|
|
137
|
+
status: 'pending',
|
|
138
|
+
items: [
|
|
139
|
+
{ sku: 'NBX-T-SHIRT', qty: 1, price: 2900 },
|
|
140
|
+
{ sku: 'NBX-MUG', qty: 1, price: 2000 },
|
|
141
|
+
],
|
|
142
|
+
createdAt: new Date().toISOString(),
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
console.log(order.id);
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
#### 3. Ask the AI
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
const answer = await norbix.api.chat.askChat({
|
|
153
|
+
messages: [
|
|
154
|
+
{ role: 'system', content: 'You are a concise sales assistant.' },
|
|
155
|
+
{ role: 'user', content: `Summarise order ${order.id} in one sentence.` },
|
|
156
|
+
],
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
console.log(answer.content);
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
That's the loop — auth, data, AI — using three real modules behind one client. The same modules are exposed as MCP tools, so any MCP-native agent can drive the same flow. Email/push/payments and other configurable surfaces live on the **Hub** — see [Hub example](#hub-example).
|
|
163
|
+
|
|
164
|
+
> **Want it in your language?** See the [Norbix SDKs](#norbix-sdks) family below — every SDK exposes the same module names and method shapes.
|
|
165
|
+
|
|
166
|
+
<!-- END: GETTING_STARTED -->
|
|
167
|
+
|
|
168
|
+
<!-- BEGIN: AUTH_AND_CONFIG -->
|
|
169
|
+
|
|
170
|
+
## Authentication & configuration
|
|
171
|
+
|
|
172
|
+
Both surfaces share the same configuration shape. The only difference is the **default base URL**: the API surface points at `https://api.norbix.ai`, the Hub surface points at `https://hub.norbix.ai`.
|
|
173
|
+
|
|
174
|
+
### Auth modes
|
|
175
|
+
|
|
176
|
+
The SDK supports two auth modes. Both are sent as `Authorization: Bearer <token>`. If both are configured, the JWT wins. With neither configured, the SDK throws `NORBIX_NOT_AUTHENTICATED` on the first call.
|
|
177
|
+
|
|
178
|
+
| Mode | When to use | How |
|
|
179
|
+
| -------------- | ---------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
180
|
+
| **API key** | Server-to-server, scripts, scheduled jobs, IaC | `apiKey: '...'` or `NORBIX_API_KEY` env |
|
|
181
|
+
| **JWT bearer** | Logged-in user session | `bearerToken: '...'`, `NORBIX_BEARER_TOKEN` env, or `await norbix.login(...)` |
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
// Service mode — long-lived API key
|
|
185
|
+
const norbix = new Norbix({ apiKey: '<api_key>', projectId: 'proj_123' });
|
|
186
|
+
|
|
187
|
+
// User mode — exchange credentials for a JWT
|
|
188
|
+
const norbix = new Norbix({ projectId: 'proj_123' });
|
|
189
|
+
await norbix.login({ userName: 'alice@team.io', password: 'secret' });
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Default base URLs
|
|
193
|
+
|
|
194
|
+
When you install the package, no base URL is required — the SDK points at Norbix Cloud by default.
|
|
195
|
+
|
|
196
|
+
| Surface | Default base URL |
|
|
197
|
+
| ---------------- | ----------------------- |
|
|
198
|
+
| **`norbix.api`** | `https://api.norbix.ai` |
|
|
199
|
+
| **`norbix.hub`** | `https://hub.norbix.ai` |
|
|
200
|
+
|
|
201
|
+
### Overriding the base URL
|
|
202
|
+
|
|
203
|
+
Override the base URL when you self-host Norbix on your own infrastructure or run it locally. Pass it as a constructor option, or set the corresponding env var. Two real-world examples:
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
// Self-hosted on your company domain
|
|
207
|
+
const norbix = new Norbix({
|
|
208
|
+
apiKey: process.env.NORBIX_API_KEY,
|
|
209
|
+
projectId: 'proj_123',
|
|
210
|
+
apiBaseUrl: 'https://api.norbix.isidos.lt',
|
|
211
|
+
hubBaseUrl: 'https://hub.norbix.isidos.lt',
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Local development against a Norbix instance on localhost
|
|
215
|
+
const norbix = new Norbix({
|
|
216
|
+
apiKey: 'sk_dev_local',
|
|
217
|
+
projectId: 'proj_dev',
|
|
218
|
+
apiBaseUrl: 'http://localhost:5000',
|
|
219
|
+
hubBaseUrl: 'http://localhost:5001',
|
|
220
|
+
});
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Or via environment variables (no code change required):
|
|
224
|
+
|
|
225
|
+
```sh
|
|
226
|
+
NORBIX_API_KEY=sk_live_...
|
|
227
|
+
NORBIX_PROJECT_ID=proj_123
|
|
228
|
+
NORBIX_ACCOUNT_ID=acc_456 # optional, unlocks Hub account-scoped endpoints
|
|
229
|
+
NORBIX_REGION=nb-eu-germany # optional, pins requests to a Norbix region (see Regions)
|
|
230
|
+
NORBIX_API_URL=https://api.norbix.ai # override for self-hosted, e.g. https://api.norbix.isidos.lt
|
|
231
|
+
NORBIX_HUB_URL=https://hub.norbix.ai # override for self-hosted, e.g. https://hub.norbix.isidos.lt
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
```ts
|
|
235
|
+
const norbix = new Norbix(); // reads everything from env, including the overridden URLs
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
The SDK does **not** load `.env` files itself — use `node --env-file=.env` (Node 20+) or `import 'dotenv/config'` in your app's bootstrap. In the browser (where `process` doesn't exist) env loading is a silent no-op.
|
|
239
|
+
|
|
240
|
+
### Regions
|
|
241
|
+
|
|
242
|
+
Norbix Cloud is multi-region. A region is identified by a **region code** such as `nb-eu-germany`, and the SDK lets you pin requests to one in three ways — constructor option, environment variable, or at runtime:
|
|
243
|
+
|
|
244
|
+
```ts
|
|
245
|
+
// 1. Constructor option
|
|
246
|
+
const norbix = new Norbix({
|
|
247
|
+
apiKey: process.env.NORBIX_API_KEY,
|
|
248
|
+
projectId: 'proj_123',
|
|
249
|
+
region: 'nb-eu-germany',
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
// 2. NORBIX_REGION env var — picked up when the option is not set
|
|
253
|
+
// NORBIX_REGION=nb-eu-germany
|
|
254
|
+
const norbix = new Norbix();
|
|
255
|
+
|
|
256
|
+
// 3. Switch at runtime
|
|
257
|
+
norbix.setRegion('nb-us-east');
|
|
258
|
+
norbix.getRegion(); // 'nb-us-east'
|
|
259
|
+
norbix.setRegion(undefined); // clear — back to no region
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
And a fourth way: every endpoint method accepts a per-call `region` override on its second argument, just like `bearerToken` and `timeoutMs`:
|
|
263
|
+
|
|
264
|
+
```ts
|
|
265
|
+
await norbix.api.database.find(
|
|
266
|
+
{ collectionName: 'orders' },
|
|
267
|
+
{ region: 'nb-us-east' },
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
await norbix.hub.account.getProjects({}, { region: 'nb-us-east' });
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
**How a region affects the request.** The resolved region (per-call override → client `region` → `NORBIX_REGION`) is sent as the `nb-region` header. There is **no default region** — when nothing is set, no header is sent and the backend routes to the project's primary region. Self-hosted deployments are unaffected: no region configured means requests are byte-identical to the pre-regions behavior.
|
|
274
|
+
|
|
275
|
+
**Regional base URLs.** When the client uses the SDK's built-in default base URLs, setting a client-level region also composes the regional URL by prefixing the region code as a subdomain — `https://api.norbix.dev` becomes `https://nb-eu-germany.api.norbix.dev` (and likewise for the Hub URL). `setRegion(...)` re-composes the URL, and `setRegion(undefined)` restores the defaults. Two rules to remember:
|
|
276
|
+
|
|
277
|
+
- A custom `baseUrl` (or `NORBIX_API_URL` / `NORBIX_HUB_URL`) is **never rewritten** — with a region set, only the `nb-region` header is added.
|
|
278
|
+
- A **per-call** `region` override affects the **header only** — it never changes the request URL.
|
|
279
|
+
|
|
280
|
+
**Managing a project's regions.** The Hub's `regions` module lists the regions available to the account and updates the set of regions a project spans (one primary + any additional):
|
|
281
|
+
|
|
282
|
+
```ts
|
|
283
|
+
// List available regions — each item carries { id, continent, name }
|
|
284
|
+
const { items } = await norbix.hub.regions.list();
|
|
285
|
+
|
|
286
|
+
// Change the project's primary region / the regions it spans
|
|
287
|
+
await norbix.hub.regions.updateProjectRegions({
|
|
288
|
+
projectId: 'proj_123',
|
|
289
|
+
primaryRegion: 'nb-eu-germany',
|
|
290
|
+
additionalRegions: ['nb-us-east'],
|
|
291
|
+
});
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
`hub.account.createProject` accepts the same `primaryRegion` / `additionalRegions` fields, project DTOs report `primaryRegion`, `additionalRegions`, and the combined `regions[]`, and the `echo` endpoint lists the regions a deployment exposes with their regional endpoints. Full reference: [`docs/hub/regions.md`](./docs/hub/regions.md).
|
|
295
|
+
|
|
296
|
+
### SSR / multi-tenant safe usage
|
|
297
|
+
|
|
298
|
+
For per-request scoping (different bearer tokens per request), pass the token as a per-call override on the second argument instead of mutating a shared singleton with `setBearerToken(...)`:
|
|
299
|
+
|
|
300
|
+
```ts
|
|
301
|
+
await norbix.api.database.find(
|
|
302
|
+
{ collectionName: 'orders' },
|
|
303
|
+
{ bearerToken: requestUserToken, timeoutMs: 5_000 },
|
|
304
|
+
);
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Every generated endpoint method accepts the same `{ bearerToken?, timeoutMs?, env?, region? }` options as its second argument.
|
|
308
|
+
|
|
309
|
+
> **Project vs account scope.** `projectId` is required by the API surface. `accountId` is required by the Hub surface for endpoints that act on the account (team invite, billing portal, account verify). Calling those without `accountId` throws `NORBIX_ACCOUNT_SCOPE_REQUIRED` _before_ the request leaves your machine.
|
|
310
|
+
|
|
311
|
+
<!-- END: AUTH_AND_CONFIG -->
|
|
312
|
+
|
|
313
|
+
<!-- BEGIN: MODULES -->
|
|
314
|
+
|
|
315
|
+
## Modules
|
|
316
|
+
|
|
317
|
+
The SDK is a thin client over the Norbix gateway. Every module below resolves to a typed namespace on the client _and_ an MCP tool group, so the same surface is reachable from code or from an agent. Per-module reference pages live in [`/docs`](./docs) and on [docs.norbix.ai](https://docs.norbix.ai).
|
|
318
|
+
|
|
319
|
+
### `norbix.api` — runtime, project-scoped
|
|
320
|
+
|
|
321
|
+
Default base URL: `https://api.norbix.ai`. **8 modules · 66 endpoints.**
|
|
322
|
+
|
|
323
|
+
| Module | Purpose | Reference |
|
|
324
|
+
| ---------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
|
|
325
|
+
| 🔐 `auth` | Sign-in flows. Most apps prefer `norbix.login(...)`. | [`docs/api/auth.md`](./docs/api/auth.md) |
|
|
326
|
+
| 👤 `membership` | User CRUD, registration, login, passkeys, email verification, magic links, roles, preferences | [`docs/api/membership.md`](./docs/api/membership.md) |
|
|
327
|
+
| 🗄️ `database` | Collections, find/insert/update/delete, aggregate, taxonomies | [`docs/api/database.md`](./docs/api/database.md) |
|
|
328
|
+
| 📁 `files` | Signed upload URLs, download, file info, listing | [`docs/api/files.md`](./docs/api/files.md) |
|
|
329
|
+
| 🤖 `chat` | AI chat completion | [`docs/api/chat.md`](./docs/api/chat.md) |
|
|
330
|
+
| 🔑 `apikeys` | List + regenerate per-environment API keys | [`docs/api/apikeys.md`](./docs/api/apikeys.md) |
|
|
331
|
+
| 🪪 `accessToken` | Refresh-token exchange | [`docs/api/access_token.md`](./docs/api/access_token.md) |
|
|
332
|
+
| 🩺 `echo` | Gateway smoke check | [`docs/api/echo.md`](./docs/api/echo.md) |
|
|
333
|
+
|
|
334
|
+
> Email/push/SMS notifications, payments, and code execution are configured on the **Hub** surface and surfaced at runtime through integration triggers — they are not separate API modules. File storage now has its own `files` API module: it issues signed upload URLs so clients upload binary content directly to storage, never streaming bytes through the Norbix API.
|
|
335
|
+
|
|
336
|
+
→ [Full API index](./docs/api/_index.md)
|
|
337
|
+
|
|
338
|
+
### `norbix.hub` — control plane, configuration
|
|
339
|
+
|
|
340
|
+
Default base URL: `https://hub.norbix.ai`. **18 modules · 315 endpoints.**
|
|
341
|
+
|
|
342
|
+
| Module | Purpose | Reference |
|
|
343
|
+
| ------------------ | ----------------------------------------------------------------------- | ---------------------------------------------------------- |
|
|
344
|
+
| 🏢 `account` | Account profile, status, projects, regions, team, billing, verification | [`docs/hub/account.md`](./docs/hub/account.md) |
|
|
345
|
+
| 🌍 `regions` | List available Norbix regions, update the regions a project spans | [`docs/hub/regions.md`](./docs/hub/regions.md) |
|
|
346
|
+
| 🗄️ `database` | Schemas, integrations, saved aggregates, taxonomies, triggers | [`docs/hub/database.md`](./docs/hub/database.md) |
|
|
347
|
+
| 📁 `files` | File-storage integrations, triggers, module settings | [`docs/hub/files.md`](./docs/hub/files.md) |
|
|
348
|
+
| 📧 `notifications` | Email, push & SMS templates, integrations, campaigns, contacts, devices | [`docs/hub/notifications.md`](./docs/hub/notifications.md) |
|
|
349
|
+
| 📨 `email` | Email module switches | [`docs/hub/email.md`](./docs/hub/email.md) |
|
|
350
|
+
| 💳 `payments` | Payment integrations, triggers, tests, module settings | [`docs/hub/payments.md`](./docs/hub/payments.md) |
|
|
351
|
+
| 🤖 `ai` | LLM and MCP integration configuration and tests | [`docs/hub/ai.md`](./docs/hub/ai.md) |
|
|
352
|
+
| 📊 `logs` | Logging integrations and module settings | [`docs/hub/logs.md`](./docs/hub/logs.md) |
|
|
353
|
+
| 👥 `membership` | Roles, policies, users, preferences, integrations, triggers | [`docs/hub/membership.md`](./docs/hub/membership.md) |
|
|
354
|
+
| ⏰ `scheduler` | Scheduler module and task management | [`docs/hub/scheduler.md`](./docs/hub/scheduler.md) |
|
|
355
|
+
| 🪝 `webhooks` | Webhook integrations, destinations, tests, module settings | [`docs/hub/webhooks.md`](./docs/hub/webhooks.md) |
|
|
356
|
+
| 🔐 `auth` | Hub-side sign-in flows | [`docs/hub/auth.md`](./docs/hub/auth.md) |
|
|
357
|
+
| 🔑 `apikeys` | List + regenerate Hub API keys | [`docs/hub/apikeys.md`](./docs/hub/apikeys.md) |
|
|
358
|
+
| 🪪 `accessToken` | Refresh-token exchange | [`docs/hub/access_token.md`](./docs/hub/access_token.md) |
|
|
359
|
+
| 🩺 `echo` | Gateway smoke check | [`docs/hub/echo.md`](./docs/hub/echo.md) |
|
|
360
|
+
| 🛠️ `internal` | Internal helpers | [`docs/hub/internal.md`](./docs/hub/internal.md) |
|
|
361
|
+
| 📦 `resources` | Resolve resource references | [`docs/hub/resources.md`](./docs/hub/resources.md) |
|
|
362
|
+
|
|
363
|
+
→ [Full Hub index](./docs/hub/_index.md)
|
|
364
|
+
|
|
365
|
+
<!-- END: MODULES -->
|
|
366
|
+
|
|
367
|
+
<!-- BEGIN: HUB_EXAMPLE -->
|
|
368
|
+
|
|
369
|
+
## Hub example
|
|
370
|
+
|
|
371
|
+
The Hub surface follows the same shape as the API surface — same constructor, same auth, same client. Use it from admin tooling, internal dashboards, or IaC scripts.
|
|
372
|
+
|
|
373
|
+
```ts
|
|
374
|
+
import { Norbix } from '@norbix.ai/ts';
|
|
375
|
+
|
|
376
|
+
const norbix = new Norbix({
|
|
377
|
+
apiKey: process.env.NORBIX_API_KEY,
|
|
378
|
+
accountId: 'acc_456',
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
// Define a database schema for a new collection
|
|
382
|
+
await norbix.hub.database.saveDatabaseSchema({
|
|
383
|
+
collectionName: 'orders',
|
|
384
|
+
fields: [
|
|
385
|
+
{ name: 'userId', type: 'string', required: true, indexed: true },
|
|
386
|
+
{ name: 'amount', type: 'integer', required: true },
|
|
387
|
+
{ name: 'currency', type: 'string', required: true },
|
|
388
|
+
{ name: 'status', type: 'string', required: true, enum: ['pending', 'paid', 'refunded'] },
|
|
389
|
+
{ name: 'createdAt', type: 'datetime', required: true },
|
|
390
|
+
],
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
// Invite a teammate
|
|
394
|
+
await norbix.hub.account.sendInviteToTeamMember({
|
|
395
|
+
email: 'maya@team.io',
|
|
396
|
+
role: 'developer',
|
|
397
|
+
});
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
<!-- END: HUB_EXAMPLE -->
|
|
401
|
+
|
|
402
|
+
<!-- BEGIN: MCP -->
|
|
403
|
+
|
|
404
|
+
## Norbix MCP — same modules, agent-native
|
|
405
|
+
|
|
406
|
+
Norbix ships an MCP (Model Context Protocol) server that exposes every API and Hub module as agent-callable tools. Same surface as this SDK, just over a different transport — when you connect the Norbix MCP to your IDE, the agent in your editor can read your project, run scripts, and call Norbix the same way your app does.
|
|
407
|
+
|
|
408
|
+
**What it gives you:**
|
|
409
|
+
|
|
410
|
+
- **Total SDK & API knowledge.** The Norbix MCP knows every module, every method, every request/response type — across _all_ Norbix SDKs (TypeScript, .NET, Python, Dart, Kotlin, Swift) and the underlying gateway. Ask "how do I send a templated email from the .NET SDK?" in your IDE chat and the agent answers from the same source the docs are generated from.
|
|
411
|
+
- **Code-aware actions.** Connect it to your repo and the agent can update project constants, regenerate types after a Hub schema change, scaffold a new module integration, run a Norbix CLI command, or open a PR — without leaving the chat. Run a script or talk to it; same surface, two interaction modes.
|
|
412
|
+
- **Drop-in IDE setup.** One config block in your IDE's MCP settings and you're done. The MCP server runs locally and proxies to your Cloud / self-hosted / enterprise Norbix instance using the same `NORBIX_API_URL` / `NORBIX_HUB_URL` env vars as the SDK.
|
|
413
|
+
|
|
414
|
+
**Setup in your IDE:**
|
|
415
|
+
|
|
416
|
+
| IDE | Setup guide |
|
|
417
|
+
| ---------------------- | -------------------------------------------------------------------------------- |
|
|
418
|
+
| **Claude Code** | [`docs.norbix.ai/mcp/claude-code`](https://docs.norbix.ai/mcp/claude-code) |
|
|
419
|
+
| **Cursor** | [`docs.norbix.ai/mcp/cursor`](https://docs.norbix.ai/mcp/cursor) |
|
|
420
|
+
| **Windsurf** | [`docs.norbix.ai/mcp/windsurf`](https://docs.norbix.ai/mcp/windsurf) |
|
|
421
|
+
| **Codex** | [`docs.norbix.ai/mcp/codex`](https://docs.norbix.ai/mcp/codex) |
|
|
422
|
+
| **Claude Desktop** | [`docs.norbix.ai/mcp/claude-desktop`](https://docs.norbix.ai/mcp/claude-desktop) |
|
|
423
|
+
| **VS Code (Continue)** | [`docs.norbix.ai/mcp/vscode`](https://docs.norbix.ai/mcp/vscode) |
|
|
424
|
+
| **Zed** | [`docs.norbix.ai/mcp/zed`](https://docs.norbix.ai/mcp/zed) |
|
|
425
|
+
|
|
426
|
+
→ [Full MCP documentation](https://docs.norbix.ai/mcp) · [Why MCP?](https://docs.norbix.ai/mcp/why) · [Self-hosted MCP](https://docs.norbix.ai/mcp/self-hosted)
|
|
427
|
+
|
|
428
|
+
<!-- END: MCP -->
|
|
429
|
+
|
|
430
|
+
<!-- BEGIN: SDK_FAMILY -->
|
|
431
|
+
|
|
432
|
+
## Norbix SDKs
|
|
433
|
+
|
|
434
|
+
Same modules, same method shapes, every language. Each row links to the repo for that language. Package shape varies per language ecosystem norm — TypeScript, Python, Dart, and Kotlin ship a single package; .NET and Swift ship two surfaces (NuGet packages / SwiftPM library products) inside one repo.
|
|
435
|
+
|
|
436
|
+
| Language | Package | Repo | Status |
|
|
437
|
+
| ----------------- | ----------------------------------------- | ----------------------------------------------------------------------- | -------------- |
|
|
438
|
+
| TypeScript / Node | `@norbix.ai/ts` | [norbix-code/sdk-ts](https://github.com/norbix-code/sdk-ts) | ✅ Stable |
|
|
439
|
+
| .NET | `Norbix.Api` + `Norbix.Hub` | [norbix-dev/norbix-net](https://github.com/norbix-dev/norbix-net) | ✅ Stable |
|
|
440
|
+
| Python | `norbix` | [norbix-dev/norbix-python](https://github.com/norbix-dev/norbix-python) | 🚧 In progress |
|
|
441
|
+
| Dart / Flutter | `norbix` | [norbix-dev/norbix-dart](https://github.com/norbix-dev/norbix-dart) | 🚧 In progress |
|
|
442
|
+
| Kotlin | `dev.norbix:norbix` | [norbix-dev/norbix-kotlin](https://github.com/norbix-dev/norbix-kotlin) | 🚧 In progress |
|
|
443
|
+
| Swift | `Norbix` (libs: `NorbixApi`, `NorbixHub`) | [norbix-dev/norbix-swift](https://github.com/norbix-dev/norbix-swift) | 🚧 In progress |
|
|
444
|
+
|
|
445
|
+
<!-- END: SDK_FAMILY -->
|
|
446
|
+
|
|
447
|
+
<!-- BEGIN: INSTALL_NORBIX -->
|
|
448
|
+
|
|
449
|
+
## Install Norbix
|
|
450
|
+
|
|
451
|
+
Three ways to run the backend this SDK talks to. Pick by who owns the infrastructure and how strict the compliance bar is.
|
|
452
|
+
|
|
453
|
+
### A. Try it on Norbix Cloud — fastest
|
|
454
|
+
|
|
455
|
+
Zero DevOps. Spin up a managed project on [`cloud.norbix.ai`](https://cloud.norbix.ai), grab an API key, point the SDK at it. The default base URLs (`https://api.norbix.ai` and `https://hub.norbix.ai`) already point at Cloud — no override needed. **7-day free trial, no credit card.**
|
|
456
|
+
|
|
457
|
+
```sh
|
|
458
|
+
# 1. Sign up at https://cloud.norbix.ai
|
|
459
|
+
# 2. Create a project, copy the API key + project ID
|
|
460
|
+
export NORBIX_API_KEY=sk_live_...
|
|
461
|
+
export NORBIX_PROJECT_ID=proj_...
|
|
462
|
+
# 3. Run any of the examples above. You're done.
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
→ [Sign up](https://cloud.norbix.ai) · [Cloud docs](https://docs.norbix.ai/cloud)
|
|
466
|
+
|
|
467
|
+
### B. Self-host on your machine or your server
|
|
468
|
+
|
|
469
|
+
Run Norbix on Docker, Kamal, Terraform, AWS CDK, Kubernetes, DigitalOcean, a VPS, or bare metal. Issue a license from the Cloud Dashboard, then deploy with one command. Override the SDK's base URL to point at your deployment.
|
|
470
|
+
|
|
471
|
+
**1. Get a self-hosted license.** Sign in at [`cloud.norbix.ai`](https://cloud.norbix.ai), open the Self-Hosted tab, generate a license key.
|
|
472
|
+
|
|
473
|
+
**2. Deploy.** Build your install in the Cloud Dashboard's installer UI **or** clone the install repo:
|
|
474
|
+
|
|
475
|
+
```sh
|
|
476
|
+
# Quickest — Docker Compose
|
|
477
|
+
git clone https://github.com/norbix-code/install
|
|
478
|
+
cd install/docker-compose
|
|
479
|
+
NORBIX_LICENSE_KEY=lic_... docker compose up -d
|
|
480
|
+
# Norbix is up at http://localhost:5000 (API) and http://localhost:5001 (Hub) by default
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
**Other deployment paths** (each in a sibling folder of the install repo):
|
|
484
|
+
|
|
485
|
+
| Method | Folder | Best for |
|
|
486
|
+
| ------------------- | ----------------- | ------------------------------- |
|
|
487
|
+
| 🐳 Docker | `docker-compose/` | Local dev, single VM |
|
|
488
|
+
| 🚢 Kamal | `kamal/` | One-server deploys, Rails-style |
|
|
489
|
+
| 🏗️ Terraform | `terraform/` | Multi-cloud IaC |
|
|
490
|
+
| ☁️ AWS CDK | `aws-cdk/` | AWS-native |
|
|
491
|
+
| ⎈ Kubernetes | `kubernetes/` | k3s / k8s at scale |
|
|
492
|
+
| 🌊 DigitalOcean | `digitalocean/` | Droplets + DO Kubernetes |
|
|
493
|
+
| 🖥️ VPS / bare metal | `vps/` | Any provider, total control |
|
|
494
|
+
| 🏢 On-premises | `on-prem/` | Air-gapped or private DC |
|
|
495
|
+
|
|
496
|
+
**3. Point the SDK at it.** Two patterns — pick whichever fits.
|
|
497
|
+
|
|
498
|
+
```sh
|
|
499
|
+
# Local development on your machine
|
|
500
|
+
export NORBIX_API_URL=http://localhost:5000
|
|
501
|
+
export NORBIX_HUB_URL=http://localhost:5001
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
```sh
|
|
505
|
+
# Self-hosted on your company's domain
|
|
506
|
+
export NORBIX_API_URL=https://api.norbix.isidos.lt
|
|
507
|
+
export NORBIX_HUB_URL=https://hub.norbix.isidos.lt
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
→ [Install repo](https://github.com/norbix-code/install) · [Self-host docs](https://docs.norbix.ai/self-hosted)
|
|
511
|
+
|
|
512
|
+
### C. Enterprise — your cloud, your compliance
|
|
513
|
+
|
|
514
|
+
Run Norbix in your VPC or dedicated infrastructure. SOC2-ready, GDPR/HIPAA-compatible, full audit trails, custom SLA, dedicated support, deployment review with the Norbix team. Same APIs as Cloud and Self-Hosted — just behind your perimeter. Override the SDK's base URL to your private endpoint.
|
|
515
|
+
|
|
516
|
+
→ [Contact sales](https://norbix.ai/enterprise) · [Enterprise docs](https://docs.norbix.ai/enterprise)
|
|
517
|
+
|
|
518
|
+
<!-- END: INSTALL_NORBIX -->
|
|
519
|
+
|
|
520
|
+
<!-- BEGIN: ERROR_HANDLING -->
|
|
521
|
+
|
|
522
|
+
## Error handling
|
|
523
|
+
|
|
524
|
+
```ts
|
|
525
|
+
import { NorbixError } from '@norbix.ai/ts';
|
|
526
|
+
|
|
527
|
+
try {
|
|
528
|
+
await norbix.api.database.find({ collectionName: 'orders' });
|
|
529
|
+
} catch (err) {
|
|
530
|
+
if (err instanceof NorbixError) {
|
|
531
|
+
console.log(err.status, err.code, err.fieldErrors);
|
|
532
|
+
}
|
|
533
|
+
throw err;
|
|
534
|
+
}
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
| Code | Meaning |
|
|
538
|
+
| ------------------------------- | ----------------------------------------------------------------- |
|
|
539
|
+
| `NORBIX_NOT_AUTHENTICATED` | No `apiKey`, `bearerToken`, or env var, and `login()` not called. |
|
|
540
|
+
| `NORBIX_ACCOUNT_SCOPE_REQUIRED` | Account-scoped Hub endpoint called without `accountId`. |
|
|
541
|
+
| `NORBIX_MISSING_PATH_PARAM` | A `{token}` in the route was not provided on the request. |
|
|
542
|
+
| `NORBIX_NETWORK_ERROR` | Fetch failed (network, CORS, timeout). |
|
|
543
|
+
|
|
544
|
+
<!-- END: ERROR_HANDLING -->
|
|
545
|
+
|
|
546
|
+
<!-- BEGIN: COMMUNITY_AND_SUPPORT -->
|
|
547
|
+
|
|
548
|
+
## Community & support
|
|
549
|
+
|
|
550
|
+
- [**Documentation**](https://docs.norbix.ai). Best for: building, integrating, and reference.
|
|
551
|
+
- [**GitHub Discussions**](https://github.com/norbix-code/sdk-ts/discussions). Best for: technical Q&A, feature requests, sharing what you built.
|
|
552
|
+
- [**GitHub Issues**](https://github.com/norbix-code/sdk-ts/issues). Best for: bugs and reproducible errors in this SDK.
|
|
553
|
+
- [**Discord**](https://norbix.ai/discord). Best for: real-time chat with the team and the community.
|
|
554
|
+
- [**Email support**](mailto:support@norbix.ai). Best for: account, billing, and infrastructure issues that aren't public.
|
|
555
|
+
<!-- END: COMMUNITY_AND_SUPPORT -->
|
|
556
|
+
|
|
557
|
+
<!-- BEGIN: RESOURCES -->
|
|
558
|
+
|
|
559
|
+
## Resources
|
|
560
|
+
|
|
561
|
+
[Website](https://norbix.ai) · [Cloud Dashboard](https://cloud.norbix.ai) · [Docs](https://docs.norbix.ai) · [API](https://api.norbix.ai) · [Hub](https://hub.norbix.ai) · [MCP](https://docs.norbix.ai/mcp) · [Blog](https://norbix.ai/blog) · [Discord](https://norbix.ai/discord) · [X](https://x.com/norbix) · [YouTube](https://www.youtube.com/@norbix) · [LinkedIn](https://www.linkedin.com/company/norbix)
|
|
562
|
+
|
|
563
|
+
<!-- END: RESOURCES -->
|
|
564
|
+
|
|
565
|
+
<!-- BEGIN: DEVELOPMENT -->
|
|
566
|
+
|
|
567
|
+
## Development
|
|
568
|
+
|
|
569
|
+
```sh
|
|
570
|
+
npm install
|
|
571
|
+
npm run lint
|
|
572
|
+
npm run typecheck
|
|
573
|
+
npm test
|
|
574
|
+
npm run build
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
Conventional commits are required. Use `npm run commit` for a guided flow. Pushes to `main` are released to npm by [semantic-release](https://github.com/semantic-release/semantic-release) with provenance enabled. `next` and `beta` branches publish prereleases.
|
|
578
|
+
|
|
579
|
+
The SDK module classes (`src/api/*`, `src/hub/*`), their tests, and per-module docs are generated from the gateway DTOs by an internal maintenance workflow. Generated artifacts are committed to git and consumed by CI as-is — CI never regenerates. The generation scripts themselves are dev-only and gitignored (see `.gitignore`).
|
|
580
|
+
|
|
581
|
+
<!-- END: DEVELOPMENT -->
|
|
582
|
+
|
|
583
|
+
<!-- BEGIN: SECURITY -->
|
|
584
|
+
|
|
585
|
+
## Security
|
|
586
|
+
|
|
587
|
+
Found something? Don't open a public issue. See [`SECURITY.md`](./SECURITY.md) and email `security@norbix.ai`. We respond within one business day.
|
|
588
|
+
|
|
589
|
+
<!-- END: SECURITY -->
|
|
590
|
+
|
|
591
|
+
<!-- BEGIN: CONTRIBUTING -->
|
|
592
|
+
|
|
593
|
+
## Contributing
|
|
594
|
+
|
|
595
|
+
Issues, PRs, and design partners welcome. Start with [`CONTRIBUTING.md`](./CONTRIBUTING.md) for branching, local dev, and how to add a module. Bigger ideas land in [Discussions](https://github.com/norbix-code/sdk-ts/discussions) before they land in code.
|
|
596
|
+
|
|
597
|
+
<!-- END: CONTRIBUTING -->
|
|
598
|
+
|
|
599
|
+
<!-- BEGIN: LICENSE -->
|
|
600
|
+
|
|
601
|
+
## License
|
|
602
|
+
|
|
603
|
+
[MIT](./LICENSE) © Norbix
|
|
604
|
+
|
|
605
|
+
<!-- END: LICENSE -->
|
|
606
|
+
|
|
607
|
+
## <!-- BEGIN: FOOTER -->
|
|
608
|
+
|
|
609
|
+
<p align="center">
|
|
610
|
+
<a href="https://norbix.ai"><img src="https://norbix.ai/brand/wordmark.svg" alt="Norbix" height="32" /></a>
|
|
611
|
+
</p>
|
|
612
|
+
<p align="center"><em>The MCP-native Backend-as-a-Service for the agentic era.</em></p>
|
|
613
|
+
<p align="center">
|
|
614
|
+
<a href="https://norbix.ai">norbix.ai</a> ·
|
|
615
|
+
<a href="https://cloud.norbix.ai">cloud.norbix.ai</a> ·
|
|
616
|
+
<a href="https://docs.norbix.ai">docs.norbix.ai</a> ·
|
|
617
|
+
<a href="https://docs.norbix.ai/mcp">MCP</a> ·
|
|
618
|
+
<a href="https://norbix.ai/discord">Discord</a> ·
|
|
619
|
+
<a href="https://x.com/norbix">X</a> ·
|
|
620
|
+
<a href="https://www.youtube.com/@norbix">YouTube</a>
|
|
621
|
+
</p>
|
|
622
|
+
|
|
623
|
+
<p align="center">
|
|
624
|
+
<a href="https://github.com/norbix-code/sdk-ts/graphs/contributors">
|
|
625
|
+
<img src="https://contrib.rocks/image?repo=norbix-code/sdk-ts" alt="Contributors" width="600" />
|
|
626
|
+
</a>
|
|
627
|
+
</p>
|
|
628
|
+
<!-- END: FOOTER -->
|