{"version":3,"sources":["../src/domain.ts","../src/evidence.ts"],"names":["Effect"],"mappings":"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","file":"evidence.mjs","sourcesContent":["import { Data, Effect, Schema } from \"effect\";\n\nconst NonEmptyStringSchema = Schema.String.pipe(Schema.nonEmptyString());\n\nconst isIsoDateString = (value: string): boolean => {\n  const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n  if (!match) {\n    return false;\n  }\n\n  const [, year, month, day] = match;\n  const parsed = new Date(`${value}T00:00:00.000Z`);\n  return (\n    parsed.getUTCFullYear() === Number(year) &&\n    parsed.getUTCMonth() + 1 === Number(month) &&\n    parsed.getUTCDate() === Number(day)\n  );\n};\n\nconst IsoDateStringSchema = Schema.String.pipe(\n  Schema.filter(\n    (value) => isIsoDateString(value) || \"must be a valid ISO date string\"\n  )\n);\n\nconst UnitsSchema = Schema.Number.pipe(Schema.int(), Schema.positive());\nconst NpiSchema = Schema.String.pipe(Schema.pattern(/^\\d{10}$/));\nconst TinSchema = Schema.String.pipe(Schema.pattern(/^\\d{2}-\\d{7}$/));\n\nexport const SupportingInfoSchema = Schema.Struct({\n  id: NonEmptyStringSchema,\n  value: NonEmptyStringSchema,\n  source: Schema.Literal(\"chart\", \"patient\", \"payer\", \"external\")\n});\n\nexport type SupportingInfo = typeof SupportingInfoSchema.Type;\n\nexport const SupportingInfoListSchema = Schema.Array(SupportingInfoSchema);\n\nexport const decodeSupportingInfoList = (\n  input: unknown\n): Effect.Effect<ReadonlyArray<SupportingInfo>, ProtocolError> =>\n  Effect.suspend(() =>\n    Schema.decodeUnknown(SupportingInfoListSchema)(input).pipe(\n      Effect.mapError(\n        (detail) =>\n          new ProtocolError({\n            kind: \"validation\",\n            reason: \"invalid-evidence\",\n            detail\n          })\n      )\n    )\n  ).pipe(\n    Effect.catchAllDefect((detail) =>\n      Effect.fail(\n        new ProtocolError({\n          kind: \"validation\",\n          reason: \"invalid-evidence\",\n          detail\n        })\n      )\n    )\n  );\n\nexport const DocumentationRequirementSchema = Schema.Struct({\n  id: NonEmptyStringSchema,\n  description: NonEmptyStringSchema,\n  questionnaire: NonEmptyStringSchema\n});\n\nexport type DocumentationRequirement =\n  typeof DocumentationRequirementSchema.Type;\n\nexport const AuthorizationRequestSchema = Schema.Struct({\n  patient: Schema.Struct({\n    memberId: NonEmptyStringSchema,\n    dob: IsoDateStringSchema\n  }),\n  provider: Schema.Struct({\n    npi: NpiSchema,\n    tin: TinSchema\n  }),\n  service: Schema.Struct({\n    code: NonEmptyStringSchema,\n    codeSystem: NonEmptyStringSchema,\n    diagnosis: Schema.Array(NonEmptyStringSchema),\n    placeOfService: NonEmptyStringSchema,\n    requestedStart: IsoDateStringSchema,\n    units: UnitsSchema,\n    urgency: Schema.Literal(\"standard\", \"expedited\")\n  }),\n  supportingInfo: Schema.Array(SupportingInfoSchema)\n});\n\nexport type AuthorizationRequest = typeof AuthorizationRequestSchema.Type;\n\nexport type ProtocolErrorKind =\n  | \"validation\"\n  | \"transport\"\n  | \"workflow\"\n  | \"payer\";\n\nexport type ProtocolErrorReason =\n  | \"invalid-request\"\n  | \"invalid-evidence\"\n  | \"invalid-determination\"\n  | \"invalid-terminal-determination\"\n  | \"invalid-resume-token\"\n  | \"invalid-subscription-event\"\n  | \"unknown-subscription\"\n  | \"subscription-timeout\"\n  | \"evidence-required\"\n  | \"evidence-missing-requirements\"\n  | \"evidence-collection-failed\"\n  | \"max-steps-exceeded\"\n  | \"policy-evaluation-failed\"\n  | \"policy-review-failed\"\n  | \"http-error\"\n  | \"http-timeout\"\n  | \"http-request-failed\"\n  | \"missing-base-url\"\n  | \"smart-auth-configuration-invalid\"\n  | \"smart-configuration-failed\"\n  | \"smart-token-request-failed\"\n  | \"smart-token-response-invalid\"\n  | \"transport-authorize-failed\"\n  | \"transport-resume-failed\"\n  | \"transport-await-failed\"\n  | \"transport-audit-failed\"\n  | \"transport-verify-failed\"\n  | \"transport-capabilities-failed\"\n  | (string & {});\n\n/**\n * Structured protocol failure raised by the SDK and Effect services.\n *\n * @example\n * try {\n *   await client.request(request);\n * } catch (error) {\n *   if (error instanceof ProtocolError && error.kind === \"validation\") {\n *     console.error(error.reason, error.detail);\n *   }\n * }\n */\nexport class ProtocolError extends Data.TaggedError(\"ProtocolError\")<{\n  readonly reason: ProtocolErrorReason;\n  readonly kind?: ProtocolErrorKind;\n  readonly detail?: unknown;\n  readonly requestId?: string;\n}> {\n  override get message(): string {\n    const kind = this.kind ? `${this.kind}: ` : \"\";\n    return `${kind}${this.reason}`;\n  }\n}\n\nexport const decodeAuthorizationRequest = (\n  input: unknown\n): Effect.Effect<AuthorizationRequest, ProtocolError> =>\n  Effect.suspend(() =>\n    Schema.decodeUnknown(AuthorizationRequestSchema)(input).pipe(\n      Effect.mapError(\n        (detail) =>\n          new ProtocolError({\n            kind: \"validation\",\n            reason: \"invalid-request\",\n            detail\n          })\n      )\n    )\n  ).pipe(\n    Effect.catchAllDefect((detail) =>\n      Effect.fail(\n        new ProtocolError({\n          kind: \"validation\",\n          reason: \"invalid-request\",\n          detail\n        })\n      )\n    )\n  );\n\nexport type DeterminationStatus =\n  | \"approved\"\n  | \"denied\"\n  | \"info-needed\"\n  | \"pended\"\n  | \"error\";\n\nexport type NextAction =\n  | \"none\"\n  | \"attach-evidence\"\n  | \"await-payer\"\n  | \"appeal\"\n  | \"contact-payer\";\n\nexport type PendingReason =\n  | \"human-review\"\n  | \"payer-processing\"\n  | \"external-records\";\n\nexport type DeterminationBy = \"rules\" | \"clinical-reviewer\" | null;\n\nexport interface SignatureReceipt {\n  readonly alg: \"EdDSA\";\n  readonly format: \"detached-json\";\n  readonly keyId: string;\n  readonly issuedAt: string;\n  readonly requestHash: string;\n  readonly payloadHash: string;\n  readonly nonce: string;\n  readonly signature: string;\n}\n\nexport interface X278Capabilities {\n  readonly protocol: \"x278\";\n  readonly implementation: string;\n  readonly endpoints: {\n    readonly authorize: string;\n    readonly resume: string;\n    readonly awaitDetermination: string;\n    readonly auditLog?: string;\n    readonly verify?: string;\n  };\n  readonly signing?: {\n    readonly alg: SignatureReceipt[\"alg\"];\n    readonly publicKeyPem?: string;\n  };\n}\n\nexport const SignatureReceiptSchema = Schema.Struct({\n  alg: Schema.Literal(\"EdDSA\"),\n  format: Schema.Literal(\"detached-json\"),\n  keyId: Schema.String,\n  issuedAt: Schema.String,\n  requestHash: Schema.String,\n  payloadHash: Schema.String,\n  nonce: Schema.String,\n  signature: Schema.String\n});\n\nexport interface DeterminationBase {\n  readonly authId: string;\n  readonly status: DeterminationStatus;\n  readonly nextAction: NextAction;\n  readonly ruleSetVersion: string;\n  readonly expiresAt: string | null;\n  readonly determinationBy: DeterminationBy;\n}\n\nexport interface ApprovedDetermination extends DeterminationBase {\n  readonly status: \"approved\";\n  readonly nextAction: \"none\";\n  readonly authNumber: string;\n  readonly approvedUnits: number;\n  readonly validFrom: string;\n  readonly validThrough: string;\n  readonly determinationBy: \"rules\" | \"clinical-reviewer\";\n  readonly signature: SignatureReceipt;\n}\n\nexport const ApprovedDeterminationSchema = Schema.Struct({\n  authId: Schema.String,\n  status: Schema.Literal(\"approved\"),\n  nextAction: Schema.Literal(\"none\"),\n  ruleSetVersion: Schema.String,\n  expiresAt: Schema.NullOr(Schema.String),\n  determinationBy: Schema.Literal(\"rules\", \"clinical-reviewer\"),\n  authNumber: Schema.String,\n  approvedUnits: UnitsSchema,\n  validFrom: IsoDateStringSchema,\n  validThrough: IsoDateStringSchema,\n  signature: SignatureReceiptSchema\n});\n\nexport type UnsignedApprovedDetermination = Omit<\n  ApprovedDetermination,\n  \"signature\"\n>;\n\nexport interface DeniedDetermination extends DeterminationBase {\n  readonly status: \"denied\";\n  readonly nextAction: \"appeal\";\n  readonly reasonCode: string;\n  readonly reasonText: string;\n  readonly appealPath: string;\n  readonly determinationBy: \"rules\" | \"clinical-reviewer\";\n  readonly signature: SignatureReceipt;\n}\n\nexport const DeniedDeterminationSchema = Schema.Struct({\n  authId: Schema.String,\n  status: Schema.Literal(\"denied\"),\n  nextAction: Schema.Literal(\"appeal\"),\n  ruleSetVersion: Schema.String,\n  expiresAt: Schema.NullOr(Schema.String),\n  determinationBy: Schema.Literal(\"rules\", \"clinical-reviewer\"),\n  reasonCode: Schema.String,\n  reasonText: Schema.String,\n  appealPath: Schema.String,\n  signature: SignatureReceiptSchema\n});\n\nexport type UnsignedDeniedDetermination = Omit<DeniedDetermination, \"signature\">;\n\nexport type UnsignedTerminalDetermination =\n  | UnsignedApprovedDetermination\n  | UnsignedDeniedDetermination;\n\nexport interface InfoNeededDetermination extends DeterminationBase {\n  readonly status: \"info-needed\";\n  readonly nextAction: \"attach-evidence\";\n  readonly documentationRequired: ReadonlyArray<DocumentationRequirement>;\n  readonly resumeToken: string;\n  readonly determinationBy: null;\n}\n\nexport const InfoNeededDeterminationSchema = Schema.Struct({\n  authId: Schema.String,\n  status: Schema.Literal(\"info-needed\"),\n  nextAction: Schema.Literal(\"attach-evidence\"),\n  ruleSetVersion: Schema.String,\n  expiresAt: Schema.NullOr(Schema.String),\n  determinationBy: Schema.Null,\n  documentationRequired: Schema.Array(DocumentationRequirementSchema),\n  resumeToken: Schema.String\n});\n\nexport interface PendedDetermination extends DeterminationBase {\n  readonly status: \"pended\";\n  readonly nextAction: \"await-payer\";\n  readonly pendingReason: PendingReason;\n  readonly subscription: string;\n  readonly determinationBy: \"clinical-reviewer\" | null;\n}\n\nexport const PendedDeterminationSchema = Schema.Struct({\n  authId: Schema.String,\n  status: Schema.Literal(\"pended\"),\n  nextAction: Schema.Literal(\"await-payer\"),\n  ruleSetVersion: Schema.String,\n  expiresAt: Schema.NullOr(Schema.String),\n  determinationBy: Schema.NullOr(Schema.Literal(\"clinical-reviewer\")),\n  pendingReason: Schema.Literal(\n    \"human-review\",\n    \"payer-processing\",\n    \"external-records\"\n  ),\n  subscription: Schema.String\n});\n\nexport interface ErrorDetermination extends DeterminationBase {\n  readonly status: \"error\";\n  readonly nextAction: \"contact-payer\";\n  readonly reasonCode: string;\n  readonly reasonText: string;\n  readonly determinationBy: null;\n}\n\nexport const ErrorDeterminationSchema = Schema.Struct({\n  authId: Schema.String,\n  status: Schema.Literal(\"error\"),\n  nextAction: Schema.Literal(\"contact-payer\"),\n  ruleSetVersion: Schema.String,\n  expiresAt: Schema.NullOr(Schema.String),\n  determinationBy: Schema.Null,\n  reasonCode: Schema.String,\n  reasonText: Schema.String\n});\n\nexport type TerminalDetermination =\n  | ApprovedDetermination\n  | DeniedDetermination;\n\nexport type NonTerminalDetermination =\n  | InfoNeededDetermination\n  | PendedDetermination;\n\nexport type Determination =\n  | TerminalDetermination\n  | NonTerminalDetermination\n  | ErrorDetermination;\n\nexport const TerminalDeterminationSchema = Schema.Union(\n  ApprovedDeterminationSchema,\n  DeniedDeterminationSchema\n);\n\nexport const DeterminationSchema = Schema.Union(\n  ApprovedDeterminationSchema,\n  DeniedDeterminationSchema,\n  InfoNeededDeterminationSchema,\n  PendedDeterminationSchema,\n  ErrorDeterminationSchema\n);\n\nexport const decodeDetermination = (\n  input: unknown\n): Effect.Effect<Determination, ProtocolError> =>\n  Effect.suspend(() =>\n    Schema.decodeUnknown(DeterminationSchema)(input).pipe(\n      Effect.mapError(\n        (detail) =>\n          new ProtocolError({\n            kind: \"validation\",\n            reason: \"invalid-determination\",\n            detail\n          })\n      )\n    )\n  ).pipe(\n    Effect.catchAllDefect((detail) =>\n      Effect.fail(\n        new ProtocolError({\n          kind: \"validation\",\n          reason: \"invalid-determination\",\n          detail\n        })\n      )\n    )\n  );\n\nexport const decodeTerminalDetermination = (\n  input: unknown\n): Effect.Effect<TerminalDetermination, ProtocolError> =>\n  Effect.suspend(() =>\n    Schema.decodeUnknown(TerminalDeterminationSchema)(input).pipe(\n      Effect.mapError(\n        (detail) =>\n          new ProtocolError({\n            kind: \"validation\",\n            reason: \"invalid-terminal-determination\",\n            detail\n          })\n      )\n    )\n  ).pipe(\n    Effect.catchAllDefect((detail) =>\n      Effect.fail(\n        new ProtocolError({\n          kind: \"validation\",\n          reason: \"invalid-terminal-determination\",\n          detail\n        })\n      )\n    )\n  );\n\nexport interface AuditRecord {\n  readonly authId: string;\n  readonly status: TerminalDetermination[\"status\"];\n  readonly requestHash: string;\n  readonly determinationHash: string;\n  readonly signatureKeyId: string;\n  readonly appendedAt: string;\n}\n","import { Effect } from \"effect\";\nimport type { AuthorizationRequest, DocumentationRequirement, SupportingInfo } from \"./domain.js\";\nimport { ProtocolError, decodeSupportingInfoList } from \"./domain.js\";\nimport type { FhirResource } from \"./fhir-pas.js\";\n\nexport type EvidenceValueResolver = (\n  requirement: DocumentationRequirement\n) => string | SupportingInfo;\n\nexport interface DtrQuestionnaireResponseOptions {\n  readonly authored?: string;\n  readonly authorReference?: string;\n  readonly subjectReference?: string;\n}\n\nconst isEvidenceArray = (\n  value: AuthorizationRequest | ReadonlyArray<SupportingInfo>\n): value is ReadonlyArray<SupportingInfo> => Array.isArray(value);\n\nconst evidenceIds = (\n  evidenceOrRequest: AuthorizationRequest | ReadonlyArray<SupportingInfo>\n): Set<string> => {\n  const evidence: ReadonlyArray<SupportingInfo> = isEvidenceArray(evidenceOrRequest)\n    ? evidenceOrRequest\n    : evidenceOrRequest.supportingInfo;\n\n  return new Set(evidence.map((item) => item.id));\n};\n\n/**\n * Creates a supporting-info attachment for a documentation requirement.\n *\n * @example\n * const evidence = createEvidenceForRequirement(requirement, \"chart note text\");\n */\nexport const createEvidenceForRequirement = (\n  requirement: DocumentationRequirement,\n  value: string,\n  source: SupportingInfo[\"source\"] = \"chart\"\n): SupportingInfo => ({\n  id: requirement.id,\n  value,\n  source\n});\n\n/**\n * Creates evidence for every returned documentation requirement.\n */\nexport const createEvidenceForRequirements = (\n  requirements: ReadonlyArray<DocumentationRequirement>,\n  resolve: EvidenceValueResolver\n): ReadonlyArray<SupportingInfo> =>\n  requirements.map((requirement) => {\n    const resolved = resolve(requirement);\n    return typeof resolved === \"string\"\n      ? createEvidenceForRequirement(requirement, resolved)\n      : resolved;\n  });\n\n/**\n * Returns the requirements not yet satisfied by the supplied request/evidence.\n */\nexport const missingEvidenceRequirements = (\n  requirements: ReadonlyArray<DocumentationRequirement>,\n  evidenceOrRequest: AuthorizationRequest | ReadonlyArray<SupportingInfo>\n): ReadonlyArray<DocumentationRequirement> => {\n  const supplied = evidenceIds(evidenceOrRequest);\n  return requirements.filter((requirement) => !supplied.has(requirement.id));\n};\n\nexport const evidenceSatisfiesRequirements = (\n  requirements: ReadonlyArray<DocumentationRequirement>,\n  evidenceOrRequest: AuthorizationRequest | ReadonlyArray<SupportingInfo>\n): boolean => missingEvidenceRequirements(requirements, evidenceOrRequest).length === 0;\n\nexport const assertEvidenceSatisfiesRequirements = async (\n  requirements: ReadonlyArray<DocumentationRequirement>,\n  evidence: unknown\n): Promise<ReadonlyArray<SupportingInfo>> => {\n  const decoded = await Effect.runPromise(decodeSupportingInfoList(evidence));\n  const missing = missingEvidenceRequirements(requirements, decoded);\n\n  if (missing.length > 0) {\n    throw new ProtocolError({\n      kind: \"validation\",\n      reason: \"evidence-missing-requirements\",\n      detail: missing\n    });\n  }\n\n  return decoded;\n};\n\n/**\n * Converts x278 evidence into DTR-style QuestionnaireResponse resources.\n */\nexport const toDtrQuestionnaireResponses = (\n  requirements: ReadonlyArray<DocumentationRequirement>,\n  evidence: ReadonlyArray<SupportingInfo>,\n  options: DtrQuestionnaireResponseOptions = {}\n): ReadonlyArray<FhirResource> => {\n  const evidenceById = new Map(evidence.map((item) => [item.id, item]));\n\n  return requirements.map((requirement) => {\n    const answer = evidenceById.get(requirement.id);\n\n    return {\n      resourceType: \"QuestionnaireResponse\",\n      id: `qr-${requirement.id}`,\n      questionnaire: requirement.questionnaire,\n      status: answer ? \"completed\" : \"in-progress\",\n      ...(options.authored ? { authored: options.authored } : {}),\n      ...(options.authorReference\n        ? { author: { reference: options.authorReference } }\n        : {}),\n      ...(options.subjectReference\n        ? { subject: { reference: options.subjectReference } }\n        : {}),\n      item: [\n        {\n          linkId: requirement.id,\n          text: requirement.description,\n          ...(answer\n            ? {\n                answer: [\n                  {\n                    valueString: answer.value\n                  }\n                ]\n              }\n            : {})\n        }\n      ]\n    };\n  });\n};\n"]}