@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 +3 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +176 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +24 -0
- package/dist/client.js +45 -0
- package/dist/client.js.map +1 -0
- package/dist/component.d.ts +5 -0
- package/dist/component.js +122 -0
- package/dist/component.js.map +1 -0
- package/dist/credentials.d.ts +9 -0
- package/dist/credentials.js +51 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/mount.d.ts +4 -0
- package/dist/mount.js +13 -0
- package/dist/mount.js.map +1 -0
- package/dist/schema.d.ts +97 -0
- package/dist/schema.js +144 -0
- package/dist/schema.js.map +1 -0
- package/dist/snippet.d.ts +2 -0
- package/dist/snippet.js +11 -0
- package/dist/snippet.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
package/dist/cli.d.ts
ADDED
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -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,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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/mount.d.ts
ADDED
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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -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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"}
|
package/dist/snippet.js
ADDED
|
@@ -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
|
+
}
|