@north-light/sdk 0.0.0 → 0.3.415

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +187 -2
  3. package/dist/client.d.ts +176 -0
  4. package/dist/client.js +582 -0
  5. package/dist/crtr.d.ts +24 -0
  6. package/dist/crtr.js +50 -0
  7. package/dist/env-command.d.ts +15 -0
  8. package/dist/env-command.js +138 -0
  9. package/dist/error-codes.d.ts +7 -0
  10. package/dist/error-codes.js +43 -0
  11. package/dist/errors.d.ts +72 -0
  12. package/dist/errors.js +101 -0
  13. package/dist/index.d.ts +41 -0
  14. package/dist/index.js +17 -0
  15. package/dist/keygen-cli.d.ts +2 -0
  16. package/dist/keygen-cli.js +11 -0
  17. package/dist/keygen-command.d.ts +6 -0
  18. package/dist/keygen-command.js +131 -0
  19. package/dist/oauth/index.d.ts +235 -0
  20. package/dist/oauth/index.js +621 -0
  21. package/dist/oauth/keygen.d.ts +18 -0
  22. package/dist/oauth/keygen.js +46 -0
  23. package/dist/oauth/refusal.d.ts +32 -0
  24. package/dist/oauth/refusal.js +17 -0
  25. package/dist/resources/activity.d.ts +22 -0
  26. package/dist/resources/activity.js +43 -0
  27. package/dist/resources/attachments.d.ts +15 -0
  28. package/dist/resources/attachments.js +13 -0
  29. package/dist/resources/bash.d.ts +9 -0
  30. package/dist/resources/bash.js +15 -0
  31. package/dist/resources/canvas/history.d.ts +11 -0
  32. package/dist/resources/canvas/history.js +20 -0
  33. package/dist/resources/canvas.d.ts +19 -0
  34. package/dist/resources/canvas.js +42 -0
  35. package/dist/resources/crons.d.ts +15 -0
  36. package/dist/resources/crons.js +33 -0
  37. package/dist/resources/custom-objects.d.ts +20 -0
  38. package/dist/resources/custom-objects.js +84 -0
  39. package/dist/resources/files.d.ts +34 -0
  40. package/dist/resources/files.js +34 -0
  41. package/dist/resources/follower.d.ts +71 -0
  42. package/dist/resources/follower.js +202 -0
  43. package/dist/resources/forward.d.ts +7 -0
  44. package/dist/resources/forward.js +67 -0
  45. package/dist/resources/grant-watcher.d.ts +57 -0
  46. package/dist/resources/grant-watcher.js +100 -0
  47. package/dist/resources/human/inbox.d.ts +14 -0
  48. package/dist/resources/human/inbox.js +30 -0
  49. package/dist/resources/human/requests.d.ts +13 -0
  50. package/dist/resources/human/requests.js +26 -0
  51. package/dist/resources/human.d.ts +8 -0
  52. package/dist/resources/human.js +10 -0
  53. package/dist/resources/identifiers.d.ts +8 -0
  54. package/dist/resources/identifiers.js +33 -0
  55. package/dist/resources/memory.d.ts +69 -0
  56. package/dist/resources/memory.js +30 -0
  57. package/dist/resources/models/config.d.ts +8 -0
  58. package/dist/resources/models/config.js +9 -0
  59. package/dist/resources/models/credentials.d.ts +10 -0
  60. package/dist/resources/models/credentials.js +17 -0
  61. package/dist/resources/models.d.ts +8 -0
  62. package/dist/resources/models.js +10 -0
  63. package/dist/resources/node-stream.d.ts +34 -0
  64. package/dist/resources/node-stream.js +176 -0
  65. package/dist/resources/nodes/jobs.d.ts +9 -0
  66. package/dist/resources/nodes/jobs.js +14 -0
  67. package/dist/resources/nodes/result.d.ts +8 -0
  68. package/dist/resources/nodes/result.js +11 -0
  69. package/dist/resources/nodes/worktree.d.ts +9 -0
  70. package/dist/resources/nodes/worktree.js +14 -0
  71. package/dist/resources/nodes.d.ts +23 -0
  72. package/dist/resources/nodes.js +47 -0
  73. package/dist/resources/providers.d.ts +51 -0
  74. package/dist/resources/providers.js +15 -0
  75. package/dist/resources/questions.d.ts +49 -0
  76. package/dist/resources/questions.js +21 -0
  77. package/dist/resources/request.d.ts +12 -0
  78. package/dist/resources/request.js +50 -0
  79. package/dist/resources/run-notice.d.ts +34 -0
  80. package/dist/resources/run-notice.js +67 -0
  81. package/dist/resources/run-reply.d.ts +79 -0
  82. package/dist/resources/run-reply.js +93 -0
  83. package/dist/resources/run-stream.d.ts +65 -0
  84. package/dist/resources/run-stream.js +243 -0
  85. package/dist/resources/run-watcher.d.ts +98 -0
  86. package/dist/resources/run-watcher.js +162 -0
  87. package/dist/resources/runs.d.ts +199 -0
  88. package/dist/resources/runs.js +228 -0
  89. package/dist/resources/shares.d.ts +40 -0
  90. package/dist/resources/shares.js +19 -0
  91. package/dist/resources/structured-requests.d.ts +14 -0
  92. package/dist/resources/structured-requests.js +19 -0
  93. package/dist/resources/uploads.d.ts +27 -0
  94. package/dist/resources/uploads.js +11 -0
  95. package/dist/schema.d.ts +7 -0
  96. package/dist/schema.js +10 -0
  97. package/dist/stores/postgres.d.ts +32 -0
  98. package/dist/stores/postgres.js +92 -0
  99. package/dist/testing/clock.d.ts +7 -0
  100. package/dist/testing/clock.js +12 -0
  101. package/dist/testing/cloud.d.ts +228 -0
  102. package/dist/testing/cloud.js +914 -0
  103. package/dist/testing/conformance/index.d.ts +2 -0
  104. package/dist/testing/conformance/index.js +3 -0
  105. package/dist/testing/conformance/keyed-write.d.ts +43 -0
  106. package/dist/testing/conformance/keyed-write.js +124 -0
  107. package/dist/testing/index.d.ts +7 -0
  108. package/dist/testing/index.js +4 -0
  109. package/dist/testing/notices.d.ts +76 -0
  110. package/dist/testing/notices.js +209 -0
  111. package/dist/testing/run.d.ts +174 -0
  112. package/dist/testing/run.js +429 -0
  113. package/dist/testing/users.d.ts +127 -0
  114. package/dist/testing/users.js +78 -0
  115. package/dist/testing/wire.d.ts +62 -0
  116. package/dist/testing/wire.js +148 -0
  117. package/dist/types.d.ts +88 -0
  118. package/dist/types.js +1 -0
  119. package/dist/version.d.ts +2 -0
  120. package/dist/version.js +3 -0
  121. package/package.json +60 -5
@@ -0,0 +1,62 @@
1
+ import type { GrantGetDTO } from '@north-light/api';
2
+ /** An error the fake answers with: status plus the contract-2 envelope fields. */
3
+ export interface FakeError {
4
+ readonly kind: 'fake-error';
5
+ status: number;
6
+ code: string;
7
+ message: string;
8
+ origin: string;
9
+ retryable: boolean;
10
+ details?: unknown;
11
+ param?: string;
12
+ scope?: string;
13
+ }
14
+ /** Build a `FakeError`. `retryable` defaults to the daemon's rule: true exactly for a 503. */
15
+ export declare function fakeError(input: {
16
+ status: number;
17
+ code: string;
18
+ message?: string;
19
+ origin?: string;
20
+ retryable?: boolean;
21
+ details?: unknown;
22
+ param?: string;
23
+ scope?: string;
24
+ }): FakeError;
25
+ export declare function isFakeError(value: unknown): value is FakeError;
26
+ /** Thrown inside the fake's handlers; the router answers it as an envelope. */
27
+ export declare class FakeRefused extends Error {
28
+ readonly error: FakeError;
29
+ constructor(error: FakeError);
30
+ }
31
+ export declare const refuse: (status: number, code: string, message: string, extra?: {
32
+ param?: string;
33
+ details?: unknown;
34
+ scope?: string;
35
+ origin?: string;
36
+ retryable?: boolean;
37
+ }) => FakeRefused;
38
+ export declare const invalid: (message: string, param?: string) => FakeRefused;
39
+ export declare const notFound: (message?: string) => FakeRefused;
40
+ /** The envelope body the app listener writes (`app-listener.ts` `envelope`). */
41
+ export declare function envelopeBody(error: FakeError, runId?: string): {
42
+ error: Record<string, unknown>;
43
+ };
44
+ export declare function jsonAnswer(body: unknown, status: number, headers: Record<string, string>): Response;
45
+ /** Keys sorted, `undefined` dropped, arrays in order: the daemon's `canonicalJson`. */
46
+ export declare function canonicalJson(value: unknown): string;
47
+ /** `grant.get` `version`: changes exactly when rev, resolved_scopes, spend_cap, payer or dependencies does. */
48
+ export declare function grantVersion(grant: Pick<GrantGetDTO, 'rev' | 'resolved_scopes' | 'spend_cap' | 'payer' | 'dependencies'>): string;
49
+ export declare const sha256Hex: (text: string) => string;
50
+ /** The daemon's `requestedScopes`: the run's scope list, or null when the request names none. */
51
+ export declare function requestedScopes(held: readonly string[], value: unknown, grantee: string): string[] | null;
52
+ /** `wait` query: absent → 0; else an integer 1–25. */
53
+ export declare function waitSeconds(query: URLSearchParams): number;
54
+ /** An integer query parameter in [min, max], default when absent. */
55
+ export declare function integerParam(raw: string | null, param: string, min: number, max: number, fallback: number): number;
56
+ export declare function objectBody(body: unknown): Record<string, unknown>;
57
+ /** Unsigned JWT the SDK decodes (`decodeJwt`), as a directory access token. */
58
+ export declare function unsignedJwt(claims: Record<string, unknown>): string;
59
+ export declare function decodeUnsigned(token: string): Record<string, unknown> | null;
60
+ /** Resolve after `ms`, or reject when `signal` aborts. */
61
+ export declare function abortable<T>(signal: AbortSignal | null | undefined, register: (resolve: (value: T) => void) => () => void): Promise<T>;
62
+ export declare const nowIso: (ms?: number) => string;
@@ -0,0 +1,148 @@
1
+ // Wire helpers shared by the fake directory and runtime: the error envelope, JSON answers carrying the runtime
2
+ // version, the daemon's hashes, and request parsing.
3
+ import { createHash } from 'node:crypto';
4
+ import { errorCodes } from '@north-light/api';
5
+ import { covers, parseScope } from '@north-light/identity';
6
+ /** Build a `FakeError`. `retryable` defaults to the daemon's rule: true exactly for a 503. */
7
+ export function fakeError(input) {
8
+ return {
9
+ kind: 'fake-error', status: input.status, code: input.code, message: input.message ?? input.code,
10
+ origin: input.origin ?? 'runtime', retryable: input.retryable ?? input.status === 503,
11
+ ...(input.details === undefined ? {} : { details: input.details }),
12
+ ...(input.param === undefined ? {} : { param: input.param }),
13
+ ...(input.scope === undefined ? {} : { scope: input.scope }),
14
+ };
15
+ }
16
+ export function isFakeError(value) {
17
+ return typeof value === 'object' && value !== null && value.kind === 'fake-error';
18
+ }
19
+ /** Thrown inside the fake's handlers; the router answers it as an envelope. */
20
+ export class FakeRefused extends Error {
21
+ error;
22
+ constructor(error) {
23
+ super(error.message);
24
+ this.error = error;
25
+ }
26
+ }
27
+ export const refuse = (status, code, message, extra = {}) => new FakeRefused(fakeError({ status, code, message, ...extra }));
28
+ export const invalid = (message, param) => refuse(400, 'invalid_request', message, param === undefined ? {} : { param });
29
+ export const notFound = (message = 'run not found') => refuse(404, 'not_found', message);
30
+ const STREAM_TYPES = new Set(['stream_gap', 'provider_error', 'runtime_version_unsupported']);
31
+ function typeOf(code) {
32
+ const row = errorCodes[code];
33
+ if (row)
34
+ return row.type;
35
+ return STREAM_TYPES.has(code) ? 'invalid_request_error' : 'server_error';
36
+ }
37
+ let requestSerial = 0;
38
+ /** The envelope body the app listener writes (`app-listener.ts` `envelope`). */
39
+ export function envelopeBody(error, runId) {
40
+ return {
41
+ error: {
42
+ code: error.code, message: error.message,
43
+ ...(error.details === undefined ? {} : { details: error.details }),
44
+ type: typeOf(error.code),
45
+ ...(error.param ? { param: error.param } : {}),
46
+ origin: error.origin, retryable: error.retryable,
47
+ request_id: `req-fake-${++requestSerial}`,
48
+ ...(runId ? { run_id: runId } : {}),
49
+ ...(error.scope ? { scope: error.scope } : {}),
50
+ ...(error.code === 'unauthorized' ? { user_action: 'reconnect' } : {}),
51
+ },
52
+ };
53
+ }
54
+ export function jsonAnswer(body, status, headers) {
55
+ return new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json', ...headers } });
56
+ }
57
+ /** Keys sorted, `undefined` dropped, arrays in order: the daemon's `canonicalJson`. */
58
+ export function canonicalJson(value) {
59
+ if (Array.isArray(value))
60
+ return `[${value.map((item) => canonicalJson(item === undefined ? null : item)).join(',')}]`;
61
+ if (value && typeof value === 'object') {
62
+ const entries = Object.entries(value).filter(([, v]) => v !== undefined).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
63
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`).join(',')}}`;
64
+ }
65
+ return JSON.stringify(value);
66
+ }
67
+ /** `grant.get` `version`: changes exactly when rev, resolved_scopes, spend_cap, payer or dependencies does. */
68
+ export function grantVersion(grant) {
69
+ const input = { rev: grant.rev, resolved_scopes: grant.resolved_scopes, spend_cap: grant.spend_cap, payer: grant.payer, dependencies: grant.dependencies ?? {} };
70
+ return createHash('sha256').update(canonicalJson(input)).digest('base64url').slice(0, 22);
71
+ }
72
+ export const sha256Hex = (text) => createHash('sha256').update(text).digest('hex');
73
+ /** The daemon's `requestedScopes`: the run's scope list, or null when the request names none. */
74
+ export function requestedScopes(held, value, grantee) {
75
+ const missing = (scope) => refuse(403, 'scope_missing', `missing scope ${scope}`, { scope });
76
+ if (value === undefined) {
77
+ if (!held.some((scope) => covers(scope, 'crtr:llm')))
78
+ throw missing('crtr:llm');
79
+ return null;
80
+ }
81
+ if (!Array.isArray(value) || value.some((scope) => typeof scope !== 'string'))
82
+ throw invalid('scopes must be a list of scope strings', 'scopes');
83
+ for (const scope of value) {
84
+ try {
85
+ parseScope(scope);
86
+ }
87
+ catch {
88
+ throw invalid(`invalid scope ${scope}`, 'scopes');
89
+ }
90
+ if (/^crtr:files:(?:read|rw):app:/.test(scope) && scope.split(':')[4] === grantee.slice(4))
91
+ throw invalid(`own-app files cannot narrow a run: ${scope}`, 'scopes');
92
+ const ownSpace = /^crtr:memory:(?:read|rw):app:/.test(scope) && scope.split(':')[4] === grantee.slice(4);
93
+ if (!ownSpace && !held.some((h) => covers(h, scope)))
94
+ throw missing(scope);
95
+ }
96
+ if (!value.includes('crtr:llm'))
97
+ throw missing('crtr:llm');
98
+ return value;
99
+ }
100
+ /** `wait` query: absent → 0; else an integer 1–25. */
101
+ export function waitSeconds(query) {
102
+ const raw = query.get('wait');
103
+ if (raw === null || raw === '')
104
+ return 0;
105
+ if (!/^(0|[1-9]\d?)$/.test(raw) || Number(raw) < 1 || Number(raw) > 25)
106
+ throw invalid('wait must be an integer from 1 through 25', 'wait');
107
+ return Number(raw);
108
+ }
109
+ /** An integer query parameter in [min, max], default when absent. */
110
+ export function integerParam(raw, param, min, max, fallback) {
111
+ if (raw === null)
112
+ return fallback;
113
+ if (!/^(0|[1-9]\d*)$/.test(raw) || Number(raw) < min || Number(raw) > max)
114
+ throw invalid(`invalid ${param}`, param);
115
+ return Number(raw);
116
+ }
117
+ export function objectBody(body) {
118
+ if (!body || typeof body !== 'object' || Array.isArray(body))
119
+ throw invalid('a JSON object is required');
120
+ return body;
121
+ }
122
+ /** Unsigned JWT the SDK decodes (`decodeJwt`), as a directory access token. */
123
+ export function unsignedJwt(claims) {
124
+ const part = (value) => Buffer.from(JSON.stringify(value)).toString('base64url');
125
+ return `${part({ alg: 'none', typ: 'at+jwt' })}.${part(claims)}.fake`;
126
+ }
127
+ export function decodeUnsigned(token) {
128
+ try {
129
+ return JSON.parse(Buffer.from(token.split('.')[1] ?? '', 'base64url').toString());
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ /** Resolve after `ms`, or reject when `signal` aborts. */
136
+ export function abortable(signal, register) {
137
+ return new Promise((resolve, reject) => {
138
+ if (signal?.aborted) {
139
+ reject(signal.reason ?? new DOMException('aborted', 'AbortError'));
140
+ return;
141
+ }
142
+ let unregister = () => { };
143
+ const onAbort = () => { unregister(); reject(signal.reason ?? new DOMException('aborted', 'AbortError')); };
144
+ unregister = register((value) => { signal?.removeEventListener('abort', onAbort); unregister(); resolve(value); });
145
+ signal?.addEventListener('abort', onAbort, { once: true });
146
+ });
147
+ }
148
+ export const nowIso = (ms = Date.now()) => new Date(ms).toISOString();
@@ -0,0 +1,88 @@
1
+ import type { CloseRequest, CreateNodeRequest, EnsureProfileRequest, NodeEventsQuery, ModelAuthReadinessDTO, ModelAuthReadinessQuery, NodeOutcomeDTO, SendMessageRequest, StartupPhaseDTO } from '@north-light/api';
2
+ /** A JSON Schema object. The daemon validates structured results against it. */
3
+ export type JsonSchema = Record<string, unknown>;
4
+ /**
5
+ * A structured-result schema: a JSON string, a JSON Schema object, or anything exposing
6
+ * `toJSONSchema()` — which a Zod v4 object does.
7
+ */
8
+ export type OutputSchema = string | JsonSchema | {
9
+ toJSONSchema(): JsonSchema;
10
+ };
11
+ /** The daemon's create request, widening `output_schema` to accept schema objects. */
12
+ export type NodeCreateParams = Omit<CreateNodeRequest, 'output_schema'> & {
13
+ output_schema?: OutputSchema;
14
+ };
15
+ /** The final argument of every request-capable method. */
16
+ export interface RequestOptions {
17
+ /** Merged into this request's headers. */
18
+ headers?: Record<string, string>;
19
+ /** Aborts the request, rejecting with `APIUserAbortError`. */
20
+ signal?: AbortSignal;
21
+ /** Wall clock in milliseconds for this request, overriding the client's default. */
22
+ timeout?: number;
23
+ /** Transient-failure retries for this request. Never applied to `POST` or `PATCH`. */
24
+ maxRetries?: number;
25
+ /** One overall deadline for this call, in milliseconds from now: it covers every attempt, every retry wait
26
+ * (including a server's `Retry-After`) and the response body. `timeout` still bounds each attempt but never
27
+ * past the deadline. When the deadline passes, or a retry wait would pass it, the call rejects with
28
+ * `DeadlineExceededError` at once instead of sleeping on. */
29
+ budgetMs?: number;
30
+ /** The same deadline as an absolute instant (epoch milliseconds), for passing one deadline to several calls.
31
+ * With `budgetMs` too, the earlier wins. */
32
+ deadlineAt?: number;
33
+ }
34
+ /** Options for one outcome poll. */
35
+ export interface NodeOutcomeOptions extends RequestOptions {
36
+ /** One daemon long poll in seconds, from 0 through 25. */
37
+ wait?: number;
38
+ }
39
+ /** Options for an existing node's event stream. Streams have no wall-clock timeout. */
40
+ export interface NodeEventsOptions extends Omit<RequestOptions, 'timeout'>, NodeEventsQuery {
41
+ }
42
+ /** A message to a running node. The sender is filled in by the client. */
43
+ export type MessageParams = Omit<SendMessageRequest, 'from'>;
44
+ /** What `nodes.cancel` closes, including whether to cascade to descendants. */
45
+ export type CancelParams = CloseRequest;
46
+ /** The outcome of a `parse` run, with the structured result typed from the schema. */
47
+ export type ParsedOutcome<T> = (Extract<NodeOutcomeDTO, {
48
+ kind: 'result';
49
+ }> & {
50
+ output_parsed: T;
51
+ }) | (Exclude<NodeOutcomeDTO, {
52
+ kind: 'result';
53
+ }> & {
54
+ output_parsed: null;
55
+ });
56
+ /** The value type an `OutputSchema` describes, inferred from a Zod or Standard Schema object. */
57
+ export type SchemaOutput<T> = T extends {
58
+ _output: infer Output;
59
+ } ? Output : T extends {
60
+ '~standard': {
61
+ types?: {
62
+ output: infer Output;
63
+ };
64
+ };
65
+ } ? Output : unknown;
66
+ /** The profile settings `profiles.ensure` creates or updates. */
67
+ export type EnsureProfileParams = EnsureProfileRequest;
68
+ /** The launch-selecting fields used to resolve the provider readiness check. */
69
+ export type AuthStatusParams = ModelAuthReadinessQuery;
70
+ /** Whether this client can reach a daemon that can run a model, and what to do if it cannot. */
71
+ export interface AuthStatus {
72
+ /** The client holds a transport and the daemon answered. */
73
+ connected: boolean;
74
+ /** Present only when connected. */
75
+ daemon: {
76
+ base_url: string;
77
+ runtime_version: string;
78
+ api_version: string;
79
+ startup_phase: StartupPhaseDTO;
80
+ tcp: string | null;
81
+ } | null;
82
+ /** Present only when connected. */
83
+ model: ModelAuthReadinessDTO | null;
84
+ /** The one thing the application should do next, or null when ready. */
85
+ next_step: 'connect' | 'login' | null;
86
+ /** Literal text the application shows the user for `next_step`. */
87
+ instructions: string | null;
88
+ }
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ /** This SDK's release version. It is also the oldest runtime the SDK accepts: one release is one version set. */
2
+ export declare const SDK_VERSION = "0.3.415";
@@ -0,0 +1,3 @@
1
+ // Written by scripts/release-version.mjs on every release; do not edit by hand.
2
+ /** This SDK's release version. It is also the oldest runtime the SDK accepts: one release is one version set. */
3
+ export const SDK_VERSION = '0.3.415';
package/package.json CHANGED
@@ -1,8 +1,63 @@
1
1
  {
2
2
  "name": "@north-light/sdk",
3
- "version": "0.0.0",
4
- "description": "Placeholder. The release of this package is published from Northlight-Systems/crouter by CI.",
5
- "license": "UNLICENSED",
6
- "repository": { "type": "git", "url": "git+https://github.com/Northlight-Systems/crouter.git" },
7
- "publishConfig": { "access": "public" }
3
+ "version": "0.3.415",
4
+ "description": "Typed Node and browser client for running crouter agents through the crtrd /v1 API.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "crouter-sdk": "./dist/keygen-cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ },
16
+ "./errors": {
17
+ "types": "./dist/error-codes.d.ts",
18
+ "import": "./dist/error-codes.js"
19
+ },
20
+ "./stores/postgres": {
21
+ "types": "./dist/stores/postgres.d.ts",
22
+ "import": "./dist/stores/postgres.js"
23
+ },
24
+ "./testing": {
25
+ "types": "./dist/testing/index.d.ts",
26
+ "import": "./dist/testing/index.js"
27
+ },
28
+ "./testing/conformance": {
29
+ "types": "./dist/testing/conformance/index.d.ts",
30
+ "import": "./dist/testing/conformance/index.js"
31
+ }
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "README.md"
36
+ ],
37
+ "sideEffects": false,
38
+ "scripts": {
39
+ "build": "tsc -p tsconfig.json && chmod 755 dist/keygen-cli.js"
40
+ },
41
+ "dependencies": {
42
+ "@north-light/api": "0.3.415",
43
+ "@north-light/identity": "0.3.415",
44
+ "jose": "^6.2.1"
45
+ },
46
+ "peerDependencies": {
47
+ "pg": "^8.0.0"
48
+ },
49
+ "peerDependenciesMeta": {
50
+ "pg": {
51
+ "optional": true
52
+ }
53
+ },
54
+ "publishConfig": {
55
+ "access": "public"
56
+ },
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "git+https://github.com/Northlight-Systems/crouter.git",
60
+ "directory": "packages/crouter-sdk"
61
+ },
62
+ "license": "UNLICENSED"
8
63
  }