@clinia/context-engine-js 0.7.0 → 0.9.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.
@@ -15,19 +15,25 @@ export type IngestionIntake = components["schemas"]["IngestionIntake"];
15
15
  export type IngestionItemOutcome = components["schemas"]["IngestionItemOutcome"];
16
16
  export type IngestionIgnoreReason = components["schemas"]["IngestionIgnoreReason"];
17
17
  export type IngestFhirBody = components["schemas"]["IngestFhirBody"];
18
+ export type IngestSessionsBody = components["schemas"]["IngestSessionsBody"];
19
+ export type IngestSession = components["schemas"]["IngestSession"];
20
+ export type IngestSessionsMessage = components["schemas"]["IngestSessionsMessage"];
18
21
  export type IngestionList = components["schemas"]["IngestionList"];
19
22
  export type Session = components["schemas"]["Session"];
20
23
  export type AppendMessagesBody = components["schemas"]["AppendMessagesBody"];
21
24
  export type SessionMemoryList = components["schemas"]["SessionMemoryList"];
22
25
  export type SessionMemory = components["schemas"]["SessionMemory"];
23
- export type IngestSessionBody = components["schemas"]["IngestSessionBody"];
24
26
  export type BrowseResult = components["schemas"]["BrowseResult"];
25
27
  export type ReadResponse = components["schemas"]["ReadResponse"];
26
28
  export type Node = components["schemas"]["Node"];
27
29
  export type ExtractedFactNode = components["schemas"]["ExtractedFactNode"];
30
+ export type MedicationRouteDecision = components["schemas"]["MedicationRouteDecision"];
31
+ export type MedicationRoute = components["schemas"]["MedicationRoute"];
32
+ export type MedicationRouteEvidence = components["schemas"]["MedicationRouteEvidence"];
28
33
  export type FactNode = components["schemas"]["FactNode"];
29
34
  export type FactConflicts = components["schemas"]["FactConflicts"];
30
35
  export type ScoredFactMember = components["schemas"]["ScoredFactMember"];
36
+ export type MedicationIdentity = components["schemas"]["MedicationIdentity"];
31
37
  export type ExtractedNarrativeNode = components["schemas"]["ExtractedNarrativeNode"];
32
38
  export type NarrativePassageNode = components["schemas"]["NarrativePassageNode"];
33
39
  export type NarrativeNode = components["schemas"]["NarrativeNode"];
package/dist/index.js CHANGED
@@ -258,6 +258,17 @@ var IngestResource = class {
258
258
  bodySerializer: (b) => toFormData(b)
259
259
  });
260
260
  }
261
+ /**
262
+ * Technical preview.
263
+ *
264
+ * @experimental
265
+ */
266
+ ingestSessions(patientId, body) {
267
+ return this.#http.POST("/v1/patients/{patientId}/ingestions/sessions", {
268
+ params: { path: { patientId } },
269
+ body
270
+ });
271
+ }
261
272
  };
262
273
 
263
274
  // src/resources/sessions.ts
@@ -274,6 +285,9 @@ var SessionsResource = class {
274
285
  }
275
286
  });
276
287
  }
288
+ /**
289
+ * @deprecated This endpoint will be removed in a future release.
290
+ */
277
291
  createSession(patientId) {
278
292
  return this.#http.POST("/v1/patients/{patientId}/sessions", {
279
293
  params: { path: { patientId } }
@@ -284,28 +298,31 @@ var SessionsResource = class {
284
298
  params: { path: { patientId, sessionId } }
285
299
  });
286
300
  }
301
+ /**
302
+ * @deprecated This endpoint will be removed in a future release.
303
+ */
287
304
  upsertSession(patientId, sessionId) {
288
305
  return this.#http.PUT("/v1/patients/{patientId}/sessions/{sessionId}", {
289
306
  params: { path: { patientId, sessionId } }
290
307
  });
291
308
  }
309
+ /**
310
+ * @deprecated This endpoint will be removed in a future release.
311
+ */
292
312
  appendMessages(patientId, sessionId, body) {
293
313
  return this.#http.POST("/v1/patients/{patientId}/sessions/{sessionId}/messages", {
294
314
  params: { path: { patientId, sessionId } },
295
315
  body
296
316
  });
297
317
  }
318
+ /**
319
+ * @deprecated This endpoint will be removed in a future release.
320
+ */
298
321
  generateMemories(patientId, sessionId) {
299
322
  return this.#http.POST("/v1/patients/{patientId}/sessions/{sessionId}/memories", {
300
323
  params: { path: { patientId, sessionId } }
301
324
  });
302
325
  }
303
- ingestSession(patientId, body) {
304
- return this.#http.POST("/v1/patients/{patientId}/sessions/ingest", {
305
- params: { path: { patientId } },
306
- body
307
- });
308
- }
309
326
  };
310
327
 
311
328
  // src/resources/vfs.ts
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth.ts","../src/http-client.ts","../src/resources/info.ts","../src/resources/patients.ts","../src/form-data.ts","../src/resources/ingest.ts","../src/resources/sessions.ts","../src/resources/vfs.ts","../src/resources/graph.ts","../src/resources/index.ts","../src/context-engine-client.ts"],"sourcesContent":["import * as oauth from \"oauth4webapi\";\n\n/**\n * OAuth2 client-credentials helpers for authenticating against a secured\n * Context Engine workspace.\n *\n * The server validates a bearer JWT in the `Authorization` header against a\n * JWKS. This module provides the client half: a token provider that exchanges\n * a `client_id`/`client_secret` for an access token, caches it, and refreshes\n * it before expiry. The token exchange itself is delegated to `oauth4webapi`\n * (standards-compliant request building + response validation); this module\n * only adds caching, concurrent-request de-duplication, and a small config\n * surface. Pass the raw config as {@link HttpClientOptions.auth}, or — for full\n * control — pass the returned provider as the {@link HttpClientOptions.auth}\n * token function.\n */\n\n/**\n * Resolves to a currently-valid bearer access token. Called per request; a\n * well-behaved provider caches internally and only hits the network when the\n * cached token is missing or about to expire.\n */\nexport type TokenProvider = () => Promise<string>;\n\n/**\n * Clinia's authorization server, applied when a config names neither a\n * `tokenUrl` nor an `issuer` — so `{ clientId, clientSecret }` is a complete\n * config for a Clinia workspace, which is the overwhelmingly common case.\n *\n * `RESOURCE` is only defaulted alongside `TOKEN_URL`: it is an RFC 8707\n * indicator naming Clinia's protected resource, and sending it to somebody\n * else's authorization server would be wrong.\n */\nconst CLINIA_OAUTH_TOKEN_URL = \"https://console.clinia.cloud/api/auth/oauth2/token\";\nconst CLINIA_OAUTH_RESOURCE = \"https://console.clinia.cloud\";\n\n/** Fields common to both ways of locating the authorization server. */\ntype ClientCredentialsBase = {\n clientId: string;\n clientSecret: string;\n /**\n * Optional `resource` indicator (RFC 8707) naming the protected resource the\n * token is for. This is what the Clinia authorization server expects (e.g.\n * `https://console.clinia.cloud`).\n */\n resource?: string;\n /** Optional `audience` parameter (used by some IdPs, e.g. Auth0). */\n audience?: string;\n /** Optional space-delimited `scope`. */\n scope?: string;\n /**\n * How the client credentials are presented to the token endpoint. `post`\n * (the default) sends them in the request body — what the Clinia\n * authorization server expects; `basic` sends them in the `Authorization`\n * header (RFC 6749 §2.3.1) for IdPs that require it.\n */\n authMethod?: \"basic\" | \"post\";\n /**\n * Custom fetch implementation. Defaults to `globalThis.fetch`. Useful for\n * injecting a mock in tests.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * Refresh the token this many milliseconds before it actually expires, to\n * avoid handing out a token that expires mid-flight. Defaults to 60_000.\n */\n expiryMarginMs?: number;\n};\n\n/**\n * Client-credentials configuration.\n *\n * For a Clinia workspace, `{ clientId, clientSecret }` is enough — the token\n * endpoint and `resource` indicator default to Clinia's authorization server.\n * Naming an {@link issuer} instead locates a different authorization server by\n * OIDC/OAuth2 discovery; naming a {@link tokenUrl} points at one explicitly.\n */\nexport type ClientCredentialsConfig =\n | (ClientCredentialsBase & {\n /**\n * Issuer identifier of the authorization server. Its metadata (token\n * endpoint, etc.) is resolved via discovery on first use.\n */\n issuer: string;\n /** Discovery transformation: `oidc` (default) or `oauth2` (RFC 8414). */\n discoveryAlgorithm?: \"oidc\" | \"oauth2\";\n tokenUrl?: never;\n })\n | (ClientCredentialsBase & {\n /**\n * Explicit OAuth2 token endpoint; discovery is skipped. Omit it — along\n * with `issuer` — to use Clinia's.\n */\n tokenUrl?: string;\n /** Issuer identifier for response validation; defaults to the token URL's origin. */\n issuer?: string;\n discoveryAlgorithm?: never;\n });\n\nconst DEFAULT_EXPIRY_MARGIN_MS = 60_000;\n/** Fallback lifetime when the token endpoint omits `expires_in`. */\nconst DEFAULT_TTL_MS = 5 * 60_000;\n\n/** Turns an `oauth4webapi` failure into a concise, stable error message. */\nfunction describeOAuthError(err: unknown): string {\n if (err instanceof oauth.ResponseBodyError) {\n return `${err.status} ${err.error}${err.error_description ? ` — ${err.error_description}` : \"\"}`;\n }\n if (err instanceof oauth.WWWAuthenticateChallengeError) {\n return `${err.status} ${err.message}`;\n }\n return err instanceof Error ? err.message : String(err);\n}\n\n/**\n * Builds a {@link TokenProvider} backed by the OAuth2 client-credentials grant.\n *\n * The provider caches the access token and reuses it until it is within\n * `expiryMarginMs` of expiry. Concurrent calls while a fetch is in flight share\n * the same request rather than each hitting the token endpoint. When configured\n * with an {@link ClientCredentialsConfig.issuer}, the authorization server\n * metadata is discovered once and memoized.\n */\nexport function createClientCredentialsTokenProvider(\n config: ClientCredentialsConfig,\n): TokenProvider {\n const expiryMarginMs = config.expiryMarginMs ?? DEFAULT_EXPIRY_MARGIN_MS;\n\n // Defaulted only when the token endpoint is also defaulted. `resource` names\n // Clinia's protected resource, so attaching it to a request aimed at somebody\n // else's authorization server would be both wrong and a small disclosure.\n const usesCliniaAuthServer = !config.tokenUrl && !config.issuer;\n const resource = config.resource ?? (usesCliniaAuthServer ? CLINIA_OAUTH_RESOURCE : undefined);\n\n const client: oauth.Client = { client_id: config.clientId };\n const clientAuth =\n config.authMethod === \"basic\"\n ? oauth.ClientSecretBasic(config.clientSecret)\n : oauth.ClientSecretPost(config.clientSecret);\n\n // Shared HTTP options (custom fetch + insecure opt-in) applied to every\n // oauth4webapi call. The `as never` bridges the customFetch signature, which\n // is generic over method/body per call site but is the same fn at runtime.\n // oauth4webapi rejects non-TLS endpoints by default; we relax that per call\n // when — and only when — the target URL is itself `http://` (local dev),\n // rather than exposing a separate flag.\n const fetchImpl = config.fetch;\n const isInsecure = (url: string | undefined): boolean =>\n !!url && new URL(url).protocol === \"http:\";\n function withHttpOptions<T extends object>(opts: T, insecure: boolean): T {\n const o = opts as T & {\n [oauth.customFetch]?: unknown;\n [oauth.allowInsecureRequests]?: boolean;\n };\n if (fetchImpl) {\n o[oauth.customFetch] = ((url: string, options: RequestInit) =>\n fetchImpl(url, options)) as never;\n }\n if (insecure) o[oauth.allowInsecureRequests] = true;\n return o;\n }\n\n // Authorization server metadata, resolved once. For an explicit tokenUrl it's\n // synchronous; for an issuer it requires a discovery request, so it's async\n // and memoized (with retry on failure — a rejected attempt isn't cached).\n let resolvedAs: oauth.AuthorizationServer | null = null;\n let asInFlight: Promise<oauth.AuthorizationServer> | null = null;\n\n async function resolveAuthServer(): Promise<oauth.AuthorizationServer> {\n // Discovery only when an issuer is named and no explicit endpoint overrides\n // it. There is no \"neither given\" case left to handle — that is the Clinia\n // default, which is why this no longer throws.\n if (!config.issuer || config.tokenUrl) {\n const tokenUrl = config.tokenUrl ?? CLINIA_OAUTH_TOKEN_URL;\n return {\n issuer: config.issuer ?? new URL(tokenUrl).origin,\n token_endpoint: tokenUrl,\n };\n }\n const issuerUrl = new URL(config.issuer);\n const response = await oauth.discoveryRequest(\n issuerUrl,\n withHttpOptions<oauth.DiscoveryRequestOptions>(\n { algorithm: config.discoveryAlgorithm ?? \"oidc\" },\n isInsecure(config.issuer),\n ),\n );\n return oauth.processDiscoveryResponse(issuerUrl, response);\n }\n\n function getAuthServer(): Promise<oauth.AuthorizationServer> {\n if (resolvedAs) return Promise.resolve(resolvedAs);\n if (!asInFlight) {\n asInFlight = resolveAuthServer()\n .then((as) => (resolvedAs = as))\n .finally(() => {\n asInFlight = null;\n });\n }\n return asInFlight;\n }\n\n let cachedToken: string | null = null;\n /** Absolute epoch ms at which the cached token should be considered stale. */\n let expiresAt = 0;\n /** In-flight fetch, shared across concurrent callers to dedupe requests. */\n let inFlight: Promise<string> | null = null;\n\n async function fetchToken(): Promise<string> {\n const params = new URLSearchParams();\n if (resource) params.set(\"resource\", resource);\n if (config.audience) params.set(\"audience\", config.audience);\n if (config.scope) params.set(\"scope\", config.scope);\n\n let result: oauth.TokenEndpointResponse;\n try {\n const as = await getAuthServer();\n const response = await oauth.clientCredentialsGrantRequest(\n as,\n client,\n clientAuth,\n params,\n withHttpOptions<oauth.ClientCredentialsGrantRequestOptions>(\n {},\n isInsecure(as.token_endpoint),\n ),\n );\n result = await oauth.processClientCredentialsResponse(as, client, response);\n } catch (err) {\n throw new Error(`client_credentials token request failed: ${describeOAuthError(err)}`, {\n cause: err,\n });\n }\n\n const ttlMs = result.expires_in ? result.expires_in * 1000 : DEFAULT_TTL_MS;\n cachedToken = result.access_token;\n expiresAt = Date.now() + Math.max(0, ttlMs - expiryMarginMs);\n return cachedToken;\n }\n\n return async function getAccessToken(): Promise<string> {\n if (cachedToken && Date.now() < expiresAt) return cachedToken;\n if (inFlight) return inFlight;\n\n inFlight = fetchToken().finally(() => {\n inFlight = null;\n });\n return inFlight;\n };\n}\n","import createFetchClient, { type Client, type Middleware } from \"openapi-fetch\";\n\nimport { createClientCredentialsTokenProvider, type ClientCredentialsConfig } from \"./auth\";\nimport type { paths } from \"./generated/context-engine\";\n\nexport type HttpClientOptions = {\n baseUrl: string;\n /**\n * Custom fetch implementation. Defaults to `globalThis.fetch`.\n * Works in Node 20+ and all modern browsers out of the box.\n * Useful for injecting a mock or a custom fetch in tests.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * How to authenticate against a secured Context Engine server. Accepts either\n * shape:\n *\n * - A {@link ClientCredentialsConfig} — the common case. Pass just your OAuth2\n * client credentials and the client sets up token acquisition, caching, and\n * refresh for you.\n * - A token function `() => string | Promise<string>` — the escape hatch for\n * full control (a token from elsewhere, a different grant, or a custom\n * refresh strategy). Called per request, so a provider can cache and refresh\n * internally (e.g. {@link createClientCredentialsTokenProvider}); a falsy\n * return value leaves the header unset.\n *\n * Either way the resolved token is attached as `Authorization: Bearer <token>`\n * on every request. Omit for an unsecured server.\n */\n auth?: ClientCredentialsConfig | (() => string | Promise<string>);\n};\n\nexport class HttpClient {\n readonly #client: Client<paths>;\n\n constructor(options: HttpClientOptions) {\n this.#client = createFetchClient<paths>({\n baseUrl: options.baseUrl,\n fetch: options.fetch,\n });\n\n // A token function is used as-is; a config object builds a client-credentials\n // provider. The custom `fetch` is threaded into the token exchange too so\n // tests/proxies apply to both hops.\n const getAccessToken =\n typeof options.auth === \"function\"\n ? options.auth\n : options.auth\n ? createClientCredentialsTokenProvider({ fetch: options.fetch, ...options.auth })\n : undefined;\n\n if (getAccessToken) {\n const authMiddleware: Middleware = {\n async onRequest({ request }) {\n const token = await getAccessToken();\n if (token) request.headers.set(\"Authorization\", `Bearer ${token}`);\n return request;\n },\n };\n this.#client.use(authMiddleware);\n }\n }\n\n get GET(): Client<paths>[\"GET\"] {\n return this.#client.GET;\n }\n\n get POST(): Client<paths>[\"POST\"] {\n return this.#client.POST;\n }\n\n get PUT(): Client<paths>[\"PUT\"] {\n return this.#client.PUT;\n }\n\n get PATCH(): Client<paths>[\"PATCH\"] {\n return this.#client.PATCH;\n }\n\n get DELETE(): Client<paths>[\"DELETE\"] {\n return this.#client.DELETE;\n }\n\n use(...middleware: Middleware[]): this {\n this.#client.use(...middleware);\n return this;\n }\n\n eject(...middleware: Middleware[]): this {\n this.#client.eject(...middleware);\n return this;\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Re-generate by running: pnpm generate\n\nimport type { HttpClient } from \"../http-client\";\n\nexport class InfoResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n getServiceInfo() {\n return this.#http.GET(\"/\", undefined);\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Re-generate by running: pnpm generate\n\nimport type { HttpClient } from \"../http-client\";\n\nexport class PatientsResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n listPatients(params?: { query?: { page?: number; perPage?: number } }) {\n return this.#http.GET(\"/v1/patients\", params ? { params } : undefined);\n }\n\n getPatient(patientId: string) {\n return this.#http.GET(\"/v1/patients/{patientId}\", { params: { path: { patientId } } });\n }\n\n /**\n * @deprecated This endpoint will be removed in a future release.\n */\n getResolution(patientId: string, params?: { query?: { page?: number; perPage?: number } }) {\n return this.#http.GET(\"/v1/patients/{patientId}/resolution\", {\n params: {\n path: { patientId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n /**\n * @deprecated This endpoint will be removed in a future release.\n */\n getReconciliation(patientId: string, params?: { query?: { format?: \"json\" | \"markdown\" } }) {\n return this.#http.GET(\"/v1/patients/{patientId}/reconciliation\", {\n params: {\n path: { patientId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n deletePatient(patientId: string) {\n return this.#http.DELETE(\"/v1/patients/{patientId}\", { params: { path: { patientId } } });\n }\n\n upsertPatient(patientId: string) {\n return this.#http.PUT(\"/v1/patients/{patientId}\", { params: { path: { patientId } } });\n }\n}\n","/**\n * A `multipart/form-data` request body, built from the object form of the schema.\n *\n * An array-valued field becomes one part per item under the same field name — how a schema\n * declaring an array of items is sent — and every other field becomes a single part. A field\n * left `undefined` or `null` is omitted rather than sent as the string `\"undefined\"` or `\"null\"`.\n *\n * Values are appended as given, so a string is sent as text and a `Blob` or `File` keeps the\n * filename and content type it was created with.\n *\n * No `Content-Type` is set anywhere: the header carries the multipart boundary, which only\n * the runtime sending the request can know.\n */\nexport function toFormData(body: unknown): FormData {\n const form = new FormData();\n if (body === null || typeof body !== \"object\") return form;\n\n for (const [field, value] of Object.entries(body)) {\n if (value === undefined || value === null) continue;\n for (const part of Array.isArray(value) ? value : [value]) {\n form.append(field, part as string | Blob);\n }\n }\n return form;\n}\n","// This file is auto-generated. Do not edit manually.\n// Re-generate by running: pnpm generate\n\nimport type { HttpClient } from \"../http-client\";\nimport { toFormData } from \"../form-data\";\nimport type { operations } from \"../generated/context-engine\";\nimport type { IngestFhirBody } from \"../generated/types\";\n\nexport class IngestResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n listIngestions(\n patientId: string,\n params?: {\n query?: {\n page?: number;\n perPage?: number;\n sort?: \"receivedAt\";\n order?: \"asc\" | \"desc\";\n status?: (\"pending\" | \"processing\" | \"succeeded\" | \"partial\" | \"failed\")[];\n };\n },\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/ingestions\", {\n params: {\n path: { patientId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n getIngestion(patientId: string, ingestionId: string) {\n return this.#http.GET(\"/v1/patients/{patientId}/ingestions/{ingestionId}\", {\n params: { path: { patientId, ingestionId } },\n });\n }\n\n ingestFhirR4(patientId: string, body: IngestFhirBody) {\n return this.#http.POST(\"/v1/patients/{patientId}/ingestions/fhir/r4\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n ingestFhirR5(patientId: string, body: IngestFhirBody) {\n return this.#http.POST(\"/v1/patients/{patientId}/ingestions/fhir/r5\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n ingestCdaR2(\n patientId: string,\n body: NonNullable<operations[\"ingest-cda-r2\"][\"requestBody\"]>[\"content\"][\"application/cda+xml\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/ingestions/cda/r2\", {\n params: { path: { patientId } },\n body,\n bodySerializer: (b: unknown) => (typeof b === \"string\" ? b : JSON.stringify(b)),\n headers: { \"Content-Type\": \"application/cda+xml\" },\n });\n }\n\n ingestCdaR2Multipart(\n patientId: string,\n body: NonNullable<operations[\"ingest-cda-r2\"][\"requestBody\"]>[\"content\"][\"multipart/form-data\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/ingestions/cda/r2\", {\n params: { path: { patientId } },\n body,\n bodySerializer: (b: unknown) => toFormData(b),\n });\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Re-generate by running: pnpm generate\n\nimport type { HttpClient } from \"../http-client\";\nimport type { AppendMessagesBody, IngestSessionBody } from \"../generated/types\";\n\nexport class SessionsResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n listSessionMemories(\n patientId: string,\n sessionId: string,\n params?: {\n query?: { page?: number; perPage?: number; sort?: \"createdAt\"; order?: \"asc\" | \"desc\" };\n },\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/sessions/{sessionId}/memories\", {\n params: {\n path: { patientId, sessionId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n createSession(patientId: string) {\n return this.#http.POST(\"/v1/patients/{patientId}/sessions\", {\n params: { path: { patientId } },\n });\n }\n\n getSession(patientId: string, sessionId: string) {\n return this.#http.GET(\"/v1/patients/{patientId}/sessions/{sessionId}\", {\n params: { path: { patientId, sessionId } },\n });\n }\n\n upsertSession(patientId: string, sessionId: string) {\n return this.#http.PUT(\"/v1/patients/{patientId}/sessions/{sessionId}\", {\n params: { path: { patientId, sessionId } },\n });\n }\n\n appendMessages(patientId: string, sessionId: string, body: AppendMessagesBody) {\n return this.#http.POST(\"/v1/patients/{patientId}/sessions/{sessionId}/messages\", {\n params: { path: { patientId, sessionId } },\n body,\n });\n }\n\n generateMemories(patientId: string, sessionId: string) {\n return this.#http.POST(\"/v1/patients/{patientId}/sessions/{sessionId}/memories\", {\n params: { path: { patientId, sessionId } },\n });\n }\n\n ingestSession(patientId: string, body: IngestSessionBody) {\n return this.#http.POST(\"/v1/patients/{patientId}/sessions/ingest\", {\n params: { path: { patientId } },\n body,\n });\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Re-generate by running: pnpm generate\n\nimport type { HttpClient } from \"../http-client\";\n\nexport class VFSResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n browseVfs(patientId: string, params?: { query?: { path?: string } }) {\n return this.#http.GET(\"/v1/patients/{patientId}/vfs\", {\n params: {\n path: { patientId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n readVfs(\n patientId: string,\n params?: {\n query?: {\n path?: string;\n format?: \"narrative\" | \"structured\" | \"compact\";\n token_budget?: number;\n };\n },\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/read\", {\n params: {\n path: { patientId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Re-generate by running: pnpm generate\n\nimport type { HttpClient } from \"../http-client\";\nimport type { operations } from \"../generated/context-engine\";\n\nexport class GraphResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n listNodes(\n patientId: string,\n type:\n | \"extracted_fact\"\n | \"fact\"\n | \"extracted_narrative\"\n | \"narrative_passage\"\n | \"narrative\"\n | \"learned_memory\"\n | \"extracted_clinical_event\",\n params?: { query?: { page?: number; perPage?: number } },\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/graph/nodes/{type}/items\", {\n params: {\n path: { patientId, type },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n listEdges(\n patientId: string,\n type: \"resolution_decision\" | \"resolves_to\" | \"chunked_into\" | \"relationship\",\n params?: { query?: { page?: number; perPage?: number; touching?: string | string[] } },\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/graph/edges/{type}/items\", {\n params: {\n path: { patientId, type },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n getNode(\n patientId: string,\n type:\n | \"extracted_fact\"\n | \"fact\"\n | \"extracted_narrative\"\n | \"narrative_passage\"\n | \"narrative\"\n | \"learned_memory\"\n | \"extracted_clinical_event\",\n nodeId: string,\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/graph/nodes/{type}/items/{nodeId}\", {\n params: { path: { patientId, type, nodeId } },\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n getEdge(\n patientId: string,\n type: \"resolution_decision\" | \"resolves_to\" | \"chunked_into\" | \"relationship\",\n edgeId: string,\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/graph/edges/{type}/items/{edgeId}\", {\n params: { path: { patientId, type, edgeId } },\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryExtractedFactNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-extracted-fact-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/extracted_fact/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryFactNodes(\n patientId: string,\n body: NonNullable<operations[\"query-fact-nodes\"][\"requestBody\"]>[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/fact/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryExtractedNarrativeNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-extracted-narrative-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/extracted_narrative/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryNarrativePassageNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-narrative-passage-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/narrative_passage/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryNarrativeNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-narrative-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/narrative/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryLearnedMemoryNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-learned-memory-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/learned_memory/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryExtractedClinicalEventNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-extracted-clinical-event-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/extracted_clinical_event/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryResolutionDecisionEdges(\n patientId: string,\n body: NonNullable<\n operations[\"query-resolution-decision-edges\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/edges/resolution_decision/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryResolvesToEdges(\n patientId: string,\n body: NonNullable<\n operations[\"query-resolves-to-edges\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/edges/resolves_to/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryChunkedIntoEdges(\n patientId: string,\n body: NonNullable<\n operations[\"query-chunked-into-edges\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/edges/chunked_into/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryRelationshipEdges(\n patientId: string,\n body: NonNullable<\n operations[\"query-relationship-edges\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/edges/relationship/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Re-generate by running: pnpm generate\n\nimport type { HttpClient } from \"../http-client\";\nimport { InfoResource } from \"./info\";\nimport { PatientsResource } from \"./patients\";\nimport { IngestResource } from \"./ingest\";\nimport { SessionsResource } from \"./sessions\";\nimport { VFSResource } from \"./vfs\";\nimport { GraphResource } from \"./graph\";\n\nexport { InfoResource } from \"./info\";\nexport { PatientsResource } from \"./patients\";\nexport { IngestResource } from \"./ingest\";\nexport { SessionsResource } from \"./sessions\";\nexport { VFSResource } from \"./vfs\";\nexport { GraphResource } from \"./graph\";\n\n/** Every resource, under the property it takes on `ContextEngineClient`. */\nexport interface Resources {\n readonly info: InfoResource;\n readonly patients: PatientsResource;\n readonly ingest: IngestResource;\n readonly sessions: SessionsResource;\n readonly vfs: VFSResource;\n readonly graph: GraphResource;\n}\n\n/**\n * Build one of each resource over a shared http client.\n *\n * Generated alongside the classes, so a new tag in the spec lands here on its own and\n * `ContextEngineClient` fails to compile until it names the new property.\n */\nexport function createResources(http: HttpClient): Resources {\n return {\n info: new InfoResource(http),\n patients: new PatientsResource(http),\n ingest: new IngestResource(http),\n sessions: new SessionsResource(http),\n vfs: new VFSResource(http),\n graph: new GraphResource(http),\n };\n}\n","import { HttpClient, type HttpClientOptions } from \"./http-client\";\nimport {\n createResources,\n GraphResource,\n InfoResource,\n IngestResource,\n PatientsResource,\n SessionsResource,\n VFSResource,\n type Resources,\n} from \"./resources\";\n\nexport type ContextEngineClientOptions = HttpClientOptions;\n\n/**\n * Client for the Clinia Context Engine API.\n *\n * Each area of the API is a resource property — `client.patients`, `client.ingest`,\n * `client.graph` — and `http` stays available underneath for anything a resource method does\n * not cover. Every resource shares that one http client, so authentication is configured once.\n *\n * `implements Resources` is what keeps this list honest: the resources are generated from the\n * API spec, and a new one is a compile error here until it is named.\n */\nexport class ContextEngineClient implements Resources {\n /**\n * Low-level http client. Use when a resource method does not cover your use case.\n */\n readonly http: HttpClient;\n\n readonly info: InfoResource;\n readonly patients: PatientsResource;\n readonly ingest: IngestResource;\n readonly sessions: SessionsResource;\n readonly vfs: VFSResource;\n readonly graph: GraphResource;\n\n constructor(options: ContextEngineClientOptions) {\n this.http = new HttpClient(options);\n\n const resources = createResources(this.http);\n this.info = resources.info;\n this.patients = resources.patients;\n this.ingest = resources.ingest;\n this.sessions = resources.sessions;\n this.vfs = resources.vfs;\n this.graph = resources.graph;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/auth.ts","../src/http-client.ts","../src/resources/info.ts","../src/resources/patients.ts","../src/form-data.ts","../src/resources/ingest.ts","../src/resources/sessions.ts","../src/resources/vfs.ts","../src/resources/graph.ts","../src/resources/index.ts","../src/context-engine-client.ts"],"sourcesContent":["import * as oauth from \"oauth4webapi\";\n\n/**\n * OAuth2 client-credentials helpers for authenticating against a secured\n * Context Engine workspace.\n *\n * The server validates a bearer JWT in the `Authorization` header against a\n * JWKS. This module provides the client half: a token provider that exchanges\n * a `client_id`/`client_secret` for an access token, caches it, and refreshes\n * it before expiry. The token exchange itself is delegated to `oauth4webapi`\n * (standards-compliant request building + response validation); this module\n * only adds caching, concurrent-request de-duplication, and a small config\n * surface. Pass the raw config as {@link HttpClientOptions.auth}, or — for full\n * control — pass the returned provider as the {@link HttpClientOptions.auth}\n * token function.\n */\n\n/**\n * Resolves to a currently-valid bearer access token. Called per request; a\n * well-behaved provider caches internally and only hits the network when the\n * cached token is missing or about to expire.\n */\nexport type TokenProvider = () => Promise<string>;\n\n/**\n * Clinia's authorization server, applied when a config names neither a\n * `tokenUrl` nor an `issuer` — so `{ clientId, clientSecret }` is a complete\n * config for a Clinia workspace, which is the overwhelmingly common case.\n *\n * `RESOURCE` is only defaulted alongside `TOKEN_URL`: it is an RFC 8707\n * indicator naming Clinia's protected resource, and sending it to somebody\n * else's authorization server would be wrong.\n */\nconst CLINIA_OAUTH_TOKEN_URL = \"https://console.clinia.cloud/api/auth/oauth2/token\";\nconst CLINIA_OAUTH_RESOURCE = \"https://console.clinia.cloud\";\n\n/** Fields common to both ways of locating the authorization server. */\ntype ClientCredentialsBase = {\n clientId: string;\n clientSecret: string;\n /**\n * Optional `resource` indicator (RFC 8707) naming the protected resource the\n * token is for. This is what the Clinia authorization server expects (e.g.\n * `https://console.clinia.cloud`).\n */\n resource?: string;\n /** Optional `audience` parameter (used by some IdPs, e.g. Auth0). */\n audience?: string;\n /** Optional space-delimited `scope`. */\n scope?: string;\n /**\n * How the client credentials are presented to the token endpoint. `post`\n * (the default) sends them in the request body — what the Clinia\n * authorization server expects; `basic` sends them in the `Authorization`\n * header (RFC 6749 §2.3.1) for IdPs that require it.\n */\n authMethod?: \"basic\" | \"post\";\n /**\n * Custom fetch implementation. Defaults to `globalThis.fetch`. Useful for\n * injecting a mock in tests.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * Refresh the token this many milliseconds before it actually expires, to\n * avoid handing out a token that expires mid-flight. Defaults to 60_000.\n */\n expiryMarginMs?: number;\n};\n\n/**\n * Client-credentials configuration.\n *\n * For a Clinia workspace, `{ clientId, clientSecret }` is enough — the token\n * endpoint and `resource` indicator default to Clinia's authorization server.\n * Naming an {@link issuer} instead locates a different authorization server by\n * OIDC/OAuth2 discovery; naming a {@link tokenUrl} points at one explicitly.\n */\nexport type ClientCredentialsConfig =\n | (ClientCredentialsBase & {\n /**\n * Issuer identifier of the authorization server. Its metadata (token\n * endpoint, etc.) is resolved via discovery on first use.\n */\n issuer: string;\n /** Discovery transformation: `oidc` (default) or `oauth2` (RFC 8414). */\n discoveryAlgorithm?: \"oidc\" | \"oauth2\";\n tokenUrl?: never;\n })\n | (ClientCredentialsBase & {\n /**\n * Explicit OAuth2 token endpoint; discovery is skipped. Omit it — along\n * with `issuer` — to use Clinia's.\n */\n tokenUrl?: string;\n /** Issuer identifier for response validation; defaults to the token URL's origin. */\n issuer?: string;\n discoveryAlgorithm?: never;\n });\n\nconst DEFAULT_EXPIRY_MARGIN_MS = 60_000;\n/** Fallback lifetime when the token endpoint omits `expires_in`. */\nconst DEFAULT_TTL_MS = 5 * 60_000;\n\n/** Turns an `oauth4webapi` failure into a concise, stable error message. */\nfunction describeOAuthError(err: unknown): string {\n if (err instanceof oauth.ResponseBodyError) {\n return `${err.status} ${err.error}${err.error_description ? ` — ${err.error_description}` : \"\"}`;\n }\n if (err instanceof oauth.WWWAuthenticateChallengeError) {\n return `${err.status} ${err.message}`;\n }\n return err instanceof Error ? err.message : String(err);\n}\n\n/**\n * Builds a {@link TokenProvider} backed by the OAuth2 client-credentials grant.\n *\n * The provider caches the access token and reuses it until it is within\n * `expiryMarginMs` of expiry. Concurrent calls while a fetch is in flight share\n * the same request rather than each hitting the token endpoint. When configured\n * with an {@link ClientCredentialsConfig.issuer}, the authorization server\n * metadata is discovered once and memoized.\n */\nexport function createClientCredentialsTokenProvider(\n config: ClientCredentialsConfig,\n): TokenProvider {\n const expiryMarginMs = config.expiryMarginMs ?? DEFAULT_EXPIRY_MARGIN_MS;\n\n // Defaulted only when the token endpoint is also defaulted. `resource` names\n // Clinia's protected resource, so attaching it to a request aimed at somebody\n // else's authorization server would be both wrong and a small disclosure.\n const usesCliniaAuthServer = !config.tokenUrl && !config.issuer;\n const resource = config.resource ?? (usesCliniaAuthServer ? CLINIA_OAUTH_RESOURCE : undefined);\n\n const client: oauth.Client = { client_id: config.clientId };\n const clientAuth =\n config.authMethod === \"basic\"\n ? oauth.ClientSecretBasic(config.clientSecret)\n : oauth.ClientSecretPost(config.clientSecret);\n\n // Shared HTTP options (custom fetch + insecure opt-in) applied to every\n // oauth4webapi call. The `as never` bridges the customFetch signature, which\n // is generic over method/body per call site but is the same fn at runtime.\n // oauth4webapi rejects non-TLS endpoints by default; we relax that per call\n // when — and only when — the target URL is itself `http://` (local dev),\n // rather than exposing a separate flag.\n const fetchImpl = config.fetch;\n const isInsecure = (url: string | undefined): boolean =>\n !!url && new URL(url).protocol === \"http:\";\n function withHttpOptions<T extends object>(opts: T, insecure: boolean): T {\n const o = opts as T & {\n [oauth.customFetch]?: unknown;\n [oauth.allowInsecureRequests]?: boolean;\n };\n if (fetchImpl) {\n o[oauth.customFetch] = ((url: string, options: RequestInit) =>\n fetchImpl(url, options)) as never;\n }\n if (insecure) o[oauth.allowInsecureRequests] = true;\n return o;\n }\n\n // Authorization server metadata, resolved once. For an explicit tokenUrl it's\n // synchronous; for an issuer it requires a discovery request, so it's async\n // and memoized (with retry on failure — a rejected attempt isn't cached).\n let resolvedAs: oauth.AuthorizationServer | null = null;\n let asInFlight: Promise<oauth.AuthorizationServer> | null = null;\n\n async function resolveAuthServer(): Promise<oauth.AuthorizationServer> {\n // Discovery only when an issuer is named and no explicit endpoint overrides\n // it. There is no \"neither given\" case left to handle — that is the Clinia\n // default, which is why this no longer throws.\n if (!config.issuer || config.tokenUrl) {\n const tokenUrl = config.tokenUrl ?? CLINIA_OAUTH_TOKEN_URL;\n return {\n issuer: config.issuer ?? new URL(tokenUrl).origin,\n token_endpoint: tokenUrl,\n };\n }\n const issuerUrl = new URL(config.issuer);\n const response = await oauth.discoveryRequest(\n issuerUrl,\n withHttpOptions<oauth.DiscoveryRequestOptions>(\n { algorithm: config.discoveryAlgorithm ?? \"oidc\" },\n isInsecure(config.issuer),\n ),\n );\n return oauth.processDiscoveryResponse(issuerUrl, response);\n }\n\n function getAuthServer(): Promise<oauth.AuthorizationServer> {\n if (resolvedAs) return Promise.resolve(resolvedAs);\n if (!asInFlight) {\n asInFlight = resolveAuthServer()\n .then((as) => (resolvedAs = as))\n .finally(() => {\n asInFlight = null;\n });\n }\n return asInFlight;\n }\n\n let cachedToken: string | null = null;\n /** Absolute epoch ms at which the cached token should be considered stale. */\n let expiresAt = 0;\n /** In-flight fetch, shared across concurrent callers to dedupe requests. */\n let inFlight: Promise<string> | null = null;\n\n async function fetchToken(): Promise<string> {\n const params = new URLSearchParams();\n if (resource) params.set(\"resource\", resource);\n if (config.audience) params.set(\"audience\", config.audience);\n if (config.scope) params.set(\"scope\", config.scope);\n\n let result: oauth.TokenEndpointResponse;\n try {\n const as = await getAuthServer();\n const response = await oauth.clientCredentialsGrantRequest(\n as,\n client,\n clientAuth,\n params,\n withHttpOptions<oauth.ClientCredentialsGrantRequestOptions>(\n {},\n isInsecure(as.token_endpoint),\n ),\n );\n result = await oauth.processClientCredentialsResponse(as, client, response);\n } catch (err) {\n throw new Error(`client_credentials token request failed: ${describeOAuthError(err)}`, {\n cause: err,\n });\n }\n\n const ttlMs = result.expires_in ? result.expires_in * 1000 : DEFAULT_TTL_MS;\n cachedToken = result.access_token;\n expiresAt = Date.now() + Math.max(0, ttlMs - expiryMarginMs);\n return cachedToken;\n }\n\n return async function getAccessToken(): Promise<string> {\n if (cachedToken && Date.now() < expiresAt) return cachedToken;\n if (inFlight) return inFlight;\n\n inFlight = fetchToken().finally(() => {\n inFlight = null;\n });\n return inFlight;\n };\n}\n","import createFetchClient, { type Client, type Middleware } from \"openapi-fetch\";\n\nimport { createClientCredentialsTokenProvider, type ClientCredentialsConfig } from \"./auth\";\nimport type { paths } from \"./generated/context-engine\";\n\nexport type HttpClientOptions = {\n baseUrl: string;\n /**\n * Custom fetch implementation. Defaults to `globalThis.fetch`.\n * Works in Node 20+ and all modern browsers out of the box.\n * Useful for injecting a mock or a custom fetch in tests.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * How to authenticate against a secured Context Engine server. Accepts either\n * shape:\n *\n * - A {@link ClientCredentialsConfig} — the common case. Pass just your OAuth2\n * client credentials and the client sets up token acquisition, caching, and\n * refresh for you.\n * - A token function `() => string | Promise<string>` — the escape hatch for\n * full control (a token from elsewhere, a different grant, or a custom\n * refresh strategy). Called per request, so a provider can cache and refresh\n * internally (e.g. {@link createClientCredentialsTokenProvider}); a falsy\n * return value leaves the header unset.\n *\n * Either way the resolved token is attached as `Authorization: Bearer <token>`\n * on every request. Omit for an unsecured server.\n */\n auth?: ClientCredentialsConfig | (() => string | Promise<string>);\n};\n\nexport class HttpClient {\n readonly #client: Client<paths>;\n\n constructor(options: HttpClientOptions) {\n this.#client = createFetchClient<paths>({\n baseUrl: options.baseUrl,\n fetch: options.fetch,\n });\n\n // A token function is used as-is; a config object builds a client-credentials\n // provider. The custom `fetch` is threaded into the token exchange too so\n // tests/proxies apply to both hops.\n const getAccessToken =\n typeof options.auth === \"function\"\n ? options.auth\n : options.auth\n ? createClientCredentialsTokenProvider({ fetch: options.fetch, ...options.auth })\n : undefined;\n\n if (getAccessToken) {\n const authMiddleware: Middleware = {\n async onRequest({ request }) {\n const token = await getAccessToken();\n if (token) request.headers.set(\"Authorization\", `Bearer ${token}`);\n return request;\n },\n };\n this.#client.use(authMiddleware);\n }\n }\n\n get GET(): Client<paths>[\"GET\"] {\n return this.#client.GET;\n }\n\n get POST(): Client<paths>[\"POST\"] {\n return this.#client.POST;\n }\n\n get PUT(): Client<paths>[\"PUT\"] {\n return this.#client.PUT;\n }\n\n get PATCH(): Client<paths>[\"PATCH\"] {\n return this.#client.PATCH;\n }\n\n get DELETE(): Client<paths>[\"DELETE\"] {\n return this.#client.DELETE;\n }\n\n use(...middleware: Middleware[]): this {\n this.#client.use(...middleware);\n return this;\n }\n\n eject(...middleware: Middleware[]): this {\n this.#client.eject(...middleware);\n return this;\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Generated from the Context Engine OpenAPI spec.\n\nimport type { HttpClient } from \"../http-client\";\n\nexport class InfoResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n getServiceInfo() {\n return this.#http.GET(\"/\", undefined);\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Generated from the Context Engine OpenAPI spec.\n\nimport type { HttpClient } from \"../http-client\";\n\nexport class PatientsResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n listPatients(params?: { query?: { page?: number; perPage?: number } }) {\n return this.#http.GET(\"/v1/patients\", params ? { params } : undefined);\n }\n\n getPatient(patientId: string) {\n return this.#http.GET(\"/v1/patients/{patientId}\", { params: { path: { patientId } } });\n }\n\n /**\n * @deprecated This endpoint will be removed in a future release.\n */\n getResolution(patientId: string, params?: { query?: { page?: number; perPage?: number } }) {\n return this.#http.GET(\"/v1/patients/{patientId}/resolution\", {\n params: {\n path: { patientId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n /**\n * @deprecated This endpoint will be removed in a future release.\n */\n getReconciliation(patientId: string, params?: { query?: { format?: \"json\" | \"markdown\" } }) {\n return this.#http.GET(\"/v1/patients/{patientId}/reconciliation\", {\n params: {\n path: { patientId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n deletePatient(patientId: string) {\n return this.#http.DELETE(\"/v1/patients/{patientId}\", { params: { path: { patientId } } });\n }\n\n upsertPatient(patientId: string) {\n return this.#http.PUT(\"/v1/patients/{patientId}\", { params: { path: { patientId } } });\n }\n}\n","/**\n * A `multipart/form-data` request body, built from the object form of the schema.\n *\n * An array-valued field becomes one part per item under the same field name — how a schema\n * declaring an array of items is sent — and every other field becomes a single part. A field\n * left `undefined` or `null` is omitted rather than sent as the string `\"undefined\"` or `\"null\"`.\n *\n * Values are appended as given, so a string is sent as text and a `Blob` or `File` keeps the\n * filename and content type it was created with.\n *\n * No `Content-Type` is set anywhere: the header carries the multipart boundary, which only\n * the runtime sending the request can know.\n */\nexport function toFormData(body: unknown): FormData {\n const form = new FormData();\n if (body === null || typeof body !== \"object\") return form;\n\n for (const [field, value] of Object.entries(body)) {\n if (value === undefined || value === null) continue;\n for (const part of Array.isArray(value) ? value : [value]) {\n form.append(field, part as string | Blob);\n }\n }\n return form;\n}\n","// This file is auto-generated. Do not edit manually.\n// Generated from the Context Engine OpenAPI spec.\n\nimport type { HttpClient } from \"../http-client\";\nimport { toFormData } from \"../form-data\";\nimport type { operations } from \"../generated/context-engine\";\nimport type { IngestFhirBody, IngestSessionsBody } from \"../generated/types\";\n\nexport class IngestResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n listIngestions(\n patientId: string,\n params?: {\n query?: {\n page?: number;\n perPage?: number;\n sort?: \"receivedAt\";\n order?: \"asc\" | \"desc\";\n status?: (\"pending\" | \"processing\" | \"succeeded\" | \"partial\" | \"failed\")[];\n };\n },\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/ingestions\", {\n params: {\n path: { patientId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n getIngestion(patientId: string, ingestionId: string) {\n return this.#http.GET(\"/v1/patients/{patientId}/ingestions/{ingestionId}\", {\n params: { path: { patientId, ingestionId } },\n });\n }\n\n ingestFhirR4(patientId: string, body: IngestFhirBody) {\n return this.#http.POST(\"/v1/patients/{patientId}/ingestions/fhir/r4\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n ingestFhirR5(patientId: string, body: IngestFhirBody) {\n return this.#http.POST(\"/v1/patients/{patientId}/ingestions/fhir/r5\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n ingestCdaR2(\n patientId: string,\n body: NonNullable<operations[\"ingest-cda-r2\"][\"requestBody\"]>[\"content\"][\"application/cda+xml\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/ingestions/cda/r2\", {\n params: { path: { patientId } },\n body,\n bodySerializer: (b: unknown) => (typeof b === \"string\" ? b : JSON.stringify(b)),\n headers: { \"Content-Type\": \"application/cda+xml\" },\n });\n }\n\n ingestCdaR2Multipart(\n patientId: string,\n body: NonNullable<operations[\"ingest-cda-r2\"][\"requestBody\"]>[\"content\"][\"multipart/form-data\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/ingestions/cda/r2\", {\n params: { path: { patientId } },\n body,\n bodySerializer: (b: unknown) => toFormData(b),\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n ingestSessions(patientId: string, body: IngestSessionsBody) {\n return this.#http.POST(\"/v1/patients/{patientId}/ingestions/sessions\", {\n params: { path: { patientId } },\n body,\n });\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Generated from the Context Engine OpenAPI spec.\n\nimport type { HttpClient } from \"../http-client\";\nimport type { AppendMessagesBody } from \"../generated/types\";\n\nexport class SessionsResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n listSessionMemories(\n patientId: string,\n sessionId: string,\n params?: {\n query?: { page?: number; perPage?: number; sort?: \"createdAt\"; order?: \"asc\" | \"desc\" };\n },\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/sessions/{sessionId}/memories\", {\n params: {\n path: { patientId, sessionId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n /**\n * @deprecated This endpoint will be removed in a future release.\n */\n createSession(patientId: string) {\n return this.#http.POST(\"/v1/patients/{patientId}/sessions\", {\n params: { path: { patientId } },\n });\n }\n\n getSession(patientId: string, sessionId: string) {\n return this.#http.GET(\"/v1/patients/{patientId}/sessions/{sessionId}\", {\n params: { path: { patientId, sessionId } },\n });\n }\n\n /**\n * @deprecated This endpoint will be removed in a future release.\n */\n upsertSession(patientId: string, sessionId: string) {\n return this.#http.PUT(\"/v1/patients/{patientId}/sessions/{sessionId}\", {\n params: { path: { patientId, sessionId } },\n });\n }\n\n /**\n * @deprecated This endpoint will be removed in a future release.\n */\n appendMessages(patientId: string, sessionId: string, body: AppendMessagesBody) {\n return this.#http.POST(\"/v1/patients/{patientId}/sessions/{sessionId}/messages\", {\n params: { path: { patientId, sessionId } },\n body,\n });\n }\n\n /**\n * @deprecated This endpoint will be removed in a future release.\n */\n generateMemories(patientId: string, sessionId: string) {\n return this.#http.POST(\"/v1/patients/{patientId}/sessions/{sessionId}/memories\", {\n params: { path: { patientId, sessionId } },\n });\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Generated from the Context Engine OpenAPI spec.\n\nimport type { HttpClient } from \"../http-client\";\n\nexport class VFSResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n browseVfs(patientId: string, params?: { query?: { path?: string } }) {\n return this.#http.GET(\"/v1/patients/{patientId}/vfs\", {\n params: {\n path: { patientId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n readVfs(\n patientId: string,\n params?: {\n query?: {\n path?: string;\n format?: \"narrative\" | \"structured\" | \"compact\";\n token_budget?: number;\n };\n },\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/read\", {\n params: {\n path: { patientId },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Generated from the Context Engine OpenAPI spec.\n\nimport type { HttpClient } from \"../http-client\";\nimport type { operations } from \"../generated/context-engine\";\n\nexport class GraphResource {\n readonly #http: HttpClient;\n\n constructor(http: HttpClient) {\n this.#http = http;\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n listNodes(\n patientId: string,\n type:\n | \"extracted_fact\"\n | \"fact\"\n | \"extracted_narrative\"\n | \"narrative_passage\"\n | \"narrative\"\n | \"learned_memory\"\n | \"extracted_clinical_event\",\n params?: { query?: { page?: number; perPage?: number } },\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/graph/nodes/{type}/items\", {\n params: {\n path: { patientId, type },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n listEdges(\n patientId: string,\n type: \"resolution_decision\" | \"resolves_to\" | \"chunked_into\" | \"relationship\",\n params?: { query?: { page?: number; perPage?: number; touching?: string | string[] } },\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/graph/edges/{type}/items\", {\n params: {\n path: { patientId, type },\n ...(params?.query !== undefined ? { query: params.query } : {}),\n },\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n getNode(\n patientId: string,\n type:\n | \"extracted_fact\"\n | \"fact\"\n | \"extracted_narrative\"\n | \"narrative_passage\"\n | \"narrative\"\n | \"learned_memory\"\n | \"extracted_clinical_event\",\n nodeId: string,\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/graph/nodes/{type}/items/{nodeId}\", {\n params: { path: { patientId, type, nodeId } },\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n getEdge(\n patientId: string,\n type: \"resolution_decision\" | \"resolves_to\" | \"chunked_into\" | \"relationship\",\n edgeId: string,\n ) {\n return this.#http.GET(\"/v1/patients/{patientId}/graph/edges/{type}/items/{edgeId}\", {\n params: { path: { patientId, type, edgeId } },\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryExtractedFactNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-extracted-fact-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/extracted_fact/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryFactNodes(\n patientId: string,\n body: NonNullable<operations[\"query-fact-nodes\"][\"requestBody\"]>[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/fact/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryExtractedNarrativeNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-extracted-narrative-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/extracted_narrative/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryNarrativePassageNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-narrative-passage-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/narrative_passage/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryNarrativeNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-narrative-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/narrative/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryLearnedMemoryNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-learned-memory-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/learned_memory/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryExtractedClinicalEventNodes(\n patientId: string,\n body: NonNullable<\n operations[\"query-extracted-clinical-event-nodes\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/nodes/extracted_clinical_event/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryResolutionDecisionEdges(\n patientId: string,\n body: NonNullable<\n operations[\"query-resolution-decision-edges\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/edges/resolution_decision/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryResolvesToEdges(\n patientId: string,\n body: NonNullable<\n operations[\"query-resolves-to-edges\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/edges/resolves_to/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryChunkedIntoEdges(\n patientId: string,\n body: NonNullable<\n operations[\"query-chunked-into-edges\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/edges/chunked_into/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n\n /**\n * Technical preview.\n *\n * @experimental\n */\n queryRelationshipEdges(\n patientId: string,\n body: NonNullable<\n operations[\"query-relationship-edges\"][\"requestBody\"]\n >[\"content\"][\"application/json\"],\n ) {\n return this.#http.POST(\"/v1/patients/{patientId}/graph/edges/relationship/query\", {\n params: { path: { patientId } },\n body,\n });\n }\n}\n","// This file is auto-generated. Do not edit manually.\n// Generated from the Context Engine OpenAPI spec.\n\nimport type { HttpClient } from \"../http-client\";\nimport { InfoResource } from \"./info\";\nimport { PatientsResource } from \"./patients\";\nimport { IngestResource } from \"./ingest\";\nimport { SessionsResource } from \"./sessions\";\nimport { VFSResource } from \"./vfs\";\nimport { GraphResource } from \"./graph\";\n\nexport { InfoResource } from \"./info\";\nexport { PatientsResource } from \"./patients\";\nexport { IngestResource } from \"./ingest\";\nexport { SessionsResource } from \"./sessions\";\nexport { VFSResource } from \"./vfs\";\nexport { GraphResource } from \"./graph\";\n\n/** Every resource, under the property it takes on `ContextEngineClient`. */\nexport interface Resources {\n readonly info: InfoResource;\n readonly patients: PatientsResource;\n readonly ingest: IngestResource;\n readonly sessions: SessionsResource;\n readonly vfs: VFSResource;\n readonly graph: GraphResource;\n}\n\n/**\n * Build one of each resource over a shared http client.\n *\n * Generated alongside the classes, so a new tag in the spec lands here on its own and\n * `ContextEngineClient` fails to compile until it names the new property.\n */\nexport function createResources(http: HttpClient): Resources {\n return {\n info: new InfoResource(http),\n patients: new PatientsResource(http),\n ingest: new IngestResource(http),\n sessions: new SessionsResource(http),\n vfs: new VFSResource(http),\n graph: new GraphResource(http),\n };\n}\n","import { HttpClient, type HttpClientOptions } from \"./http-client\";\nimport {\n createResources,\n GraphResource,\n InfoResource,\n IngestResource,\n PatientsResource,\n SessionsResource,\n VFSResource,\n type Resources,\n} from \"./resources\";\n\nexport type ContextEngineClientOptions = HttpClientOptions;\n\n/**\n * Client for the Clinia Context Engine API.\n *\n * Each area of the API is a resource property — `client.patients`, `client.ingest`,\n * `client.graph` — and `http` stays available underneath for anything a resource method does\n * not cover. Every resource shares that one http client, so authentication is configured once.\n *\n * `implements Resources` is what keeps this list honest: the resources are generated from the\n * API spec, and a new one is a compile error here until it is named.\n */\nexport class ContextEngineClient implements Resources {\n /**\n * Low-level http client. Use when a resource method does not cover your use case.\n */\n readonly http: HttpClient;\n\n readonly info: InfoResource;\n readonly patients: PatientsResource;\n readonly ingest: IngestResource;\n readonly sessions: SessionsResource;\n readonly vfs: VFSResource;\n readonly graph: GraphResource;\n\n constructor(options: ContextEngineClientOptions) {\n this.http = new HttpClient(options);\n\n const resources = createResources(this.http);\n this.info = resources.info;\n this.patients = resources.patients;\n this.ingest = resources.ingest;\n this.sessions = resources.sessions;\n this.vfs = resources.vfs;\n this.graph = resources.graph;\n }\n}\n"],"mappings":"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","names":[]}
@@ -19,6 +19,14 @@ export declare class InfoResource {
19
19
  "application/json": import("..").components["schemas"]["ServiceInfo"];
20
20
  };
21
21
  };
22
+ 503: {
23
+ headers: {
24
+ [name: string]: unknown;
25
+ };
26
+ content: {
27
+ "application/json": import("..").components["schemas"]["ServiceInfo"];
28
+ };
29
+ };
22
30
  };
23
31
  }, undefined, `${string}/${string}`>>;
24
32
  }
@@ -1,6 +1,6 @@
1
1
  import type { HttpClient } from "../http-client";
2
2
  import type { operations } from "../generated/context-engine";
3
- import type { IngestFhirBody } from "../generated/types";
3
+ import type { IngestFhirBody, IngestSessionsBody } from "../generated/types";
4
4
  export declare class IngestResource {
5
5
  #private;
6
6
  constructor(http: HttpClient);
@@ -336,4 +336,59 @@ export declare class IngestResource {
336
336
  };
337
337
  bodySerializer: (b: unknown) => FormData;
338
338
  }, `${string}/${string}`>>;
339
+ /**
340
+ * Technical preview.
341
+ *
342
+ * @experimental
343
+ */
344
+ ingestSessions(patientId: string, body: IngestSessionsBody): Promise<import("openapi-fetch").FetchResponse<{
345
+ parameters: {
346
+ query?: never;
347
+ header?: never;
348
+ path: {
349
+ patientId: string;
350
+ };
351
+ cookie?: never;
352
+ };
353
+ requestBody: {
354
+ content: {
355
+ "application/json": import("..").components["schemas"]["IngestSessionsBody"];
356
+ };
357
+ };
358
+ responses: {
359
+ 202: {
360
+ headers: {
361
+ [name: string]: unknown;
362
+ };
363
+ content: {
364
+ "application/json": import("..").components["schemas"]["Ingestion"];
365
+ };
366
+ };
367
+ 400: {
368
+ headers: {
369
+ [name: string]: unknown;
370
+ };
371
+ content: {
372
+ "application/json": import("..").components["schemas"]["ApiError"];
373
+ };
374
+ };
375
+ 404: {
376
+ headers: {
377
+ [name: string]: unknown;
378
+ };
379
+ content: {
380
+ "application/json": import("..").components["schemas"]["ApiError"];
381
+ };
382
+ };
383
+ };
384
+ }, {
385
+ params: {
386
+ path: {
387
+ patientId: string;
388
+ };
389
+ };
390
+ body: {
391
+ sessions: import("..").components["schemas"]["IngestSession"][];
392
+ };
393
+ }, `${string}/${string}`>>;
339
394
  }
@@ -1,5 +1,5 @@
1
1
  import type { HttpClient } from "../http-client";
2
- import type { AppendMessagesBody, IngestSessionBody } from "../generated/types";
2
+ import type { AppendMessagesBody } from "../generated/types";
3
3
  export declare class SessionsResource {
4
4
  #private;
5
5
  constructor(http: HttpClient);
@@ -58,6 +58,9 @@ export declare class SessionsResource {
58
58
  };
59
59
  };
60
60
  }, `${string}/${string}`>>;
61
+ /**
62
+ * @deprecated This endpoint will be removed in a future release.
63
+ */
61
64
  createSession(patientId: string): Promise<import("openapi-fetch").FetchResponse<{
62
65
  parameters: {
63
66
  query?: never;
@@ -130,6 +133,9 @@ export declare class SessionsResource {
130
133
  };
131
134
  };
132
135
  }, `${string}/${string}`>>;
136
+ /**
137
+ * @deprecated This endpoint will be removed in a future release.
138
+ */
133
139
  upsertSession(patientId: string, sessionId: string): Promise<import("openapi-fetch").FetchResponse<{
134
140
  parameters: {
135
141
  query?: never;
@@ -183,6 +189,9 @@ export declare class SessionsResource {
183
189
  };
184
190
  };
185
191
  }, `${string}/${string}`>>;
192
+ /**
193
+ * @deprecated This endpoint will be removed in a future release.
194
+ */
186
195
  appendMessages(patientId: string, sessionId: string, body: AppendMessagesBody): Promise<import("openapi-fetch").FetchResponse<{
187
196
  parameters: {
188
197
  query?: never;
@@ -207,9 +216,18 @@ export declare class SessionsResource {
207
216
  "application/json": {
208
217
  ok: boolean;
209
218
  messageCount: number;
219
+ ingestion: import("..").components["schemas"]["Ingestion"] & unknown;
210
220
  };
211
221
  };
212
222
  };
223
+ 400: {
224
+ headers: {
225
+ [name: string]: unknown;
226
+ };
227
+ content: {
228
+ "application/json": import("..").components["schemas"]["ApiError"];
229
+ };
230
+ };
213
231
  404: {
214
232
  headers: {
215
233
  [name: string]: unknown;
@@ -233,6 +251,9 @@ export declare class SessionsResource {
233
251
  }[];
234
252
  };
235
253
  }, `${string}/${string}`>>;
254
+ /**
255
+ * @deprecated This endpoint will be removed in a future release.
256
+ */
236
257
  generateMemories(patientId: string, sessionId: string): Promise<import("openapi-fetch").FetchResponse<{
237
258
  parameters: {
238
259
  query?: never;
@@ -245,7 +266,7 @@ export declare class SessionsResource {
245
266
  };
246
267
  requestBody?: never;
247
268
  responses: {
248
- 200: {
269
+ 202: {
249
270
  headers: {
250
271
  [name: string]: unknown;
251
272
  };
@@ -272,53 +293,4 @@ export declare class SessionsResource {
272
293
  };
273
294
  };
274
295
  }, `${string}/${string}`>>;
275
- ingestSession(patientId: string, body: IngestSessionBody): Promise<import("openapi-fetch").FetchResponse<{
276
- parameters: {
277
- query?: never;
278
- header?: never;
279
- path: {
280
- patientId: string;
281
- };
282
- cookie?: never;
283
- };
284
- requestBody: {
285
- content: {
286
- "application/json": import("..").components["schemas"]["IngestSessionBody"];
287
- };
288
- };
289
- responses: {
290
- 200: {
291
- headers: {
292
- [name: string]: unknown;
293
- };
294
- content: {
295
- "application/json": {
296
- ok: boolean;
297
- sessionId: string;
298
- messageCount: number;
299
- };
300
- };
301
- };
302
- 404: {
303
- headers: {
304
- [name: string]: unknown;
305
- };
306
- content: {
307
- "application/json": import("..").components["schemas"]["ApiError"];
308
- };
309
- };
310
- };
311
- }, {
312
- params: {
313
- path: {
314
- patientId: string;
315
- };
316
- };
317
- body: {
318
- messages: {
319
- role: "user" | "assistant";
320
- content: string;
321
- }[];
322
- };
323
- }, `${string}/${string}`>>;
324
296
  }
package/package.json CHANGED
@@ -1,16 +1,23 @@
1
1
  {
2
2
  "name": "@clinia/context-engine-js",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "TypeScript client for the Clinia Context Engine",
5
5
  "keywords": [
6
6
  "clinia",
7
7
  "context-engine",
8
8
  "healthcare",
9
9
  "fhir",
10
+ "llm",
11
+ "agent",
12
+ "mcp",
10
13
  "openapi",
11
14
  "api-client"
12
15
  ],
13
- "homepage": "https://docs.clinia.com/docs/introduction",
16
+ "homepage": "https://docs.clinia.com/docs/get-started/introduction",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/clinia/context-engine-js.git"
20
+ },
14
21
  "license": "Apache-2.0",
15
22
  "author": "Clinia Health Inc.",
16
23
  "type": "module",
@@ -38,14 +45,16 @@
38
45
  "openapi-fetch": "^0.17.0"
39
46
  },
40
47
  "devDependencies": {
41
- "@types/node": "^22.15.2",
48
+ "@types/node": "^24.0.0",
42
49
  "openapi-typescript": "^7.13.0",
43
50
  "tsup": "^8.5.1",
44
- "typescript": "npm:@typescript/typescript6@^6.0.2"
51
+ "typescript": "npm:@typescript/typescript6@^6.0.2",
52
+ "vitest": "^5.0.0"
45
53
  },
46
54
  "scripts": {
47
55
  "generate": "openapi-typescript ../../context-engine.yaml -o src/generated/context-engine.ts && pnpm --filter @clinia/api-scripts generate:js-resources && prettier --write src/generated/context-engine.ts",
48
56
  "build": "tsup && tsc6 -p tsconfig.build.json",
49
- "typecheck": "tsc6 --noEmit"
57
+ "typecheck": "tsc6 --noEmit",
58
+ "test": "vitest run"
50
59
  }
51
60
  }