@nexalink/carecompass-sdk 0.1.0-beta.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,3 @@
1
+ # CareCompass SDK
2
+
3
+ See the repository documentation at `docs/carecompass-sdk.md`.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ type CliIO = {
3
+ stdout: Pick<NodeJS.WriteStream, "write">;
4
+ stderr: Pick<NodeJS.WriteStream, "write">;
5
+ env: NodeJS.ProcessEnv;
6
+ };
7
+ export declare function runCareCompassCli(argv?: string[], io?: CliIO): Promise<1 | 0>;
8
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { createDefaultCareCompassConfig, validateCareCompassConfig, } from "./schema.js";
5
+ import { resolveApiKey, resolveCredentialsPath, writeStoredApiKey, } from "./credentials.js";
6
+ import { generateCareCompassSnippet } from "./snippet.js";
7
+ const DEFAULT_CONFIG_PATH = "carecompass.config.json";
8
+ const DEFAULT_SIGNUP_URL = "https://nexalink.care/signup?group=payer";
9
+ function parseArgs(argv) {
10
+ const [command = "help", ...rest] = argv;
11
+ const flags = {};
12
+ for (let index = 0; index < rest.length; index += 1) {
13
+ const token = rest[index];
14
+ if (!token.startsWith("--"))
15
+ continue;
16
+ const key = token.slice(2);
17
+ const next = rest[index + 1];
18
+ const value = !next || next.startsWith("--") ? true : next;
19
+ if (value !== true)
20
+ index += 1;
21
+ if (key === "origin") {
22
+ const existing = flags.origin;
23
+ flags.origin = Array.isArray(existing)
24
+ ? [...existing, String(value)]
25
+ : existing
26
+ ? [String(existing), String(value)]
27
+ : [String(value)];
28
+ continue;
29
+ }
30
+ flags[key] = value;
31
+ }
32
+ return { command, flags };
33
+ }
34
+ const flagString = (flags, key) => {
35
+ const value = flags[key];
36
+ return typeof value === "string" ? value : undefined;
37
+ };
38
+ function requireApiKey(flags, io) {
39
+ const credentialsPath = resolveCredentialsPath(io.env);
40
+ const credentials = resolveApiKey(flagString(flags, "api-key"), io.env, credentialsPath);
41
+ if (!credentials.apiKey) {
42
+ throw new Error("Missing Nexalink API key. Run `carecompass login --api-key <key>` or set CARECOMPASS_API_KEY.");
43
+ }
44
+ return credentials;
45
+ }
46
+ function readConfig(path) {
47
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
48
+ const validation = validateCareCompassConfig(parsed);
49
+ if (!validation.ok) {
50
+ throw new Error(`Invalid CareCompass config:\n${validation.errors.join("\n")}`);
51
+ }
52
+ return validation.config;
53
+ }
54
+ function buildInitConfig(flags) {
55
+ const origins = flags.origin;
56
+ const allowedOrigins = Array.isArray(origins)
57
+ ? origins
58
+ : typeof origins === "string"
59
+ ? origins.split(",").map((origin) => origin.trim())
60
+ : ["https://example-payer.com"];
61
+ return createDefaultCareCompassConfig({
62
+ payerId: flagString(flags, "payer-id") ?? "payer-demo",
63
+ environment: flagString(flags, "environment") ??
64
+ "staging",
65
+ apiBaseUrl: flagString(flags, "api-base-url") ?? "https://api.nexalink.care",
66
+ embedKey: flagString(flags, "embed-key") ?? "embed_demo_1234567890",
67
+ allowedOrigins,
68
+ branding: {
69
+ displayName: flagString(flags, "display-name") ?? "Example Health Plan",
70
+ logoUrl: flagString(flags, "logo-url"),
71
+ supportUrl: flagString(flags, "support-url") ?? "https://example-payer.com/support",
72
+ },
73
+ theme: {
74
+ primaryColor: flagString(flags, "primary-color") ?? "#2563eb",
75
+ backgroundColor: flagString(flags, "background-color") ?? "#ffffff",
76
+ textColor: flagString(flags, "text-color") ?? "#111827",
77
+ borderRadius: flagString(flags, "border-radius") ?? "8px",
78
+ fontFamily: flagString(flags, "font-family") ?? "system-ui, sans-serif",
79
+ },
80
+ deploymentTarget: flagString(flags, "deployment-target") ?? "web",
81
+ });
82
+ }
83
+ function printHelp(io) {
84
+ io.stdout.write(`CareCompass SDK CLI
85
+
86
+ Commands:
87
+ carecompass login --api-key <key>
88
+ carecompass init [--payer-id <id>] [--origin <url>]
89
+ carecompass validate --config carecompass.config.json
90
+ carecompass snippet --config carecompass.config.json [--output embed.html]
91
+ carecompass doctor --config carecompass.config.json
92
+ `);
93
+ }
94
+ export async function runCareCompassCli(argv = process.argv.slice(2), io = {
95
+ stdout: process.stdout,
96
+ stderr: process.stderr,
97
+ env: process.env,
98
+ }) {
99
+ try {
100
+ const { command, flags } = parseArgs(argv);
101
+ if (command === "help" || command === "--help" || command === "-h") {
102
+ printHelp(io);
103
+ return 0;
104
+ }
105
+ if (command === "login") {
106
+ const apiKey = flagString(flags, "api-key");
107
+ if (!apiKey) {
108
+ const signupUrl = flagString(flags, "signup-url") ?? DEFAULT_SIGNUP_URL;
109
+ io.stderr.write(`Missing --api-key. Create a Nexalink payer account or request SDK access at ${signupUrl}\n`);
110
+ return 1;
111
+ }
112
+ const credentialsPath = resolveCredentialsPath(io.env);
113
+ writeStoredApiKey(apiKey, credentialsPath);
114
+ io.stdout.write(`Stored CareCompass credentials at ${credentialsPath}\n`);
115
+ return 0;
116
+ }
117
+ if (command === "init") {
118
+ requireApiKey(flags, io);
119
+ const output = flagString(flags, "output") ?? DEFAULT_CONFIG_PATH;
120
+ if (existsSync(output) && flags.force !== true) {
121
+ throw new Error(`${output} already exists. Re-run with --force to overwrite.`);
122
+ }
123
+ const config = buildInitConfig(flags);
124
+ writeFileSync(output, `${JSON.stringify(config, null, 2)}\n`);
125
+ io.stdout.write(`Wrote ${output}\n`);
126
+ return 0;
127
+ }
128
+ if (command === "validate") {
129
+ const credentials = requireApiKey(flags, io);
130
+ const config = readConfig(flagString(flags, "config") ?? DEFAULT_CONFIG_PATH);
131
+ io.stdout.write(`CareCompass config is valid for ${config.payerId}. Credentials loaded from ${credentials.source}.\n`);
132
+ return 0;
133
+ }
134
+ if (command === "snippet") {
135
+ requireApiKey(flags, io);
136
+ const config = readConfig(flagString(flags, "config") ?? DEFAULT_CONFIG_PATH);
137
+ const snippet = generateCareCompassSnippet(config);
138
+ const output = flagString(flags, "output");
139
+ if (output) {
140
+ writeFileSync(output, `${snippet}\n`);
141
+ io.stdout.write(`Wrote ${output}\n`);
142
+ }
143
+ else {
144
+ io.stdout.write(`${snippet}\n`);
145
+ }
146
+ return 0;
147
+ }
148
+ if (command === "doctor") {
149
+ const credentials = requireApiKey(flags, io);
150
+ const config = readConfig(flagString(flags, "config") ?? DEFAULT_CONFIG_PATH);
151
+ io.stdout.write(`CareCompass SDK doctor
152
+ Package manager: npm/npx, pnpm, Yarn, and Bun compatible
153
+ Payer: ${config.payerId}
154
+ Environment: ${config.environment}
155
+ API base URL: ${config.apiBaseUrl}
156
+ Allowed origins: ${config.allowedOrigins.join(", ")}
157
+ Credentials: ${credentials.source}
158
+ Status: ready for staging verification
159
+ `);
160
+ return 0;
161
+ }
162
+ throw new Error(`Unknown command: ${command}`);
163
+ }
164
+ catch (error) {
165
+ io.stderr.write(`${error.message}\n`);
166
+ return 1;
167
+ }
168
+ }
169
+ const isMainModule = () => Boolean(process.argv[1]) &&
170
+ fileURLToPath(import.meta.url) === process.argv[1];
171
+ if (isMainModule()) {
172
+ void runCareCompassCli().then((code) => {
173
+ process.exitCode = code;
174
+ });
175
+ }
176
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { CareCompassConfig } from "./schema.js";
2
+ export type CareCompassAskRequest = {
3
+ prompt: string;
4
+ sessionId?: string;
5
+ userContext?: Record<string, unknown>;
6
+ };
7
+ export type CareCompassAskResponse = {
8
+ jobId: string;
9
+ };
10
+ export type CareCompassStatusResponse = {
11
+ status: "queued" | "running" | "complete" | "failed";
12
+ result?: string;
13
+ };
14
+ type Fetcher = typeof fetch;
15
+ export declare function createCareCompassClient(config: CareCompassConfig, options?: {
16
+ fetcher?: Fetcher;
17
+ }): {
18
+ validateConfig: () => Promise<{
19
+ ok: true;
20
+ }>;
21
+ ask: (request: CareCompassAskRequest) => Promise<CareCompassAskResponse>;
22
+ status: (jobId: string) => Promise<CareCompassStatusResponse>;
23
+ };
24
+ export {};
package/dist/client.js ADDED
@@ -0,0 +1,45 @@
1
+ const joinUrl = (baseUrl, path) => `${baseUrl.replace(/\/+$/, "")}${path}`;
2
+ export function createCareCompassClient(config, options = {}) {
3
+ const fetcher = options.fetcher ?? fetch;
4
+ const headers = {
5
+ "content-type": "application/json",
6
+ "x-carecompass-payer-id": config.payerId,
7
+ "x-carecompass-embed-key": config.embedKey,
8
+ "x-carecompass-environment": config.environment,
9
+ };
10
+ async function parseJson(response) {
11
+ const body = (await response.json().catch(() => ({})));
12
+ if (!response.ok) {
13
+ throw new Error(body.error ?? "CareCompass request failed.");
14
+ }
15
+ return body;
16
+ }
17
+ return {
18
+ validateConfig: async () => {
19
+ const response = await fetcher(joinUrl(config.apiBaseUrl, "/api/carecompass/embed/config/validate"), {
20
+ method: "POST",
21
+ headers,
22
+ body: JSON.stringify({ config }),
23
+ });
24
+ return parseJson(response);
25
+ },
26
+ ask: async (request) => {
27
+ const response = await fetcher(joinUrl(config.apiBaseUrl, "/api/carecompass/embed/ask"), {
28
+ method: "POST",
29
+ headers,
30
+ body: JSON.stringify({
31
+ prompt: request.prompt,
32
+ sessionId: request.sessionId,
33
+ userContext: request.userContext,
34
+ promptConfig: config.prompt,
35
+ }),
36
+ });
37
+ return parseJson(response);
38
+ },
39
+ status: async (jobId) => {
40
+ const response = await fetcher(joinUrl(config.apiBaseUrl, `/api/carecompass/embed/status/${encodeURIComponent(jobId)}`), { headers });
41
+ return parseJson(response);
42
+ },
43
+ };
44
+ }
45
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAmBA,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,IAAY,EAAE,EAAE,CAChD,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;AAE1C,MAAM,UAAU,uBAAuB,CACrC,MAAyB,EACzB,UAAiC,EAAE;IAEnC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IACzC,MAAM,OAAO,GAAG;QACd,cAAc,EAAE,kBAAkB;QAClC,wBAAwB,EAAE,MAAM,CAAC,OAAO;QACxC,yBAAyB,EAAE,MAAM,CAAC,QAAQ;QAC1C,2BAA2B,EAAE,MAAM,CAAC,WAAW;KAChD,CAAC;IAEF,KAAK,UAAU,SAAS,CAAI,QAAkB;QAC5C,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAEpD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,6BAA6B,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,cAAc,EAAE,KAAK,IAAI,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,wCAAwC,CAAC,EACpE;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;aACjC,CACF,CAAC;YACF,OAAO,SAAS,CAAe,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,GAAG,EAAE,KAAK,EAAE,OAA8B,EAAE,EAAE;YAC5C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,4BAA4B,CAAC,EACxD;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,YAAY,EAAE,MAAM,CAAC,MAAM;iBAC5B,CAAC;aACH,CACF,CAAC;YACF,OAAO,SAAS,CAAyB,QAAQ,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,OAAO,CACL,MAAM,CAAC,UAAU,EACjB,iCAAiC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAC7D,EACD,EAAE,OAAO,EAAE,CACZ,CAAC;YACF,OAAO,SAAS,CAA4B,QAAQ,CAAC,CAAC;QACxD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { CareCompassConfig } from "./schema.js";
2
+ export declare function CareCompassEmbed({ config, pollIntervalMs, }: {
3
+ config: CareCompassConfig;
4
+ pollIntervalMs?: number;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,122 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { createCareCompassClient } from "./client.js";
4
+ export function CareCompassEmbed({ config, pollIntervalMs = 1500, }) {
5
+ const client = React.useMemo(() => createCareCompassClient(config), [config]);
6
+ const [messages, setMessages] = React.useState([
7
+ {
8
+ id: "welcome",
9
+ role: "assistant",
10
+ text: config.prompt.welcomeMessage,
11
+ },
12
+ ]);
13
+ const [input, setInput] = React.useState("");
14
+ const [loading, setLoading] = React.useState(false);
15
+ const [error, setError] = React.useState(null);
16
+ async function sendMessage(event) {
17
+ event.preventDefault();
18
+ const prompt = input.trim();
19
+ if (!prompt || loading)
20
+ return;
21
+ setInput("");
22
+ setError(null);
23
+ setLoading(true);
24
+ setMessages((current) => [
25
+ ...current,
26
+ { id: `user-${Date.now()}`, role: "user", text: prompt },
27
+ ]);
28
+ try {
29
+ const { jobId } = await client.ask({ prompt });
30
+ const startedAt = Date.now();
31
+ while (Date.now() - startedAt < 120_000) {
32
+ const status = await client.status(jobId);
33
+ if (status.status === "complete" && status.result) {
34
+ setMessages((current) => [
35
+ ...current,
36
+ {
37
+ id: `assistant-${Date.now()}`,
38
+ role: "assistant",
39
+ text: status.result ?? "",
40
+ },
41
+ ]);
42
+ return;
43
+ }
44
+ if (status.status === "failed") {
45
+ throw new Error(status.result ?? config.labels.errorMessage);
46
+ }
47
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
48
+ }
49
+ throw new Error("CareCompass request timed out.");
50
+ }
51
+ catch (err) {
52
+ setError(err?.message ??
53
+ config.labels.errorMessage);
54
+ }
55
+ finally {
56
+ setLoading(false);
57
+ }
58
+ }
59
+ return (_jsxs("section", { "aria-label": config.labels.title, style: {
60
+ "--carecompass-primary": config.theme.primaryColor,
61
+ "--carecompass-bg": config.theme.backgroundColor,
62
+ "--carecompass-text": config.theme.textColor,
63
+ background: "var(--carecompass-bg)",
64
+ border: "1px solid color-mix(in srgb, var(--carecompass-text) 14%, transparent)",
65
+ borderRadius: config.theme.borderRadius,
66
+ color: "var(--carecompass-text)",
67
+ display: "flex",
68
+ flexDirection: "column",
69
+ fontFamily: config.theme.fontFamily,
70
+ inlineSize: "100%",
71
+ maxInlineSize: config.placement.mode === "sidebar" ? 420 : 720,
72
+ minBlockSize: 420,
73
+ overflow: "hidden",
74
+ }, children: [_jsxs("header", { style: {
75
+ alignItems: "center",
76
+ borderBottom: "1px solid color-mix(in srgb, var(--carecompass-text) 12%, transparent)",
77
+ display: "flex",
78
+ gap: 12,
79
+ padding: 16,
80
+ }, children: [config.branding.logoUrl ? (_jsx("img", { src: config.branding.logoUrl, alt: "", style: { blockSize: 32, inlineSize: 32, objectFit: "contain" } })) : null, _jsxs("div", { children: [_jsx("div", { style: { fontSize: 16, fontWeight: 700 }, children: config.labels.title }), _jsx("div", { style: { fontSize: 12, opacity: 0.72 }, children: config.branding.displayName })] })] }), _jsxs("div", { "aria-live": "polite", style: {
81
+ display: "flex",
82
+ flex: 1,
83
+ flexDirection: "column",
84
+ gap: 12,
85
+ overflowY: "auto",
86
+ padding: 16,
87
+ }, children: [messages.map((message) => (_jsx("div", { style: {
88
+ alignSelf: message.role === "user" ? "flex-end" : "flex-start",
89
+ background: message.role === "user"
90
+ ? "var(--carecompass-primary)"
91
+ : "color-mix(in srgb, var(--carecompass-text) 7%, transparent)",
92
+ borderRadius: 12,
93
+ color: message.role === "user" ? "#ffffff" : "inherit",
94
+ maxInlineSize: "82%",
95
+ padding: "10px 12px",
96
+ whiteSpace: "pre-wrap",
97
+ }, children: message.text }, message.id))), loading ? (_jsx("div", { style: { fontSize: 13, opacity: 0.72 }, children: "Thinking..." })) : null] }), _jsxs("form", { onSubmit: sendMessage, style: {
98
+ borderTop: "1px solid color-mix(in srgb, var(--carecompass-text) 12%, transparent)",
99
+ display: "flex",
100
+ flexDirection: "column",
101
+ gap: 8,
102
+ padding: 12,
103
+ }, children: [_jsxs("div", { style: { display: "flex", gap: 8 }, children: [_jsx("input", { "aria-label": config.labels.placeholder, disabled: loading, onChange: (event) => setInput(event.currentTarget.value), placeholder: config.labels.placeholder, style: {
104
+ border: "1px solid color-mix(in srgb, var(--carecompass-text) 16%, transparent)",
105
+ borderRadius: 8,
106
+ color: "inherit",
107
+ flex: 1,
108
+ font: "inherit",
109
+ minInlineSize: 0,
110
+ padding: "10px 12px",
111
+ }, value: input }), _jsx("button", { disabled: loading || !input.trim(), style: {
112
+ background: "var(--carecompass-primary)",
113
+ border: 0,
114
+ borderRadius: 8,
115
+ color: "#ffffff",
116
+ cursor: loading ? "not-allowed" : "pointer",
117
+ font: "inherit",
118
+ fontWeight: 700,
119
+ padding: "0 14px",
120
+ }, type: "submit", children: config.labels.sendButton })] }), error ? (_jsx("div", { role: "alert", style: { color: "#b91c1c", fontSize: 12 }, children: error })) : null, _jsx("div", { style: { fontSize: 11, opacity: 0.7 }, children: config.labels.disclaimer })] })] }));
121
+ }
122
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type CredentialLookup = {
2
+ apiKey: string | null;
3
+ source: "argument" | "environment" | "file" | "missing";
4
+ };
5
+ export declare function resolveCredentialsPath(env?: NodeJS.ProcessEnv): string;
6
+ export declare function normalizeApiKey(value?: string | null): string | null;
7
+ export declare function readStoredApiKey(path?: string): string | null;
8
+ export declare function writeStoredApiKey(apiKey: string, path?: string): void;
9
+ export declare function resolveApiKey(argumentApiKey?: string, env?: NodeJS.ProcessEnv, credentialsPath?: string): CredentialLookup;
@@ -0,0 +1,51 @@
1
+ import { chmodSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const API_KEY_RE = /^[A-Za-z0-9._-]{12,256}$/;
5
+ export function resolveCredentialsPath(env = process.env) {
6
+ return (env.CARECOMPASS_CREDENTIALS_PATH ??
7
+ join(homedir(), ".nexalink", "carecompass", "credentials.json"));
8
+ }
9
+ export function normalizeApiKey(value) {
10
+ const trimmed = value?.trim();
11
+ if (!trimmed)
12
+ return null;
13
+ return API_KEY_RE.test(trimmed) ? trimmed : null;
14
+ }
15
+ export function readStoredApiKey(path = resolveCredentialsPath()) {
16
+ try {
17
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
18
+ return typeof parsed.apiKey === "string"
19
+ ? normalizeApiKey(parsed.apiKey)
20
+ : null;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ export function writeStoredApiKey(apiKey, path = resolveCredentialsPath()) {
27
+ const normalized = normalizeApiKey(apiKey);
28
+ if (!normalized)
29
+ throw new Error("API key format is invalid.");
30
+ mkdirSync(dirname(path), { recursive: true });
31
+ writeFileSync(path, `${JSON.stringify({ apiKey: normalized, createdAt: new Date().toISOString() }, null, 2)}\n`, { mode: 0o600 });
32
+ try {
33
+ chmodSync(path, 0o600);
34
+ }
35
+ catch {
36
+ // Some filesystems do not support chmod; the file still avoids source output.
37
+ }
38
+ }
39
+ export function resolveApiKey(argumentApiKey, env = process.env, credentialsPath = resolveCredentialsPath(env)) {
40
+ const argKey = normalizeApiKey(argumentApiKey);
41
+ if (argKey)
42
+ return { apiKey: argKey, source: "argument" };
43
+ const envKey = normalizeApiKey(env.CARECOMPASS_API_KEY);
44
+ if (envKey)
45
+ return { apiKey: envKey, source: "environment" };
46
+ const fileKey = readStoredApiKey(credentialsPath);
47
+ if (fileKey)
48
+ return { apiKey: fileKey, source: "file" };
49
+ return { apiKey: null, source: "missing" };
50
+ }
51
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAO9C,MAAM,UAAU,sBAAsB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACzE,OAAO,CACL,GAAG,CAAC,4BAA4B;QAChC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAqB;IACnD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAI,GAAG,sBAAsB,EAAE;IAC9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAEnD,CAAC;QACF,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YACtC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,IAAI,GAAG,sBAAsB,EAAE;IAE/B,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC/D,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CACX,IAAI,EACJ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAC3F,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;IACF,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,8EAA8E;IAChF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,cAAuB,EACvB,MAAyB,OAAO,CAAC,GAAG,EACpC,eAAe,GAAG,sBAAsB,CAAC,GAAG,CAAC;IAE7C,MAAM,MAAM,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAC/C,IAAI,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAE1D,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxD,IAAI,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAE7D,MAAM,OAAO,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAClD,IAAI,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAExD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { createCareCompassClient } from "./client.js";
2
+ export type { CareCompassAskRequest, CareCompassAskResponse, CareCompassStatusResponse, } from "./client.js";
3
+ export { CareCompassEmbed } from "./component.js";
4
+ export { mountCareCompass } from "./mount.js";
5
+ export { generateCareCompassSnippet } from "./snippet.js";
6
+ export { careCompassConfigSchema, createDefaultCareCompassConfig, validateCareCompassConfig, } from "./schema.js";
7
+ export type { CareCompassConfig, CareCompassLabels, CareCompassPromptConfig, CareCompassTheme, CareCompassValidationResult, } from "./schema.js";
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { createCareCompassClient } from "./client.js";
2
+ export { CareCompassEmbed } from "./component.js";
3
+ export { mountCareCompass } from "./mount.js";
4
+ export { generateCareCompassSnippet } from "./snippet.js";
5
+ export { careCompassConfigSchema, createDefaultCareCompassConfig, validateCareCompassConfig, } from "./schema.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAMtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EACL,uBAAuB,EACvB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CareCompassConfig } from "./schema.js";
2
+ export declare function mountCareCompass(element: Element | null, config: CareCompassConfig): {
3
+ unmount: () => void;
4
+ };
package/dist/mount.js ADDED
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createRoot } from "react-dom/client";
3
+ import { CareCompassEmbed } from "./component.js";
4
+ export function mountCareCompass(element, config) {
5
+ if (!element)
6
+ throw new Error("CareCompass mount element was not found.");
7
+ const root = createRoot(element);
8
+ root.render(_jsx(CareCompassEmbed, { config: config }));
9
+ return {
10
+ unmount: () => root.unmount(),
11
+ };
12
+ }
13
+ //# sourceMappingURL=mount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../src/mount.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,MAAM,UAAU,gBAAgB,CAC9B,OAAuB,EACvB,MAAyB;IAEzB,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,KAAC,gBAAgB,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;KAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { z } from "zod";
2
+ export declare const careCompassOriginSchema: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
3
+ export declare const careCompassThemeSchema: z.ZodObject<{
4
+ primaryColor: z.ZodString;
5
+ backgroundColor: z.ZodDefault<z.ZodString>;
6
+ textColor: z.ZodDefault<z.ZodString>;
7
+ borderRadius: z.ZodDefault<z.ZodString>;
8
+ fontFamily: z.ZodDefault<z.ZodString>;
9
+ }, z.core.$strip>;
10
+ export declare const careCompassLabelsSchema: z.ZodObject<{
11
+ title: z.ZodDefault<z.ZodString>;
12
+ placeholder: z.ZodDefault<z.ZodString>;
13
+ sendButton: z.ZodDefault<z.ZodString>;
14
+ disclaimer: z.ZodDefault<z.ZodString>;
15
+ errorMessage: z.ZodDefault<z.ZodString>;
16
+ }, z.core.$strip>;
17
+ export declare const careCompassPromptConfigSchema: z.ZodObject<{
18
+ systemInstruction: z.ZodOptional<z.ZodString>;
19
+ welcomeMessage: z.ZodDefault<z.ZodString>;
20
+ allowUserContext: z.ZodDefault<z.ZodBoolean>;
21
+ }, z.core.$strip>;
22
+ export declare const careCompassBrandingSchema: z.ZodObject<{
23
+ displayName: z.ZodString;
24
+ logoUrl: z.ZodOptional<z.ZodString>;
25
+ supportUrl: z.ZodOptional<z.ZodString>;
26
+ }, z.core.$strip>;
27
+ export declare const careCompassPlacementSchema: z.ZodObject<{
28
+ mode: z.ZodDefault<z.ZodEnum<{
29
+ inline: "inline";
30
+ floating: "floating";
31
+ sidebar: "sidebar";
32
+ }>>;
33
+ selector: z.ZodOptional<z.ZodString>;
34
+ }, z.core.$strip>;
35
+ export declare const careCompassConfigSchema: z.ZodObject<{
36
+ payerId: z.ZodString;
37
+ environment: z.ZodEnum<{
38
+ development: "development";
39
+ staging: "staging";
40
+ production: "production";
41
+ }>;
42
+ apiBaseUrl: z.ZodString;
43
+ embedKey: z.ZodString;
44
+ allowedOrigins: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
45
+ branding: z.ZodObject<{
46
+ displayName: z.ZodString;
47
+ logoUrl: z.ZodOptional<z.ZodString>;
48
+ supportUrl: z.ZodOptional<z.ZodString>;
49
+ }, z.core.$strip>;
50
+ theme: z.ZodObject<{
51
+ primaryColor: z.ZodString;
52
+ backgroundColor: z.ZodDefault<z.ZodString>;
53
+ textColor: z.ZodDefault<z.ZodString>;
54
+ borderRadius: z.ZodDefault<z.ZodString>;
55
+ fontFamily: z.ZodDefault<z.ZodString>;
56
+ }, z.core.$strip>;
57
+ labels: z.ZodDefault<z.ZodObject<{
58
+ title: z.ZodDefault<z.ZodString>;
59
+ placeholder: z.ZodDefault<z.ZodString>;
60
+ sendButton: z.ZodDefault<z.ZodString>;
61
+ disclaimer: z.ZodDefault<z.ZodString>;
62
+ errorMessage: z.ZodDefault<z.ZodString>;
63
+ }, z.core.$strip>>;
64
+ prompt: z.ZodDefault<z.ZodObject<{
65
+ systemInstruction: z.ZodOptional<z.ZodString>;
66
+ welcomeMessage: z.ZodDefault<z.ZodString>;
67
+ allowUserContext: z.ZodDefault<z.ZodBoolean>;
68
+ }, z.core.$strip>>;
69
+ placement: z.ZodDefault<z.ZodObject<{
70
+ mode: z.ZodDefault<z.ZodEnum<{
71
+ inline: "inline";
72
+ floating: "floating";
73
+ sidebar: "sidebar";
74
+ }>>;
75
+ selector: z.ZodOptional<z.ZodString>;
76
+ }, z.core.$strip>>;
77
+ deploymentTarget: z.ZodDefault<z.ZodEnum<{
78
+ react: "react";
79
+ nextjs: "nextjs";
80
+ static: "static";
81
+ web: "web";
82
+ other: "other";
83
+ }>>;
84
+ }, z.core.$strip>;
85
+ export type CareCompassTheme = z.infer<typeof careCompassThemeSchema>;
86
+ export type CareCompassLabels = z.infer<typeof careCompassLabelsSchema>;
87
+ export type CareCompassPromptConfig = z.infer<typeof careCompassPromptConfigSchema>;
88
+ export type CareCompassConfig = z.infer<typeof careCompassConfigSchema>;
89
+ export type CareCompassValidationResult = {
90
+ ok: true;
91
+ config: CareCompassConfig;
92
+ } | {
93
+ ok: false;
94
+ errors: string[];
95
+ };
96
+ export declare function validateCareCompassConfig(value: unknown): CareCompassValidationResult;
97
+ export declare function createDefaultCareCompassConfig(overrides?: Partial<CareCompassConfig>): CareCompassConfig;
package/dist/schema.js ADDED
@@ -0,0 +1,144 @@
1
+ import { z } from "zod";
2
+ const HEX_COLOR_RE = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
3
+ const PAYER_ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{2,63}$/;
4
+ const EMBED_KEY_RE = /^[A-Za-z0-9._-]{16,128}$/;
5
+ const unsafePromptPatterns = [
6
+ /ignore (all )?(previous|prior) (instructions|rules)/i,
7
+ /bypass (safety|guardrails|compliance)/i,
8
+ /disable (safety|guardrails|compliance)/i,
9
+ /provide (a )?(diagnosis|treatment plan)/i,
10
+ /return raw (phi|credentials|tokens|secrets)/i,
11
+ ];
12
+ export const careCompassOriginSchema = z
13
+ .string()
14
+ .url("Allowed origins must be valid URLs.")
15
+ .transform((value) => new URL(value).origin)
16
+ .refine((value) => {
17
+ const parsed = new URL(value);
18
+ return parsed.protocol === "https:" || parsed.hostname === "localhost";
19
+ }, "Allowed origins must use HTTPS, except localhost for development.");
20
+ export const careCompassThemeSchema = z.object({
21
+ primaryColor: z.string().regex(HEX_COLOR_RE, "Use a hex color like #2563eb."),
22
+ backgroundColor: z
23
+ .string()
24
+ .regex(HEX_COLOR_RE, "Use a hex color like #ffffff.")
25
+ .default("#ffffff"),
26
+ textColor: z
27
+ .string()
28
+ .regex(HEX_COLOR_RE, "Use a hex color like #111827.")
29
+ .default("#111827"),
30
+ borderRadius: z
31
+ .string()
32
+ .regex(/^\d+(?:\.\d+)?(?:px|rem)$/, "Border radius must be a px or rem value.")
33
+ .default("8px"),
34
+ fontFamily: z.string().min(1).max(160).default("system-ui, sans-serif"),
35
+ });
36
+ export const careCompassLabelsSchema = z.object({
37
+ title: z.string().min(1).max(80).default("CareCompass"),
38
+ placeholder: z.string().min(1).max(120).default("Message CareCompass..."),
39
+ sendButton: z.string().min(1).max(40).default("Send"),
40
+ disclaimer: z
41
+ .string()
42
+ .min(1)
43
+ .max(240)
44
+ .default("CareCompass provides navigation support, not medical advice."),
45
+ errorMessage: z
46
+ .string()
47
+ .min(1)
48
+ .max(160)
49
+ .default("CareCompass is unavailable right now."),
50
+ });
51
+ export const careCompassPromptConfigSchema = z
52
+ .object({
53
+ systemInstruction: z.string().min(20).max(4000).optional(),
54
+ welcomeMessage: z
55
+ .string()
56
+ .min(1)
57
+ .max(300)
58
+ .default("How can I help you navigate your care today?"),
59
+ allowUserContext: z.boolean().default(false),
60
+ })
61
+ .superRefine((value, ctx) => {
62
+ const instruction = value.systemInstruction ?? "";
63
+ const matchedPattern = unsafePromptPatterns.find((pattern) => pattern.test(instruction));
64
+ if (matchedPattern) {
65
+ ctx.addIssue({
66
+ code: "custom",
67
+ path: ["systemInstruction"],
68
+ message: "Prompt configuration conflicts with Nexalink safety guardrails.",
69
+ });
70
+ }
71
+ });
72
+ export const careCompassBrandingSchema = z.object({
73
+ displayName: z.string().min(1).max(80),
74
+ logoUrl: z.string().url().optional(),
75
+ supportUrl: z.string().url().optional(),
76
+ });
77
+ export const careCompassPlacementSchema = z.object({
78
+ mode: z.enum(["inline", "floating", "sidebar"]).default("inline"),
79
+ selector: z.string().min(1).max(120).optional(),
80
+ });
81
+ export const careCompassConfigSchema = z.object({
82
+ payerId: z.string().regex(PAYER_ID_RE, "Invalid payer ID."),
83
+ environment: z.enum(["development", "staging", "production"]),
84
+ apiBaseUrl: z.string().url("API base URL must be a valid URL."),
85
+ embedKey: z.string().regex(EMBED_KEY_RE, "Invalid public embed key."),
86
+ allowedOrigins: z
87
+ .array(careCompassOriginSchema)
88
+ .min(1, "At least one allowed origin is required."),
89
+ branding: careCompassBrandingSchema,
90
+ theme: careCompassThemeSchema,
91
+ labels: careCompassLabelsSchema.default({
92
+ title: "CareCompass",
93
+ placeholder: "Message CareCompass...",
94
+ sendButton: "Send",
95
+ disclaimer: "CareCompass provides navigation support, not medical advice.",
96
+ errorMessage: "CareCompass is unavailable right now.",
97
+ }),
98
+ prompt: careCompassPromptConfigSchema.default({
99
+ welcomeMessage: "How can I help you navigate your care today?",
100
+ allowUserContext: false,
101
+ }),
102
+ placement: careCompassPlacementSchema.default({ mode: "inline" }),
103
+ deploymentTarget: z
104
+ .enum(["react", "nextjs", "static", "web", "other"])
105
+ .default("web"),
106
+ });
107
+ export function validateCareCompassConfig(value) {
108
+ const result = careCompassConfigSchema.safeParse(value);
109
+ if (result.success)
110
+ return { ok: true, config: result.data };
111
+ return {
112
+ ok: false,
113
+ errors: result.error.issues.map((issue) => {
114
+ const path = issue.path.length ? `${issue.path.join(".")}: ` : "";
115
+ return `${path}${issue.message}`;
116
+ }),
117
+ };
118
+ }
119
+ export function createDefaultCareCompassConfig(overrides = {}) {
120
+ return careCompassConfigSchema.parse({
121
+ payerId: "payer-demo",
122
+ environment: "staging",
123
+ apiBaseUrl: "https://api.nexalink.care",
124
+ embedKey: "embed_demo_1234567890",
125
+ allowedOrigins: ["https://example-payer.com"],
126
+ branding: {
127
+ displayName: "Example Health Plan",
128
+ supportUrl: "https://example-payer.com/support",
129
+ },
130
+ theme: {
131
+ primaryColor: "#2563eb",
132
+ backgroundColor: "#ffffff",
133
+ textColor: "#111827",
134
+ borderRadius: "8px",
135
+ fontFamily: "system-ui, sans-serif",
136
+ },
137
+ labels: {},
138
+ prompt: {},
139
+ placement: {},
140
+ deploymentTarget: "web",
141
+ ...overrides,
142
+ });
143
+ }
144
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { CareCompassConfig } from "./schema.js";
2
+ export declare function generateCareCompassSnippet(config: CareCompassConfig): string;
@@ -0,0 +1,11 @@
1
+ export function generateCareCompassSnippet(config) {
2
+ const targetId = "carecompass-root";
3
+ return `<div id="${targetId}"></div>
4
+ <script type="module">
5
+ import { mountCareCompass } from "@nexalink/carecompass-sdk";
6
+
7
+ const config = ${JSON.stringify(config, null, 2)};
8
+ mountCareCompass(document.getElementById("${targetId}"), config);
9
+ </script>`;
10
+ }
11
+ //# sourceMappingURL=snippet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippet.js","sourceRoot":"","sources":["../src/snippet.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,0BAA0B,CAAC,MAAyB;IAClE,MAAM,QAAQ,GAAG,kBAAkB,CAAC;IACpC,OAAO,YAAY,QAAQ;;;;mBAIV,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;8CACJ,QAAQ;UAC5C,CAAC;AACX,CAAC"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@nexalink/carecompass-sdk",
3
+ "version": "0.1.0-beta.0",
4
+ "description": "Embeddable CareCompass SDK and CLI for payer-whitelabeled deployments.",
5
+ "type": "module",
6
+ "bin": {
7
+ "carecompass": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ },
16
+ "./cli": {
17
+ "types": "./dist/cli.d.ts",
18
+ "import": "./dist/cli.js"
19
+ },
20
+ "./schema": {
21
+ "types": "./dist/schema.d.ts",
22
+ "import": "./dist/schema.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "README.md"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsc -p tsconfig.json"
31
+ },
32
+ "dependencies": {
33
+ "zod": "^4.4.3"
34
+ },
35
+ "peerDependencies": {
36
+ "react": "^18.3.0 || ^19.0.0",
37
+ "react-dom": "^18.3.0 || ^19.0.0"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^24.12.4",
41
+ "@types/react": "^19.2.15",
42
+ "@types/react-dom": "^19.2.3",
43
+ "typescript": "^5.9.3"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "license": "UNLICENSED"
49
+ }