@kaironull/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 ADDED
@@ -0,0 +1,108 @@
1
+ # @kaironull/sdk
2
+
3
+ Node.js SDK for the [KairoNull](https://kaironull.com) Umbra Trust Protocol —
4
+ capture AI decision events to a hash-chained, RFC3161-anchored evidence
5
+ ledger, and verify records independently.
6
+
7
+ Zero runtime dependencies. Uses native `fetch` (Node 18+).
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install @kaironull/sdk
13
+ ```
14
+
15
+ ## Quickstart
16
+
17
+ ```ts
18
+ import { KairoNull } from '@kaironull/sdk'
19
+
20
+ const client = new KairoNull({ apiKey: 'utp_live_...' }) // get a key at kaironull.com/get-access
21
+
22
+ const result = await client.record({
23
+ pipelineId: 'credit-decisioning',
24
+ entryType: 'flag', // 'pass' | 'flag' | 'block' | 'escalate'
25
+ stageSlug: 'risk-review',
26
+ summary: 'Application flagged for manual review: DTI ratio 0.61 exceeds threshold',
27
+ trustScore: 0.42,
28
+ modelVersion: 'risk-model-v3.2',
29
+ })
30
+
31
+ console.log(result.entryHash) // sha256 hex — share this with an auditor
32
+ console.log(result.chainHeight) // position in your org's evidence chain
33
+ ```
34
+
35
+ ## Verify a record (no API key needed)
36
+
37
+ ```ts
38
+ import { KairoNull } from '@kaironull/sdk'
39
+
40
+ const client = new KairoNull() // public methods don't require a key
41
+ const verified = await client.verify('95be8bb5253668bb898da34631cc3c9e...')
42
+
43
+ if (verified.found) {
44
+ console.log(verified.record?.summary)
45
+ console.log('Anchored:', verified.anchor?.anchored)
46
+ }
47
+ ```
48
+
49
+ Anyone can verify a hash — auditors don't need credentials, an account, or
50
+ access to your systems. This is also what powers the public widget at
51
+ [kaironull.com/#verify](https://kaironull.com/#verify).
52
+
53
+ ## Check chain health
54
+
55
+ ```ts
56
+ const status = await client.chainStatus()
57
+ console.log(status.chainHeight, status.healthy)
58
+ ```
59
+
60
+ Same data backing [kaironull.com/status](https://kaironull.com/status).
61
+
62
+ ## Export an evidence bundle
63
+
64
+ ```ts
65
+ const bundle = await client.exportReport({
66
+ from: '2026-06-01T00:00:00Z',
67
+ to: '2026-07-01T00:00:00Z',
68
+ })
69
+ // bundle.entries, bundle.anchor — hand this to an auditor or regulator
70
+ ```
71
+
72
+ ## Revoke your key
73
+
74
+ ```ts
75
+ await client.revokeKey('key-id-here') // the key used to auth this call is what's revoked
76
+ ```
77
+
78
+ ## Error handling
79
+
80
+ ```ts
81
+ import { AuthenticationError, ValidationError, APIError } from '@kaironull/sdk'
82
+
83
+ try {
84
+ await client.record({ ... })
85
+ } catch (e) {
86
+ if (e instanceof ValidationError) {
87
+ // bad input — fix the call
88
+ } else if (e instanceof AuthenticationError) {
89
+ // missing/invalid/revoked key
90
+ } else if (e instanceof APIError) {
91
+ // anything else — e.statusCode has the HTTP status
92
+ }
93
+ }
94
+ ```
95
+
96
+ ## Links
97
+
98
+ - [Full API reference / quickstart](https://kaironull.com/quickstart)
99
+ - [Get an API key](https://kaironull.com/get-access)
100
+ - [Docs](https://kaironull.com/docs)
101
+ - [Python SDK](https://pypi.org/project/kaironull/)
102
+
103
+ ## Status
104
+
105
+ This SDK covers the full public API surface: `record`, `verify`,
106
+ `chainStatus`, `exportReport`, `revokeKey`. It is a thin wrapper — every
107
+ method maps directly to one REST call, matching the
108
+ [quickstart](https://kaironull.com/quickstart) examples exactly.
@@ -0,0 +1,59 @@
1
+ import type { ChainStatus, ExportReportOptions, RecordInput, RecordResult, RevokedKey, VerifyResult } from './types.js';
2
+ export interface KairoNullOptions {
3
+ /** Your `utp_live_...` API key. Required for record(), revokeKey(), exportReport(). */
4
+ apiKey?: string;
5
+ /** Override the API host. Defaults to https://kaironull.com */
6
+ baseUrl?: string;
7
+ /** Per-request timeout in milliseconds. Defaults to 10000. */
8
+ timeoutMs?: number;
9
+ }
10
+ /**
11
+ * Client for the KairoNull Umbra Trust Protocol REST API.
12
+ *
13
+ * ```ts
14
+ * const client = new KairoNull({ apiKey: 'utp_live_...' })
15
+ * const result = await client.record({
16
+ * pipelineId: 'credit-decisioning',
17
+ * entryType: 'flag',
18
+ * stageSlug: 'risk-review',
19
+ * summary: 'Application flagged for manual review',
20
+ * trustScore: 0.42,
21
+ * })
22
+ * ```
23
+ */
24
+ export declare class KairoNull {
25
+ private readonly apiKey?;
26
+ private readonly baseUrl;
27
+ private readonly timeoutMs;
28
+ constructor(options?: KairoNullOptions);
29
+ private request;
30
+ private requireApiKey;
31
+ /**
32
+ * Record an AI decision event. Requires an API key.
33
+ * Maps to `POST /api/v1/records`.
34
+ */
35
+ record(input: RecordInput): Promise<RecordResult>;
36
+ /**
37
+ * Verify a record by its SHA-256 entry hash. Public — no API key required.
38
+ * Maps to `GET /api/v1/verify/:hash`.
39
+ */
40
+ verify(entryHash: string): Promise<VerifyResult>;
41
+ /**
42
+ * Get the current state of the evidence chain. Public — no API key required.
43
+ * Same data that powers https://kaironull.com/status.
44
+ * Maps to `GET /api/v1/chain/status`.
45
+ */
46
+ chainStatus(): Promise<ChainStatus>;
47
+ /**
48
+ * Revoke this client's own API key. Requires an API key — the key itself
49
+ * is the Bearer token and can only revoke itself.
50
+ * Maps to `DELETE /api/v1/keys/:id`.
51
+ */
52
+ revokeKey(keyId: string): Promise<RevokedKey>;
53
+ /**
54
+ * Export the full evidence bundle for offline audit or regulator handoff.
55
+ * Requires an API key. Maps to `GET /api/v1/reports`.
56
+ */
57
+ exportReport(options?: ExportReportOptions): Promise<Record<string, unknown>>;
58
+ }
59
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,WAAW,EACX,mBAAmB,EAEnB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACb,MAAM,YAAY,CAAA;AAMnB,MAAM,WAAW,gBAAgB;IAC/B,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,OAAO,GAAE,gBAAqB;YAU5B,OAAO;IAiDrB,OAAO,CAAC,aAAa;IAcrB;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwCvD;;;OAGG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBtD;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IA0BzC;;;;OAIG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBnD;;;OAGG;IACG,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAQxF"}
package/dist/client.js ADDED
@@ -0,0 +1,208 @@
1
+ import { APIError, AuthenticationError, ValidationError } from './errors.js';
2
+ const DEFAULT_BASE_URL = 'https://kaironull.com';
3
+ const HASH_RE = /^[0-9a-f]{64}$/;
4
+ const VALID_ENTRY_TYPES = new Set(['pass', 'flag', 'block', 'escalate']);
5
+ /**
6
+ * Client for the KairoNull Umbra Trust Protocol REST API.
7
+ *
8
+ * ```ts
9
+ * const client = new KairoNull({ apiKey: 'utp_live_...' })
10
+ * const result = await client.record({
11
+ * pipelineId: 'credit-decisioning',
12
+ * entryType: 'flag',
13
+ * stageSlug: 'risk-review',
14
+ * summary: 'Application flagged for manual review',
15
+ * trustScore: 0.42,
16
+ * })
17
+ * ```
18
+ */
19
+ export class KairoNull {
20
+ apiKey;
21
+ baseUrl;
22
+ timeoutMs;
23
+ constructor(options = {}) {
24
+ this.apiKey = options.apiKey;
25
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, '');
26
+ this.timeoutMs = options.timeoutMs ?? 10_000;
27
+ }
28
+ // -------------------------------------------------------------------- //
29
+ // Internal request helper
30
+ // -------------------------------------------------------------------- //
31
+ async request(method, path, opts = {}) {
32
+ const url = new URL(`${this.baseUrl}${path}`);
33
+ if (opts.params) {
34
+ for (const [k, v] of Object.entries(opts.params))
35
+ url.searchParams.set(k, v);
36
+ }
37
+ const headers = {};
38
+ if (opts.authToken)
39
+ headers.Authorization = `Bearer ${opts.authToken}`;
40
+ if (opts.body !== undefined)
41
+ headers['Content-Type'] = 'application/json';
42
+ const controller = new AbortController();
43
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
44
+ let res;
45
+ try {
46
+ res = await fetch(url, {
47
+ method,
48
+ headers,
49
+ body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,
50
+ signal: controller.signal,
51
+ });
52
+ }
53
+ catch (err) {
54
+ throw new APIError(`Network error calling ${url}: ${err.message}`, 0);
55
+ }
56
+ finally {
57
+ clearTimeout(timeout);
58
+ }
59
+ if (res.status === 401 || res.status === 403) {
60
+ throw new AuthenticationError((await errorMessage(res)) ?? 'Authentication failed');
61
+ }
62
+ if (res.status === 400) {
63
+ throw new ValidationError((await errorMessage(res)) ?? 'Invalid request');
64
+ }
65
+ if (res.status === 404) {
66
+ return isJson(res) ? (await res.json()) : {};
67
+ }
68
+ if (!res.ok) {
69
+ const text = await res.text().catch(() => '');
70
+ throw new APIError((await errorMessage(res)) ?? `Request to ${path} failed`, res.status, text);
71
+ }
72
+ const text = await res.text();
73
+ return (text ? JSON.parse(text) : {});
74
+ }
75
+ requireApiKey() {
76
+ if (!this.apiKey) {
77
+ throw new AuthenticationError('This call requires an API key. Pass apiKey when constructing new KairoNull(), ' +
78
+ 'or request one at https://kaironull.com/get-access');
79
+ }
80
+ return this.apiKey;
81
+ }
82
+ // -------------------------------------------------------------------- //
83
+ // Public methods
84
+ // -------------------------------------------------------------------- //
85
+ /**
86
+ * Record an AI decision event. Requires an API key.
87
+ * Maps to `POST /api/v1/records`.
88
+ */
89
+ async record(input) {
90
+ if (!VALID_ENTRY_TYPES.has(input.entryType)) {
91
+ throw new ValidationError(`entryType must be one of pass, flag, block, escalate — got ${input.entryType}`);
92
+ }
93
+ if (input.trustScore !== undefined && (input.trustScore < 0 || input.trustScore > 1)) {
94
+ throw new ValidationError('trustScore must be between 0 and 1');
95
+ }
96
+ const body = {
97
+ pipeline_id: input.pipelineId,
98
+ entry_type: input.entryType,
99
+ stage_slug: input.stageSlug,
100
+ summary: input.summary,
101
+ };
102
+ if (input.detail !== undefined)
103
+ body.detail = input.detail;
104
+ if (input.trustScore !== undefined)
105
+ body.trust_score = input.trustScore;
106
+ if (input.modelVersion !== undefined)
107
+ body.model_version = input.modelVersion;
108
+ if (input.dataSources !== undefined)
109
+ body.data_sources = input.dataSources;
110
+ if (input.inputPayload !== undefined)
111
+ body.input_payload = input.inputPayload;
112
+ if (input.systemState !== undefined)
113
+ body.system_state = input.systemState;
114
+ const data = await this.request('POST', '/api/v1/records', { authToken: this.requireApiKey(), body });
115
+ return {
116
+ id: data.id,
117
+ entryHash: data.entry_hash,
118
+ prevHash: data.prev_hash,
119
+ writtenAt: data.written_at,
120
+ chainHeight: data.chain_height ?? 0,
121
+ };
122
+ }
123
+ /**
124
+ * Verify a record by its SHA-256 entry hash. Public — no API key required.
125
+ * Maps to `GET /api/v1/verify/:hash`.
126
+ */
127
+ async verify(entryHash) {
128
+ const hash = entryHash.toLowerCase().trim();
129
+ if (!HASH_RE.test(hash)) {
130
+ throw new ValidationError('entryHash must be a 64-character hex SHA-256 string');
131
+ }
132
+ const data = await this.request('GET', `/api/v1/verify/${hash}`);
133
+ const anchor = data.anchor
134
+ ? {
135
+ anchored: data.anchor.anchored,
136
+ anchoredAt: data.anchor.anchored_at,
137
+ rootHash: data.anchor.root_hash,
138
+ }
139
+ : undefined;
140
+ return { found: data.found ?? false, record: data.record, anchor };
141
+ }
142
+ /**
143
+ * Get the current state of the evidence chain. Public — no API key required.
144
+ * Same data that powers https://kaironull.com/status.
145
+ * Maps to `GET /api/v1/chain/status`.
146
+ */
147
+ async chainStatus() {
148
+ const data = await this.request('GET', '/api/v1/chain/status');
149
+ const lastAnchor = data.last_anchor
150
+ ? {
151
+ rootHash: data.last_anchor.root_hash,
152
+ anchoredAt: data.last_anchor.anchored_at,
153
+ entryCount: data.last_anchor.entry_count ?? 0,
154
+ }
155
+ : undefined;
156
+ return {
157
+ chainHeight: data.chain_height ?? 0,
158
+ latestEntryHash: data.latest_entry_hash,
159
+ latestWrittenAt: data.latest_written_at,
160
+ healthy: data.healthy ?? false,
161
+ lastAnchor,
162
+ };
163
+ }
164
+ /**
165
+ * Revoke this client's own API key. Requires an API key — the key itself
166
+ * is the Bearer token and can only revoke itself.
167
+ * Maps to `DELETE /api/v1/keys/:id`.
168
+ */
169
+ async revokeKey(keyId) {
170
+ const data = await this.request('DELETE', `/api/v1/keys/${keyId}`, { authToken: this.requireApiKey() });
171
+ return {
172
+ keyId: data.key_id,
173
+ orgId: data.org_id,
174
+ label: data.label,
175
+ revokedAt: data.revoked_at,
176
+ status: data.status,
177
+ };
178
+ }
179
+ /**
180
+ * Export the full evidence bundle for offline audit or regulator handoff.
181
+ * Requires an API key. Maps to `GET /api/v1/reports`.
182
+ */
183
+ async exportReport(options = {}) {
184
+ const params = {};
185
+ if (options.from)
186
+ params.from = options.from;
187
+ if (options.to)
188
+ params.to = options.to;
189
+ if (options.limit)
190
+ params.limit = String(options.limit);
191
+ return this.request('GET', '/api/v1/reports', { authToken: this.requireApiKey(), params });
192
+ }
193
+ }
194
+ function isJson(res) {
195
+ return (res.headers.get('Content-Type') ?? '').includes('application/json');
196
+ }
197
+ async function errorMessage(res) {
198
+ if (!isJson(res))
199
+ return undefined;
200
+ try {
201
+ const payload = (await res.json());
202
+ return payload.error;
203
+ }
204
+ catch {
205
+ return undefined;
206
+ }
207
+ }
208
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** Errors raised by the KairoNull SDK. */
2
+ export declare class KairoNullError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /** Missing, invalid, or revoked API key (HTTP 401/403). */
6
+ export declare class AuthenticationError extends KairoNullError {
7
+ constructor(message: string);
8
+ }
9
+ /** Request body failed validation, client-side or server-side (HTTP 400). */
10
+ export declare class ValidationError extends KairoNullError {
11
+ constructor(message: string);
12
+ }
13
+ /** Any other non-2xx response from the KairoNull API. */
14
+ export declare class APIError extends KairoNullError {
15
+ readonly statusCode: number;
16
+ readonly responseBody: string;
17
+ constructor(message: string, statusCode: number, responseBody?: string);
18
+ }
19
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAE1C,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAED,2DAA2D;AAC3D,qBAAa,mBAAoB,SAAQ,cAAc;gBACzC,OAAO,EAAE,MAAM;CAI5B;AAED,6EAA6E;AAC7E,qBAAa,eAAgB,SAAQ,cAAc;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,yDAAyD;AACzD,qBAAa,QAAS,SAAQ,cAAc;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;gBAEjB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,SAAK;CAMnE"}
package/dist/errors.js ADDED
@@ -0,0 +1,33 @@
1
+ /** Errors raised by the KairoNull SDK. */
2
+ export class KairoNullError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'KairoNullError';
6
+ }
7
+ }
8
+ /** Missing, invalid, or revoked API key (HTTP 401/403). */
9
+ export class AuthenticationError extends KairoNullError {
10
+ constructor(message) {
11
+ super(message);
12
+ this.name = 'AuthenticationError';
13
+ }
14
+ }
15
+ /** Request body failed validation, client-side or server-side (HTTP 400). */
16
+ export class ValidationError extends KairoNullError {
17
+ constructor(message) {
18
+ super(message);
19
+ this.name = 'ValidationError';
20
+ }
21
+ }
22
+ /** Any other non-2xx response from the KairoNull API. */
23
+ export class APIError extends KairoNullError {
24
+ statusCode;
25
+ responseBody;
26
+ constructor(message, statusCode, responseBody = '') {
27
+ super(`${message} (HTTP ${statusCode})`);
28
+ this.name = 'APIError';
29
+ this.statusCode = statusCode;
30
+ this.responseBody = responseBody;
31
+ }
32
+ }
33
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAE1C,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAED,yDAAyD;AACzD,MAAM,OAAO,QAAS,SAAQ,cAAc;IACjC,UAAU,CAAQ;IAClB,YAAY,CAAQ;IAE7B,YAAY,OAAe,EAAE,UAAkB,EAAE,YAAY,GAAG,EAAE;QAChE,KAAK,CAAC,GAAG,OAAO,UAAU,UAAU,GAAG,CAAC,CAAA;QACxC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;QACtB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IAClC,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * KairoNull Node.js SDK
3
+ *
4
+ * A thin client for the Umbra Trust Protocol (UTP) REST API — record AI
5
+ * decisions to a hash-chained, RFC3161-anchored evidence ledger, and verify
6
+ * records independently.
7
+ *
8
+ * ```ts
9
+ * import { KairoNull } from '@kaironull/sdk'
10
+ *
11
+ * const client = new KairoNull({ apiKey: 'utp_live_...' })
12
+ *
13
+ * const result = await client.record({
14
+ * pipelineId: 'credit-decisioning',
15
+ * entryType: 'flag',
16
+ * stageSlug: 'risk-review',
17
+ * summary: 'Application flagged for manual review: DTI ratio 0.61 exceeds threshold',
18
+ * trustScore: 0.42,
19
+ * })
20
+ * console.log(result.entryHash)
21
+ *
22
+ * const verified = await client.verify(result.entryHash)
23
+ * console.log(verified.found)
24
+ * ```
25
+ */
26
+ export { KairoNull } from './client.js';
27
+ export type { KairoNullOptions } from './client.js';
28
+ export { KairoNullError, AuthenticationError, ValidationError, APIError } from './errors.js';
29
+ export type { EntryType, RecordInput, RecordResult, VerifyResult, AnchorInfo, ChainStatus, LastAnchor, RevokedKey, ExportReportOptions, } from './types.js';
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC5F,YAAY,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,UAAU,EACV,UAAU,EACV,mBAAmB,GACpB,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * KairoNull Node.js SDK
3
+ *
4
+ * A thin client for the Umbra Trust Protocol (UTP) REST API — record AI
5
+ * decisions to a hash-chained, RFC3161-anchored evidence ledger, and verify
6
+ * records independently.
7
+ *
8
+ * ```ts
9
+ * import { KairoNull } from '@kaironull/sdk'
10
+ *
11
+ * const client = new KairoNull({ apiKey: 'utp_live_...' })
12
+ *
13
+ * const result = await client.record({
14
+ * pipelineId: 'credit-decisioning',
15
+ * entryType: 'flag',
16
+ * stageSlug: 'risk-review',
17
+ * summary: 'Application flagged for manual review: DTI ratio 0.61 exceeds threshold',
18
+ * trustScore: 0.42,
19
+ * })
20
+ * console.log(result.entryHash)
21
+ *
22
+ * const verified = await client.verify(result.entryHash)
23
+ * console.log(verified.found)
24
+ * ```
25
+ */
26
+ export { KairoNull } from './client.js';
27
+ export { KairoNullError, AuthenticationError, ValidationError, APIError } from './errors.js';
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,61 @@
1
+ /** Typed response shapes for the KairoNull SDK. */
2
+ export type EntryType = 'pass' | 'flag' | 'block' | 'escalate';
3
+ export interface RecordInput {
4
+ pipelineId: string;
5
+ entryType: EntryType;
6
+ stageSlug: string;
7
+ summary: string;
8
+ detail?: Record<string, unknown>;
9
+ trustScore?: number;
10
+ modelVersion?: string;
11
+ dataSources?: string[];
12
+ inputPayload?: Record<string, unknown>;
13
+ systemState?: Record<string, unknown>;
14
+ }
15
+ /** Response from client.record() — POST /api/v1/records */
16
+ export interface RecordResult {
17
+ id: string;
18
+ entryHash: string;
19
+ prevHash: string;
20
+ writtenAt: string;
21
+ chainHeight: number;
22
+ }
23
+ /** RFC3161 anchor coverage for a ledger entry. */
24
+ export interface AnchorInfo {
25
+ anchored: boolean;
26
+ anchoredAt?: string;
27
+ rootHash?: string;
28
+ }
29
+ /** Response from client.verify() — GET /api/v1/verify/:hash */
30
+ export interface VerifyResult {
31
+ found: boolean;
32
+ record?: Record<string, unknown>;
33
+ anchor?: AnchorInfo;
34
+ }
35
+ export interface LastAnchor {
36
+ rootHash: string;
37
+ anchoredAt: string;
38
+ entryCount: number;
39
+ }
40
+ /** Response from client.chainStatus() — GET /api/v1/chain/status */
41
+ export interface ChainStatus {
42
+ chainHeight: number;
43
+ latestEntryHash: string | null;
44
+ latestWrittenAt: string | null;
45
+ healthy: boolean;
46
+ lastAnchor?: LastAnchor;
47
+ }
48
+ /** Response from client.revokeKey() — DELETE /api/v1/keys/:id */
49
+ export interface RevokedKey {
50
+ keyId: string;
51
+ orgId: string;
52
+ label: string;
53
+ revokedAt: string;
54
+ status: string;
55
+ }
56
+ export interface ExportReportOptions {
57
+ from?: string;
58
+ to?: string;
59
+ limit?: number;
60
+ }
61
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAA;AAE9D,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACtC;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,oEAAoE;AACpE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,UAAU,CAAA;CACxB;AAED,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ /** Typed response shapes for the KairoNull SDK. */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,mDAAmD"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@kaironull/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Node.js SDK for the KairoNull Umbra Trust Protocol — AI decision evidence capture and verification",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "engines": {
18
+ "node": ">=18"
19
+ },
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.json",
22
+ "test": "npm run build && node --test test/*.test.js",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "keywords": [
26
+ "ai-governance",
27
+ "audit-trail",
28
+ "evidence",
29
+ "eu-ai-act",
30
+ "compliance"
31
+ ],
32
+ "author": "KairoNull <dane@kaironull.com>",
33
+ "license": "MIT",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/BlackFlag-Digital/PropertyVR.git",
37
+ "directory": "kairon-null/sdk/node"
38
+ },
39
+ "homepage": "https://kaironull.com",
40
+ "bugs": {
41
+ "url": "https://github.com/BlackFlag-Digital/PropertyVR/issues"
42
+ },
43
+ "devDependencies": {
44
+ "typescript": "^5.6.0",
45
+ "@types/node": "^22.0.0"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public",
49
+ "provenance": true
50
+ }
51
+ }