@hybridb/sdk 0.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.
- package/README.md +220 -0
- package/dist/client-DzNX2jDR.d.cts +157 -0
- package/dist/client-DzNX2jDR.d.ts +157 -0
- package/dist/index.cjs +346 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +35 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +342 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +28 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +17 -0
- package/dist/react.d.ts +17 -0
- package/dist/react.js +25 -0
- package/dist/react.js.map +1 -0
- package/package.json +77 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/* @hybridb/sdk — Stellrai governed execution runtime */
|
|
2
|
+
|
|
3
|
+
// src/client.ts
|
|
4
|
+
var jwksCache = null;
|
|
5
|
+
var jwksCachedAt = 0;
|
|
6
|
+
var JWKS_CACHE_MS = 36e5;
|
|
7
|
+
var HybriDBClient = class {
|
|
8
|
+
baseUrl;
|
|
9
|
+
apiKey;
|
|
10
|
+
timeout;
|
|
11
|
+
retries;
|
|
12
|
+
retryDelay;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
if (!config.baseUrl) throw new HybriDBError("CONFIG_ERROR", "hybriDB SDK: baseUrl is required");
|
|
15
|
+
if (!config.apiKey) throw new HybriDBError("CONFIG_ERROR", "hybriDB SDK: apiKey is required");
|
|
16
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
17
|
+
this.apiKey = config.apiKey;
|
|
18
|
+
this.timeout = config.timeout ?? 1e4;
|
|
19
|
+
this.retries = config.retries ?? 3;
|
|
20
|
+
this.retryDelay = config.retryDelay ?? 500;
|
|
21
|
+
}
|
|
22
|
+
// ─── auth — token issuance ──────────────────────────────────────────────────
|
|
23
|
+
/** Exchange email + password for an access + refresh token pair. */
|
|
24
|
+
async authenticate(input) {
|
|
25
|
+
const res = await this.postPublic("/api/v1/auth/token", input);
|
|
26
|
+
return this.unwrap(res);
|
|
27
|
+
}
|
|
28
|
+
/** Refresh an access token using a refresh token. */
|
|
29
|
+
async refreshToken(refreshToken) {
|
|
30
|
+
const res = await this.postPublic("/api/v1/auth/refresh", { refreshToken });
|
|
31
|
+
return this.unwrap(res);
|
|
32
|
+
}
|
|
33
|
+
/** Revoke the current session (requires authenticated API key/JWT). */
|
|
34
|
+
async revokeSession() {
|
|
35
|
+
await this.delete("/api/v1/auth/token");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Verify a JWT token locally using JWKS from the hybriDB server.
|
|
39
|
+
* Returns the decoded actor context without making a decision API call.
|
|
40
|
+
* JWKS is cached for 1 hour (spec: Cache-Control: max-age=3600).
|
|
41
|
+
*/
|
|
42
|
+
async verifyToken(token) {
|
|
43
|
+
const jwks = await this.getJwks();
|
|
44
|
+
const { createRemoteJWKSet, jwtVerify } = await import('jose').catch(() => {
|
|
45
|
+
throw new HybriDBError("DEPENDENCY_MISSING", "jose is required for verifyToken() \u2014 install it: npm i jose");
|
|
46
|
+
});
|
|
47
|
+
const { createLocalJWKSet } = await import('jose');
|
|
48
|
+
const keySet = createLocalJWKSet({ keys: jwks.keys });
|
|
49
|
+
const { payload } = await jwtVerify(token, keySet, { issuer: "hybridb" });
|
|
50
|
+
const p = payload;
|
|
51
|
+
return {
|
|
52
|
+
actorId: p["actor_id"],
|
|
53
|
+
actorType: p["actor_type"],
|
|
54
|
+
orgId: p["org_id"],
|
|
55
|
+
scopes: p["scopes"] ?? [],
|
|
56
|
+
policyVersion: p["policy_version"]
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Fetch JWKS from the hybriDB server (cached for 1 hour). */
|
|
60
|
+
async getJwks() {
|
|
61
|
+
if (jwksCache && Date.now() - jwksCachedAt < JWKS_CACHE_MS) {
|
|
62
|
+
return jwksCache;
|
|
63
|
+
}
|
|
64
|
+
const res = await this.getPublic("/.well-known/jwks.json");
|
|
65
|
+
const data = this.unwrap(res);
|
|
66
|
+
jwksCache = data;
|
|
67
|
+
jwksCachedAt = Date.now();
|
|
68
|
+
return data;
|
|
69
|
+
}
|
|
70
|
+
// ─── db.actors — actor management ──────────────────────────────────────────
|
|
71
|
+
/** Namespace for actor management operations. */
|
|
72
|
+
actors = {
|
|
73
|
+
/** Issue an API key for an actor. Requires actor:admin scope. */
|
|
74
|
+
createApiKey: async (actorId, input) => {
|
|
75
|
+
const res = await this.post(
|
|
76
|
+
`/api/v1/actors/${actorId}/api-keys`,
|
|
77
|
+
input
|
|
78
|
+
);
|
|
79
|
+
return this.unwrap(res);
|
|
80
|
+
},
|
|
81
|
+
/** Revoke an API key. Requires actor:admin scope. */
|
|
82
|
+
revokeApiKey: async (actorId, keyId) => {
|
|
83
|
+
await this.delete(`/api/v1/actors/${actorId}/api-keys/${keyId}`);
|
|
84
|
+
},
|
|
85
|
+
/** Create an identity mapping (external provider → actor). Requires actor:write scope. */
|
|
86
|
+
createMapping: async (actorId, input) => {
|
|
87
|
+
const res = await this.post(
|
|
88
|
+
`/api/v1/actors/${actorId}/identity-mappings`,
|
|
89
|
+
input
|
|
90
|
+
);
|
|
91
|
+
return this.unwrap(res);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
// ─── orgs — organisation membership ────────────────────────────────────────
|
|
95
|
+
/** Namespace for organisation membership operations. */
|
|
96
|
+
orgs = {
|
|
97
|
+
/** Add a member to an organisation. Requires org:admin scope. */
|
|
98
|
+
addMember: async (orgId, input) => {
|
|
99
|
+
const res = await this.post(`/api/v1/orgs/${orgId}/memberships`, input);
|
|
100
|
+
return this.unwrap(res);
|
|
101
|
+
},
|
|
102
|
+
/** Update a member's role. Requires org:admin scope. */
|
|
103
|
+
updateMemberRole: async (orgId, actorId, role) => {
|
|
104
|
+
const res = await this.patch(
|
|
105
|
+
`/api/v1/orgs/${orgId}/memberships/${actorId}`,
|
|
106
|
+
{ role }
|
|
107
|
+
);
|
|
108
|
+
return this.unwrap(res);
|
|
109
|
+
},
|
|
110
|
+
/** Revoke an actor's membership. Requires org:admin scope. */
|
|
111
|
+
revokeMember: async (orgId, actorId) => {
|
|
112
|
+
await this.delete(`/api/v1/orgs/${orgId}/memberships/${actorId}`);
|
|
113
|
+
},
|
|
114
|
+
/** List organisation members. Requires org:read scope. */
|
|
115
|
+
listMembers: async (orgId) => {
|
|
116
|
+
const res = await this.get(`/api/v1/orgs/${orgId}/memberships`);
|
|
117
|
+
return this.unwrap(res);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
// ─── Reversibility (v2.4) ──────────────────────────────────────────────────
|
|
121
|
+
/** Namespace for Reversible Autonomy operations (v2.4). */
|
|
122
|
+
reversibility = {
|
|
123
|
+
/**
|
|
124
|
+
* Initiate a rollback for an execution.
|
|
125
|
+
* Types: 'full' (all steps), 'selective' (targetSteps list), 'to_checkpoint'.
|
|
126
|
+
* Requires pipeline:rollback scope.
|
|
127
|
+
*/
|
|
128
|
+
rollback: async (executionId, input) => {
|
|
129
|
+
const res = await this.post(`/api/v1/executions/${executionId}/rollback`, input);
|
|
130
|
+
return this.unwrap(res);
|
|
131
|
+
},
|
|
132
|
+
/**
|
|
133
|
+
* Initiate a replay from a checkpoint.
|
|
134
|
+
* Creates a new child execution starting from the checkpoint's step.
|
|
135
|
+
* Requires pipeline:replay scope.
|
|
136
|
+
*/
|
|
137
|
+
replay: async (executionId, input) => {
|
|
138
|
+
const res = await this.post(`/api/v1/executions/${executionId}/replay`, input);
|
|
139
|
+
return this.unwrap(res);
|
|
140
|
+
},
|
|
141
|
+
/**
|
|
142
|
+
* List all checkpoints for an execution (ordered by step_index asc).
|
|
143
|
+
* Requires pipeline:read scope.
|
|
144
|
+
*/
|
|
145
|
+
getCheckpoints: async (executionId) => {
|
|
146
|
+
const res = await this.get(`/api/v1/executions/${executionId}/checkpoints`);
|
|
147
|
+
return this.unwrap(res);
|
|
148
|
+
},
|
|
149
|
+
/**
|
|
150
|
+
* Get a specific checkpoint (with checksum verification).
|
|
151
|
+
* Throws REPLAY_CONTEXT_INVALID if checksum mismatches.
|
|
152
|
+
* Requires pipeline:read scope.
|
|
153
|
+
*/
|
|
154
|
+
getCheckpoint: async (executionId, checkpointId) => {
|
|
155
|
+
const res = await this.get(`/api/v1/executions/${executionId}/checkpoints/${checkpointId}`);
|
|
156
|
+
return this.unwrap(res);
|
|
157
|
+
},
|
|
158
|
+
/**
|
|
159
|
+
* List all rollback log entries for an execution.
|
|
160
|
+
* Requires pipeline:read scope.
|
|
161
|
+
*/
|
|
162
|
+
getRollbackLog: async (executionId) => {
|
|
163
|
+
const res = await this.get(`/api/v1/executions/${executionId}/rollback-log`);
|
|
164
|
+
return this.unwrap(res);
|
|
165
|
+
},
|
|
166
|
+
/**
|
|
167
|
+
* Get circuit breaker status for a pipeline.
|
|
168
|
+
* Requires pipeline:read scope.
|
|
169
|
+
*/
|
|
170
|
+
getCircuitBreaker: async (pipelineId) => {
|
|
171
|
+
const res = await this.get(`/api/v1/pipelines/${pipelineId}/circuit-breaker`);
|
|
172
|
+
return this.unwrap(res);
|
|
173
|
+
},
|
|
174
|
+
/**
|
|
175
|
+
* Open or close the circuit breaker for a pipeline.
|
|
176
|
+
* Opening halts all future executions immediately.
|
|
177
|
+
* Requires pipeline:circuit_breaker scope.
|
|
178
|
+
*/
|
|
179
|
+
setCircuitBreaker: async (pipelineId, input) => {
|
|
180
|
+
const res = await this.post(
|
|
181
|
+
`/api/v1/pipelines/${pipelineId}/circuit-breaker`,
|
|
182
|
+
input
|
|
183
|
+
);
|
|
184
|
+
return this.unwrap(res);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
// ─── Decisions ─────────────────────────────────────────────────────────────
|
|
188
|
+
async requestDecision(request) {
|
|
189
|
+
const res = await this.post("/api/v1/decisions", request);
|
|
190
|
+
return this.unwrap(res);
|
|
191
|
+
}
|
|
192
|
+
async getDecision(decisionId) {
|
|
193
|
+
const res = await this.get(`/api/v1/decisions/${decisionId}`);
|
|
194
|
+
return this.unwrap(res);
|
|
195
|
+
}
|
|
196
|
+
// ─── Pipelines ─────────────────────────────────────────────────────────────
|
|
197
|
+
async triggerPipeline(input) {
|
|
198
|
+
const res = await this.post("/api/v1/pipelines/trigger", input);
|
|
199
|
+
return this.unwrap(res);
|
|
200
|
+
}
|
|
201
|
+
async getPipelineExecution(executionId) {
|
|
202
|
+
const res = await this.get(`/api/v1/pipelines/executions/${executionId}`);
|
|
203
|
+
return this.unwrap(res);
|
|
204
|
+
}
|
|
205
|
+
// ─── Events ────────────────────────────────────────────────────────────────
|
|
206
|
+
/** Publish a business event. Note: use actorId (v1.2), not identityId. */
|
|
207
|
+
async publishEvent(input) {
|
|
208
|
+
const res = await this.post("/api/v1/events", input);
|
|
209
|
+
return this.unwrap(res);
|
|
210
|
+
}
|
|
211
|
+
// ─── Audit ─────────────────────────────────────────────────────────────────
|
|
212
|
+
async queryAuditLog(params) {
|
|
213
|
+
const query = new URLSearchParams();
|
|
214
|
+
for (const [k, v] of Object.entries(params)) {
|
|
215
|
+
if (v !== void 0) query.set(k, String(v));
|
|
216
|
+
}
|
|
217
|
+
const res = await this.get(`/api/v1/audit?${query.toString()}`);
|
|
218
|
+
return this.unwrap(res);
|
|
219
|
+
}
|
|
220
|
+
// ─── Health ────────────────────────────────────────────────────────────────
|
|
221
|
+
async health() {
|
|
222
|
+
const res = await this.getPublic("/health");
|
|
223
|
+
return this.unwrap(res);
|
|
224
|
+
}
|
|
225
|
+
// ─── HTTP primitives ───────────────────────────────────────────────────────
|
|
226
|
+
async get(path) {
|
|
227
|
+
return this.request("GET", path, void 0, true);
|
|
228
|
+
}
|
|
229
|
+
async getPublic(path) {
|
|
230
|
+
return this.request("GET", path, void 0, false);
|
|
231
|
+
}
|
|
232
|
+
async post(path, body) {
|
|
233
|
+
return this.request("POST", path, body, true);
|
|
234
|
+
}
|
|
235
|
+
async postPublic(path, body) {
|
|
236
|
+
return this.request("POST", path, body, false);
|
|
237
|
+
}
|
|
238
|
+
async patch(path, body) {
|
|
239
|
+
return this.request("PATCH", path, body, true);
|
|
240
|
+
}
|
|
241
|
+
async delete(path) {
|
|
242
|
+
await this.request("DELETE", path, void 0, true);
|
|
243
|
+
}
|
|
244
|
+
async request(method, path, body, authenticated, attempt = 1) {
|
|
245
|
+
const controller = new AbortController();
|
|
246
|
+
const timerId = setTimeout(() => controller.abort(), this.timeout);
|
|
247
|
+
try {
|
|
248
|
+
const headers = {
|
|
249
|
+
"Content-Type": "application/json",
|
|
250
|
+
"X-SDK-Version": "1.3.0"
|
|
251
|
+
};
|
|
252
|
+
if (authenticated) {
|
|
253
|
+
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
254
|
+
}
|
|
255
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
256
|
+
method,
|
|
257
|
+
headers,
|
|
258
|
+
...body !== void 0 ? { body: JSON.stringify(body) } : {},
|
|
259
|
+
signal: controller.signal
|
|
260
|
+
});
|
|
261
|
+
if (response.status === 204) {
|
|
262
|
+
return { success: true, data: void 0 };
|
|
263
|
+
}
|
|
264
|
+
const json = await response.json();
|
|
265
|
+
if (!response.ok && attempt < this.retries && this.isRetryable(response.status)) {
|
|
266
|
+
await this.sleep(this.retryDelay * attempt);
|
|
267
|
+
return this.request(method, path, body, authenticated, attempt + 1);
|
|
268
|
+
}
|
|
269
|
+
return json;
|
|
270
|
+
} finally {
|
|
271
|
+
clearTimeout(timerId);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
unwrap(response) {
|
|
275
|
+
if (!response.success || response.data === void 0) {
|
|
276
|
+
throw new HybriDBError(
|
|
277
|
+
response.error?.code ?? "UNKNOWN_ERROR",
|
|
278
|
+
response.error?.message ?? "hybriDB request failed",
|
|
279
|
+
response.error?.details
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
return response.data;
|
|
283
|
+
}
|
|
284
|
+
isRetryable(status) {
|
|
285
|
+
return status === 429 || status >= 500;
|
|
286
|
+
}
|
|
287
|
+
sleep(ms) {
|
|
288
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
var HybriDBError = class extends Error {
|
|
292
|
+
constructor(code, message, details) {
|
|
293
|
+
super(message);
|
|
294
|
+
this.code = code;
|
|
295
|
+
this.details = details;
|
|
296
|
+
this.name = "HybriDBError";
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
// src/index.ts
|
|
301
|
+
var HYBRIDB_EVENT_TYPES = {
|
|
302
|
+
// Decisions
|
|
303
|
+
DECISION_REQUESTED: "decision.requested",
|
|
304
|
+
DECISION_ALLOWED: "decision.allowed",
|
|
305
|
+
DECISION_BLOCKED: "decision.blocked",
|
|
306
|
+
DECISION_ESCALATED: "decision.escalated",
|
|
307
|
+
// Pipelines
|
|
308
|
+
PIPELINE_STARTED: "pipeline.started",
|
|
309
|
+
PIPELINE_COMPLETED: "pipeline.completed",
|
|
310
|
+
PIPELINE_FAILED: "pipeline.failed",
|
|
311
|
+
PIPELINE_COMPENSATED: "pipeline.compensated",
|
|
312
|
+
// Payments
|
|
313
|
+
PAYMENT_INITIATED: "payment.initiated",
|
|
314
|
+
PAYMENT_COMPLETED: "payment.completed",
|
|
315
|
+
PAYMENT_FAILED: "payment.failed",
|
|
316
|
+
PAYMENT_REVERSED: "payment.reversed",
|
|
317
|
+
// Identity (v1.2 — actor-centric)
|
|
318
|
+
ACTOR_CREATED: "actor.created",
|
|
319
|
+
ACTOR_SUSPENDED: "actor.suspended",
|
|
320
|
+
ACTOR_REVOKED: "actor.revoked",
|
|
321
|
+
IDENTITY_RESOLVED: "identity.resolved",
|
|
322
|
+
IDENTITY_RESOLUTION_FAILED: "identity.resolution_failed",
|
|
323
|
+
// Policy
|
|
324
|
+
POLICY_ACTIVATED: "policy.activated",
|
|
325
|
+
POLICY_DEACTIVATED: "policy.deactivated",
|
|
326
|
+
POLICY_VERSION_BUMPED: "policy.version_bumped",
|
|
327
|
+
// KYC
|
|
328
|
+
KYC_SUBMITTED: "kyc.submitted",
|
|
329
|
+
KYC_APPROVED: "kyc.approved",
|
|
330
|
+
KYC_REJECTED: "kyc.rejected",
|
|
331
|
+
// AI
|
|
332
|
+
AI_INFERENCE_COMPLETED: "ai.inference_completed",
|
|
333
|
+
AI_INFERENCE_FAILED: "ai.inference_failed",
|
|
334
|
+
// Fraud
|
|
335
|
+
FRAUD_SIGNAL_DETECTED: "fraud.signal_detected",
|
|
336
|
+
// sync-back
|
|
337
|
+
SYNC_BACK_EXHAUSTED: "sync_back.exhausted"
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
export { HYBRIDB_EVENT_TYPES, HybriDBClient, HybriDBError };
|
|
341
|
+
//# sourceMappingURL=index.js.map
|
|
342
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// hybriDB SDK Client — v1.3\n//\n// v1.3 changes (v2.4 Reversible Autonomy):\n// - reversibility namespace: rollback(), replay(), getCheckpoints(), getCheckpoint(),\n// getRollbackLog(), getCircuitBreaker(), setCircuitBreaker()\n// - SDK-Version header bumped to 1.3.0\n//\n// v1.2 changes:\n// - db.actors.* namespace (replaces db.identities.*)\n// - createMapping() — create identity mapping for an actor\n// - assignRole() — assign a role to an actor\n// - orgs.addMember(), orgs.revokeMember(), orgs.listMembers(), orgs.updateMemberRole()\n// - verifyToken() — JWKS-based local token verification\n// - 7 new HybriDBErrorCode values (see @stellrai/types)\n// - actorId field in PublishEventInput (replaces identityId)\n// - SDK-Version header bumped to 1.2.0\n\nimport type {\n UUID,\n ApiResponse,\n DecisionInput,\n DecisionRequest,\n DecisionResponse,\n TriggerPipelineInput,\n PipelineExecution,\n PublishEventInput,\n HybriDBEvent,\n AuditEntry,\n PaginatedResponse,\n Actor,\n ActorContext,\n TokenPair,\n OrgMembership,\n IdentityMapping,\n // v2.4 Reversible Autonomy\n InitiateRollbackInput,\n RollbackResult,\n InitiateReplayInput,\n ReplayResult,\n Checkpoint,\n CheckpointSummary,\n RollbackLog,\n CircuitBreakerStatus,\n SetCircuitBreakerInput,\n} from '@stellrai/types';\n\n// ─── Client config ────────────────────────────────────────────────────────────\n\nexport interface HybriDBClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout?: number; // ms, default 10000\n retries?: number; // default 3\n retryDelay?: number; // ms, default 500\n}\n\n// ─── Auth inputs ─────────────────────────────────────────────────────────────\n\nexport interface AuthenticateInput {\n email: string;\n password: string;\n orgId?: string;\n}\n\nexport interface CreateMappingInput {\n providerId: string;\n externalId: string;\n userId: string;\n actorId: string;\n}\n\nexport interface OrgMemberInput {\n actorId: string;\n role: string;\n}\n\nexport interface ApiKeyInput {\n name?: string;\n scopes: string[];\n expiresAt?: string;\n}\n\nexport interface AuditQueryParams {\n actorId?: string;\n action?: string;\n outcome?: string;\n decisionId?: string;\n sessionId?: string;\n from?: string;\n to?: string;\n page?: number;\n limit?: number;\n}\n\n// ─── JWKS cache (module-level — shared across instances) ─────────────────────\n\nlet jwksCache: { keys: Record<string, unknown>[] } | null = null;\nlet jwksCachedAt = 0;\nconst JWKS_CACHE_MS = 3_600_000; // 1 hour\n\n// ─── HybriDBClient ────────────────────────────────────────────────────────────\n\nexport class HybriDBClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly retries: number;\n private readonly retryDelay: number;\n\n constructor(config: HybriDBClientConfig) {\n if (!config.baseUrl) throw new HybriDBError('CONFIG_ERROR', 'hybriDB SDK: baseUrl is required');\n if (!config.apiKey) throw new HybriDBError('CONFIG_ERROR', 'hybriDB SDK: apiKey is required');\n\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.apiKey = config.apiKey;\n this.timeout = config.timeout ?? 10_000;\n this.retries = config.retries ?? 3;\n this.retryDelay = config.retryDelay ?? 500;\n }\n\n // ─── auth — token issuance ──────────────────────────────────────────────────\n\n /** Exchange email + password for an access + refresh token pair. */\n async authenticate(input: AuthenticateInput): Promise<TokenPair> {\n const res = await this.postPublic<TokenPair>('/api/v1/auth/token', input);\n return this.unwrap(res);\n }\n\n /** Refresh an access token using a refresh token. */\n async refreshToken(refreshToken: string): Promise<TokenPair> {\n const res = await this.postPublic<TokenPair>('/api/v1/auth/refresh', { refreshToken });\n return this.unwrap(res);\n }\n\n /** Revoke the current session (requires authenticated API key/JWT). */\n async revokeSession(): Promise<void> {\n await this.delete('/api/v1/auth/token');\n }\n\n /**\n * Verify a JWT token locally using JWKS from the hybriDB server.\n * Returns the decoded actor context without making a decision API call.\n * JWKS is cached for 1 hour (spec: Cache-Control: max-age=3600).\n */\n async verifyToken(token: string): Promise<ActorContext> {\n const jwks = await this.getJwks();\n\n // Dynamic import — jose is optional peer dependency for token verification\n const { createRemoteJWKSet, jwtVerify } = await import('jose').catch(() => {\n throw new HybriDBError('DEPENDENCY_MISSING', 'jose is required for verifyToken() — install it: npm i jose');\n });\n\n // Build an in-memory JWKS from our cached keys\n const { createLocalJWKSet } = await import('jose');\n const keySet = createLocalJWKSet({ keys: jwks.keys as unknown as Parameters<typeof createLocalJWKSet>[0]['keys'] });\n\n const { payload } = await jwtVerify(token, keySet, { issuer: 'hybridb' });\n\n const p = payload as Record<string, unknown>;\n return {\n actorId: p['actor_id'] as string,\n actorType: p['actor_type'] as ActorContext['actorType'],\n orgId: p['org_id'] as string | null,\n scopes: (p['scopes'] as string[]) ?? [],\n policyVersion: p['policy_version'] as number,\n };\n }\n\n /** Fetch JWKS from the hybriDB server (cached for 1 hour). */\n async getJwks(): Promise<{ keys: Record<string, unknown>[] }> {\n if (jwksCache && Date.now() - jwksCachedAt < JWKS_CACHE_MS) {\n return jwksCache;\n }\n\n const res = await this.getPublic<{ keys: Record<string, unknown>[] }>('/.well-known/jwks.json');\n const data = this.unwrap(res);\n jwksCache = data;\n jwksCachedAt = Date.now();\n return data;\n }\n\n // ─── db.actors — actor management ──────────────────────────────────────────\n\n /** Namespace for actor management operations. */\n readonly actors = {\n /** Issue an API key for an actor. Requires actor:admin scope. */\n createApiKey: async (actorId: UUID, input: ApiKeyInput): Promise<{ id: string; key: string }> => {\n const res = await this.post<{ id: string; key: string }>(\n `/api/v1/actors/${actorId}/api-keys`, input,\n );\n return this.unwrap(res);\n },\n\n /** Revoke an API key. Requires actor:admin scope. */\n revokeApiKey: async (actorId: UUID, keyId: UUID): Promise<void> => {\n await this.delete(`/api/v1/actors/${actorId}/api-keys/${keyId}`);\n },\n\n /** Create an identity mapping (external provider → actor). Requires actor:write scope. */\n createMapping: async (actorId: UUID, input: CreateMappingInput): Promise<IdentityMapping> => {\n const res = await this.post<IdentityMapping>(\n `/api/v1/actors/${actorId}/identity-mappings`, input,\n );\n return this.unwrap(res);\n },\n } as const;\n\n // ─── orgs — organisation membership ────────────────────────────────────────\n\n /** Namespace for organisation membership operations. */\n readonly orgs = {\n /** Add a member to an organisation. Requires org:admin scope. */\n addMember: async (orgId: UUID, input: OrgMemberInput): Promise<OrgMembership> => {\n const res = await this.post<OrgMembership>(`/api/v1/orgs/${orgId}/memberships`, input);\n return this.unwrap(res);\n },\n\n /** Update a member's role. Requires org:admin scope. */\n updateMemberRole: async (orgId: UUID, actorId: UUID, role: string): Promise<OrgMembership> => {\n const res = await this.patch<OrgMembership>(\n `/api/v1/orgs/${orgId}/memberships/${actorId}`, { role },\n );\n return this.unwrap(res);\n },\n\n /** Revoke an actor's membership. Requires org:admin scope. */\n revokeMember: async (orgId: UUID, actorId: UUID): Promise<void> => {\n await this.delete(`/api/v1/orgs/${orgId}/memberships/${actorId}`);\n },\n\n /** List organisation members. Requires org:read scope. */\n listMembers: async (orgId: UUID): Promise<OrgMembership[]> => {\n const res = await this.get<OrgMembership[]>(`/api/v1/orgs/${orgId}/memberships`);\n return this.unwrap(res);\n },\n } as const;\n\n // ─── Reversibility (v2.4) ──────────────────────────────────────────────────\n\n /** Namespace for Reversible Autonomy operations (v2.4). */\n readonly reversibility = {\n /**\n * Initiate a rollback for an execution.\n * Types: 'full' (all steps), 'selective' (targetSteps list), 'to_checkpoint'.\n * Requires pipeline:rollback scope.\n */\n rollback: async (executionId: UUID, input: Omit<InitiateRollbackInput, 'executionId'>): Promise<RollbackResult> => {\n const res = await this.post<RollbackResult>(`/api/v1/executions/${executionId}/rollback`, input);\n return this.unwrap(res);\n },\n\n /**\n * Initiate a replay from a checkpoint.\n * Creates a new child execution starting from the checkpoint's step.\n * Requires pipeline:replay scope.\n */\n replay: async (executionId: UUID, input: Omit<InitiateReplayInput, 'executionId'>): Promise<ReplayResult> => {\n const res = await this.post<ReplayResult>(`/api/v1/executions/${executionId}/replay`, input);\n return this.unwrap(res);\n },\n\n /**\n * List all checkpoints for an execution (ordered by step_index asc).\n * Requires pipeline:read scope.\n */\n getCheckpoints: async (executionId: UUID): Promise<CheckpointSummary[]> => {\n const res = await this.get<CheckpointSummary[]>(`/api/v1/executions/${executionId}/checkpoints`);\n return this.unwrap(res);\n },\n\n /**\n * Get a specific checkpoint (with checksum verification).\n * Throws REPLAY_CONTEXT_INVALID if checksum mismatches.\n * Requires pipeline:read scope.\n */\n getCheckpoint: async (executionId: UUID, checkpointId: UUID): Promise<Checkpoint> => {\n const res = await this.get<Checkpoint>(`/api/v1/executions/${executionId}/checkpoints/${checkpointId}`);\n return this.unwrap(res);\n },\n\n /**\n * List all rollback log entries for an execution.\n * Requires pipeline:read scope.\n */\n getRollbackLog: async (executionId: UUID): Promise<RollbackLog[]> => {\n const res = await this.get<RollbackLog[]>(`/api/v1/executions/${executionId}/rollback-log`);\n return this.unwrap(res);\n },\n\n /**\n * Get circuit breaker status for a pipeline.\n * Requires pipeline:read scope.\n */\n getCircuitBreaker: async (pipelineId: UUID): Promise<CircuitBreakerStatus> => {\n const res = await this.get<CircuitBreakerStatus>(`/api/v1/pipelines/${pipelineId}/circuit-breaker`);\n return this.unwrap(res);\n },\n\n /**\n * Open or close the circuit breaker for a pipeline.\n * Opening halts all future executions immediately.\n * Requires pipeline:circuit_breaker scope.\n */\n setCircuitBreaker: async (pipelineId: UUID, input: Omit<SetCircuitBreakerInput, 'pipelineId'>): Promise<CircuitBreakerStatus> => {\n const res = await this.post<CircuitBreakerStatus>(\n `/api/v1/pipelines/${pipelineId}/circuit-breaker`,\n input,\n );\n return this.unwrap(res);\n },\n } as const;\n\n // ─── Decisions ─────────────────────────────────────────────────────────────\n\n async requestDecision(request: DecisionInput): Promise<DecisionResponse> {\n const res = await this.post<DecisionResponse>('/api/v1/decisions', request);\n return this.unwrap(res);\n }\n\n async getDecision(decisionId: UUID): Promise<DecisionResponse> {\n const res = await this.get<DecisionResponse>(`/api/v1/decisions/${decisionId}`);\n return this.unwrap(res);\n }\n\n // ─── Pipelines ─────────────────────────────────────────────────────────────\n\n async triggerPipeline(input: TriggerPipelineInput): Promise<PipelineExecution> {\n const res = await this.post<PipelineExecution>('/api/v1/pipelines/trigger', input);\n return this.unwrap(res);\n }\n\n async getPipelineExecution(executionId: UUID): Promise<PipelineExecution> {\n const res = await this.get<PipelineExecution>(`/api/v1/pipelines/executions/${executionId}`);\n return this.unwrap(res);\n }\n\n // ─── Events ────────────────────────────────────────────────────────────────\n\n /** Publish a business event. Note: use actorId (v1.2), not identityId. */\n async publishEvent(input: PublishEventInput): Promise<HybriDBEvent> {\n const res = await this.post<HybriDBEvent>('/api/v1/events', input);\n return this.unwrap(res);\n }\n\n // ─── Audit ─────────────────────────────────────────────────────────────────\n\n async queryAuditLog(params: AuditQueryParams): Promise<PaginatedResponse<AuditEntry>> {\n const query = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) query.set(k, String(v));\n }\n const res = await this.get<PaginatedResponse<AuditEntry>>(`/api/v1/audit?${query.toString()}`);\n return this.unwrap(res);\n }\n\n // ─── Health ────────────────────────────────────────────────────────────────\n\n async health(): Promise<{ status: string; version: string }> {\n const res = await this.getPublic<{ status: string; version: string }>('/health');\n return this.unwrap(res);\n }\n\n // ─── HTTP primitives ───────────────────────────────────────────────────────\n\n private async get<T>(path: string): Promise<ApiResponse<T>> {\n return this.request<T>('GET', path, undefined, true);\n }\n\n private async getPublic<T>(path: string): Promise<ApiResponse<T>> {\n return this.request<T>('GET', path, undefined, false);\n }\n\n private async post<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return this.request<T>('POST', path, body, true);\n }\n\n private async postPublic<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return this.request<T>('POST', path, body, false);\n }\n\n private async patch<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return this.request<T>('PATCH', path, body, true);\n }\n\n private async delete(path: string): Promise<void> {\n await this.request<void>('DELETE', path, undefined, true);\n }\n\n private async request<T>(\n method: string,\n path: string,\n body: unknown,\n authenticated: boolean,\n attempt = 1,\n ): Promise<ApiResponse<T>> {\n const controller = new AbortController();\n const timerId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-SDK-Version': '1.3.0',\n };\n if (authenticated) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal: controller.signal,\n });\n\n // 204 No Content — return success with no data\n if (response.status === 204) {\n return { success: true, data: undefined as T };\n }\n\n const json = await response.json() as ApiResponse<T>;\n\n if (!response.ok && attempt < this.retries && this.isRetryable(response.status)) {\n await this.sleep(this.retryDelay * attempt);\n return this.request<T>(method, path, body, authenticated, attempt + 1);\n }\n\n return json;\n } finally {\n clearTimeout(timerId);\n }\n }\n\n private unwrap<T>(response: ApiResponse<T>): T {\n if (!response.success || response.data === undefined) {\n throw new HybriDBError(\n response.error?.code ?? 'UNKNOWN_ERROR',\n response.error?.message ?? 'hybriDB request failed',\n response.error?.details,\n );\n }\n return response.data;\n }\n\n private isRetryable(status: number): boolean {\n return status === 429 || status >= 500;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n\n// ─── HybriDBError ─────────────────────────────────────────────────────────────\n\nexport class HybriDBError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly details?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'HybriDBError';\n }\n}\n","// hybriDB SDK — v1.2\nexport { HybriDBClient, HybriDBError } from './client.js';\nexport type {\n HybriDBClientConfig,\n AuthenticateInput,\n CreateMappingInput,\n OrgMemberInput,\n ApiKeyInput,\n AuditQueryParams,\n} from './client.js';\n\n// React context — exported from '@hybridb/sdk/react' (separate entry point, browser only)\n\n// Re-export commonly used types for SDK consumers\nexport type {\n // Actor-centric (v1.2)\n Actor,\n ActorContext,\n ActorType,\n ActorStatus,\n User,\n OrgMembership,\n IdentityMapping,\n Session,\n TokenPair,\n // Decisions\n DecisionRequest,\n DecisionResponse,\n DecisionResult,\n // Pipelines\n TriggerPipelineInput,\n PipelineExecution,\n // Events — actorId (v1.2), not identityId\n PublishEventInput,\n HybriDBEvent,\n // Audit\n AuditEntry,\n AuditOutcome,\n // Policy\n Policy,\n PolicyEvaluationResult,\n // Shared\n ApiResponse,\n ApiError,\n PaginatedResponse,\n UUID,\n ISO8601,\n // Errors\n HybriDBErrorCode,\n} from '@stellrai/types';\n\n// ─── Event type constants (v1.2) ──────────────────────────────────────────────\n\nexport const HYBRIDB_EVENT_TYPES = {\n // Decisions\n DECISION_REQUESTED: 'decision.requested',\n DECISION_ALLOWED: 'decision.allowed',\n DECISION_BLOCKED: 'decision.blocked',\n DECISION_ESCALATED: 'decision.escalated',\n // Pipelines\n PIPELINE_STARTED: 'pipeline.started',\n PIPELINE_COMPLETED: 'pipeline.completed',\n PIPELINE_FAILED: 'pipeline.failed',\n PIPELINE_COMPENSATED: 'pipeline.compensated',\n // Payments\n PAYMENT_INITIATED: 'payment.initiated',\n PAYMENT_COMPLETED: 'payment.completed',\n PAYMENT_FAILED: 'payment.failed',\n PAYMENT_REVERSED: 'payment.reversed',\n // Identity (v1.2 — actor-centric)\n ACTOR_CREATED: 'actor.created',\n ACTOR_SUSPENDED: 'actor.suspended',\n ACTOR_REVOKED: 'actor.revoked',\n IDENTITY_RESOLVED: 'identity.resolved',\n IDENTITY_RESOLUTION_FAILED: 'identity.resolution_failed',\n // Policy\n POLICY_ACTIVATED: 'policy.activated',\n POLICY_DEACTIVATED: 'policy.deactivated',\n POLICY_VERSION_BUMPED: 'policy.version_bumped',\n // KYC\n KYC_SUBMITTED: 'kyc.submitted',\n KYC_APPROVED: 'kyc.approved',\n KYC_REJECTED: 'kyc.rejected',\n // AI\n AI_INFERENCE_COMPLETED: 'ai.inference_completed',\n AI_INFERENCE_FAILED: 'ai.inference_failed',\n // Fraud\n FRAUD_SIGNAL_DETECTED: 'fraud.signal_detected',\n // sync-back\n SYNC_BACK_EXHAUSTED: 'sync_back.exhausted',\n} as const;\n\nexport type HybriDBEventType = typeof HYBRIDB_EVENT_TYPES[keyof typeof HYBRIDB_EVENT_TYPES];\n"]}
|
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
/* @hybridb/sdk — Stellrai governed execution runtime */
|
|
7
|
+
var HybriDBContext = react.createContext(null);
|
|
8
|
+
function HybriDBProvider({
|
|
9
|
+
client,
|
|
10
|
+
identityId,
|
|
11
|
+
children
|
|
12
|
+
}) {
|
|
13
|
+
return /* @__PURE__ */ jsxRuntime.jsx(HybriDBContext.Provider, { value: { client, identityId }, children });
|
|
14
|
+
}
|
|
15
|
+
function useHybriDBClient() {
|
|
16
|
+
const ctx = react.useContext(HybriDBContext);
|
|
17
|
+
if (!ctx) {
|
|
18
|
+
throw new Error(
|
|
19
|
+
"useHybriDBClient must be used inside <HybriDBProvider>. Wrap your app root (layout.tsx) with HybriDBProvider."
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
return ctx;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
exports.HybriDBProvider = HybriDBProvider;
|
|
26
|
+
exports.useHybriDBClient = useHybriDBClient;
|
|
27
|
+
//# sourceMappingURL=react.cjs.map
|
|
28
|
+
//# sourceMappingURL=react.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx"],"names":["createContext","jsx","useContext"],"mappings":";;;;;;AAsBA,IAAM,cAAA,GAAiBA,oBAA0C,IAAI,CAAA;AAQ9D,SAAS,eAAA,CAAgB;AAAA,EAC9B,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA6C;AAC3C,EAAA,uBACEC,cAAA,CAAC,eAAe,QAAA,EAAf,EAAwB,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAW,EAClD,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,gBAAA,GAAwC;AACtD,EAAA,MAAM,GAAA,GAAMC,iBAAW,cAAc,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT","file":"react.cjs","sourcesContent":["'use client';\n\n// @hybridb/sdk — React context\n// Provides HybriDBClient and resolved hybriDB identity to all React components.\n// All @stellrai/licensing hooks depend on this context.\n//\n// Usage (in app layout.tsx):\n// <HybriDBProvider client={hybridb} identityId={session.hybridbIdentityId}>\n// {children}\n// </HybriDBProvider>\n//\n// Usage (in any client component):\n// const { client, identityId } = useHybriDBClient();\n\nimport React, { createContext, useContext } from 'react';\nimport type { HybriDBClient } from './client.js';\n\ninterface HybriDBContextValue {\n client: HybriDBClient;\n identityId: string;\n}\n\nconst HybriDBContext = createContext<HybriDBContextValue | null>(null);\n\ninterface HybriDBProviderProps {\n client: HybriDBClient;\n identityId: string;\n children: React.ReactNode;\n}\n\nexport function HybriDBProvider({\n client,\n identityId,\n children,\n}: HybriDBProviderProps): React.ReactElement {\n return (\n <HybriDBContext.Provider value={{ client, identityId }}>\n {children}\n </HybriDBContext.Provider>\n );\n}\n\nexport function useHybriDBClient(): HybriDBContextValue {\n const ctx = useContext(HybriDBContext);\n if (!ctx) {\n throw new Error(\n 'useHybriDBClient must be used inside <HybriDBProvider>. ' +\n 'Wrap your app root (layout.tsx) with HybriDBProvider.',\n );\n }\n return ctx;\n}\n"]}
|
package/dist/react.d.cts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { H as HybriDBClient } from './client-DzNX2jDR.cjs';
|
|
3
|
+
import './common/index.js';
|
|
4
|
+
|
|
5
|
+
interface HybriDBContextValue {
|
|
6
|
+
client: HybriDBClient;
|
|
7
|
+
identityId: string;
|
|
8
|
+
}
|
|
9
|
+
interface HybriDBProviderProps {
|
|
10
|
+
client: HybriDBClient;
|
|
11
|
+
identityId: string;
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
}
|
|
14
|
+
declare function HybriDBProvider({ client, identityId, children, }: HybriDBProviderProps): React.ReactElement;
|
|
15
|
+
declare function useHybriDBClient(): HybriDBContextValue;
|
|
16
|
+
|
|
17
|
+
export { HybriDBProvider, useHybriDBClient };
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { H as HybriDBClient } from './client-DzNX2jDR.js';
|
|
3
|
+
import './common/index.js';
|
|
4
|
+
|
|
5
|
+
interface HybriDBContextValue {
|
|
6
|
+
client: HybriDBClient;
|
|
7
|
+
identityId: string;
|
|
8
|
+
}
|
|
9
|
+
interface HybriDBProviderProps {
|
|
10
|
+
client: HybriDBClient;
|
|
11
|
+
identityId: string;
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
}
|
|
14
|
+
declare function HybriDBProvider({ client, identityId, children, }: HybriDBProviderProps): React.ReactElement;
|
|
15
|
+
declare function useHybriDBClient(): HybriDBContextValue;
|
|
16
|
+
|
|
17
|
+
export { HybriDBProvider, useHybriDBClient };
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
/* @hybridb/sdk — Stellrai governed execution runtime */
|
|
5
|
+
var HybriDBContext = createContext(null);
|
|
6
|
+
function HybriDBProvider({
|
|
7
|
+
client,
|
|
8
|
+
identityId,
|
|
9
|
+
children
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ jsx(HybriDBContext.Provider, { value: { client, identityId }, children });
|
|
12
|
+
}
|
|
13
|
+
function useHybriDBClient() {
|
|
14
|
+
const ctx = useContext(HybriDBContext);
|
|
15
|
+
if (!ctx) {
|
|
16
|
+
throw new Error(
|
|
17
|
+
"useHybriDBClient must be used inside <HybriDBProvider>. Wrap your app root (layout.tsx) with HybriDBProvider."
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
return ctx;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { HybriDBProvider, useHybriDBClient };
|
|
24
|
+
//# sourceMappingURL=react.js.map
|
|
25
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx"],"names":[],"mappings":";;;;AAsBA,IAAM,cAAA,GAAiB,cAA0C,IAAI,CAAA;AAQ9D,SAAS,eAAA,CAAgB;AAAA,EAC9B,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA6C;AAC3C,EAAA,uBACE,GAAA,CAAC,eAAe,QAAA,EAAf,EAAwB,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAW,EAClD,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,gBAAA,GAAwC;AACtD,EAAA,MAAM,GAAA,GAAM,WAAW,cAAc,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT","file":"react.js","sourcesContent":["'use client';\n\n// @hybridb/sdk — React context\n// Provides HybriDBClient and resolved hybriDB identity to all React components.\n// All @stellrai/licensing hooks depend on this context.\n//\n// Usage (in app layout.tsx):\n// <HybriDBProvider client={hybridb} identityId={session.hybridbIdentityId}>\n// {children}\n// </HybriDBProvider>\n//\n// Usage (in any client component):\n// const { client, identityId } = useHybriDBClient();\n\nimport React, { createContext, useContext } from 'react';\nimport type { HybriDBClient } from './client.js';\n\ninterface HybriDBContextValue {\n client: HybriDBClient;\n identityId: string;\n}\n\nconst HybriDBContext = createContext<HybriDBContextValue | null>(null);\n\ninterface HybriDBProviderProps {\n client: HybriDBClient;\n identityId: string;\n children: React.ReactNode;\n}\n\nexport function HybriDBProvider({\n client,\n identityId,\n children,\n}: HybriDBProviderProps): React.ReactElement {\n return (\n <HybriDBContext.Provider value={{ client, identityId }}>\n {children}\n </HybriDBContext.Provider>\n );\n}\n\nexport function useHybriDBClient(): HybriDBContextValue {\n const ctx = useContext(HybriDBContext);\n if (!ctx) {\n throw new Error(\n 'useHybriDBClient must be used inside <HybriDBProvider>. ' +\n 'Wrap your app root (layout.tsx) with HybriDBProvider.',\n );\n }\n return ctx;\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hybridb/sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Official TypeScript SDK for the Stellrai governed execution runtime",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"hybridb",
|
|
7
|
+
"stellrai",
|
|
8
|
+
"governance",
|
|
9
|
+
"execution",
|
|
10
|
+
"reversibility",
|
|
11
|
+
"rollback",
|
|
12
|
+
"audit",
|
|
13
|
+
"policy",
|
|
14
|
+
"sdk"
|
|
15
|
+
],
|
|
16
|
+
"homepage": "https://stellrai.com",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/3pplea-Holdings/stellrai.git"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/3pplea-Holdings/stellrai/issues"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"type": "module",
|
|
26
|
+
"main": "./dist/index.cjs",
|
|
27
|
+
"module": "./dist/index.js",
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"import": "./dist/index.js",
|
|
33
|
+
"require": "./dist/index.cjs"
|
|
34
|
+
},
|
|
35
|
+
"./react": {
|
|
36
|
+
"types": "./dist/react.d.ts",
|
|
37
|
+
"import": "./dist/react.js",
|
|
38
|
+
"require": "./dist/react.cjs"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist/",
|
|
43
|
+
"README.md"
|
|
44
|
+
],
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsup",
|
|
47
|
+
"typecheck": "tsc --noEmit",
|
|
48
|
+
"test:unit": "vitest run tests/unit",
|
|
49
|
+
"clean": "rm -rf dist"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"jose": "^5.3.0"
|
|
53
|
+
},
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"react": ">=18.0.0",
|
|
56
|
+
"react-dom": ">=18.0.0"
|
|
57
|
+
},
|
|
58
|
+
"peerDependenciesMeta": {
|
|
59
|
+
"react": {
|
|
60
|
+
"optional": true
|
|
61
|
+
},
|
|
62
|
+
"react-dom": {
|
|
63
|
+
"optional": true
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@stellrai/config": "workspace:*",
|
|
68
|
+
"@stellrai/types": "workspace:*",
|
|
69
|
+
"@types/react": "^18.2.0",
|
|
70
|
+
"tsup": "^8.5.1",
|
|
71
|
+
"typescript": "^5.3.0",
|
|
72
|
+
"vitest": "^1.3.0"
|
|
73
|
+
},
|
|
74
|
+
"publishConfig": {
|
|
75
|
+
"access": "public"
|
|
76
|
+
}
|
|
77
|
+
}
|