# @x12i/memorix-resolvers

> Pluggable resolver APIs for Memorix — normalize join keys, bridge lookups, and domain-specific relationship resolution

Latest version **1.34.0** (published 2026-07-21) · exellix-license license · 0 weekly downloads

## Install

```sh
npm install @x12i/memorix-resolvers
pnpm add @x12i/memorix-resolvers
yarn add @x12i/memorix-resolvers
bun add @x12i/memorix-resolvers
```

## Health

**Score 70/100 (B)** — status: active.

Positive: has types; esm support; no vulnerabilities; recently updated; high maintenance score; high quality score.

Warnings: low downloads.

## Facts

| | |
|---|---|
| Version | 1.34.0 |
| Published | 2026-07-21 |
| First published | 2026-07-05 |
| Weekly downloads | 0 |
| License | exellix-license |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >=18.0.0 |
| Dependencies | 0 |
| Unpacked size | 279.3 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | x12i |
| Keywords | memorix, resolvers, join, enrichment |

## Links

- npm: https://www.npmjs.com/package/@x12i/memorix-resolvers
- Repository: https://github.com/x12i/memorix-mono-repo
- Homepage: https://github.com/x12i/memorix-mono-repo#readme
- Issues: https://github.com/x12i/memorix-mono-repo/issues
- npm.io page: https://npm.io/package/@x12i/memorix-resolvers

## Alternatives

- [base64url](https://npm.io/package/base64url.md) — 6.1M weekly downloads
- [get-installed-path](https://npm.io/package/get-installed-path.md) — 502.9K weekly downloads
- [@uppy/url](https://npm.io/package/@uppy/url.md) — 185.8K weekly downloads
- [@d3fc/d3fc-shape](https://npm.io/package/@d3fc/d3fc-shape.md) — 16.2K weekly downloads
- [localizer](https://npm.io/package/localizer.md) — 226 weekly downloads

## Recent versions

- 1.34.0 (latest) — 2026-07-21
- 1.33.0 — 2026-07-19
- 1.32.0 — 2026-07-11
- 1.2.0 — 2026-07-07
- 1.0.0 — 2026-07-05
- 1.1.0 — 2026-07-05

## README

# @x12i/memorix-resolvers

Pluggable resolver APIs for Memorix. Resolvers normalize join keys, bridge lookups, and domain-specific relationship signals without baking domain knowledge into the pipeline engine.

Used in:

- **Pipeline `resolution` / `enrichment` stages** — via descriptor `processing.resolvers` (see [`memorix-pipeline`](../memorix-pipeline/README.md))
- **Associator requests** — optional `resolvers` / `normalization` blocks before cross-record join rules

## Design

- **Resolver registry** — register built-in and custom resolver types.
- **Resolver steps** — run one or more resolvers against a source record.
- **Domain plug-ins** — networking, pharma, marketing, identity, or any future domain implements the same `ResolverDefinition` API.
- **Remote resolvers** — HTTP providers registered through Explorer `/pipeline/registry/parts` and merged at pipeline run time.

The engine does not branch on resolver type. A CIDR containment resolver, pharma SKU resolver, and marketing campaign resolver are all ordinary plug-ins.

## Usage

```typescript
import {
  createResolverRegistry,
  builtinResolvers,
  runResolverSteps,
  type ResolverDefinition,
} from "@x12i/memorix-resolvers";

const registry = createResolverRegistry(builtinResolvers);

const myResolver: ResolverDefinition<{ outputPath: string }> = {
  type: "my-domain",
  create(config) {
    return {
      async resolve(input) {
        return {
          outputs: [{ path: config.outputPath, values: ["resolved"] }],
          stats: { inputsScanned: 1, valuesParsed: 1, valuesRejected: 0, matchesFound: 1, ambiguousMatches: 0 },
          diagnostics: [],
        };
      },
    };
  },
};

registry.register(myResolver);

const result = await runResolverSteps(registry, {
  steps: [{ type: "my-domain", resolverKey: "step-1", config: { outputPath: "data.key" } }],
  record: { data: {} },
});
```

## Built-in resolvers

| Type | Purpose | Typical pipeline stage |
|------|---------|------------------------|
| `exact-match` | Copy normalized values from source paths to an output path | resolution |
| `multi-value` | Split comma-separated scalars into array join fields | resolution |
| `bridge-index` | Map readable keys through a bridge collection to target join keys | resolution |
| `markdown-key-value` | Parse `**Label:** value` markdown strings into plain objects | resolution |
| `markdown-pipe-records` | Parse pipe-delimited `**ID:** … \| **Name:** …` lines into object arrays | resolution |
| `path-existence-classifier` | Classify path objects into `attackPathExistence` enum (`supported`\|`possible`\|`limited`\|`none`\|`unknown`) from `pathContext` / `attackPathMeaning` | resolution |
| `identifier-key` | Ensure `concept._extIdentifier.key` (`kind` + values, `:`-joined; migrates legacy `concept.identifier`) | resolution |
| `vulnerability-concept` | Fix vulnerability snapshot title + `hostVulnerability` `_extIdentifier` + `vulnerabilityGroupIdentifierKey` | resolution |
| `subnet-cidr` | Normalize CIDR or resolve asset IPs to canonical subnet CIDRs | resolution |
| `subnet-key` | Derive legacy `subnetIp` / `subnetId` from IP or CIDR network portion | resolution |
| `topology-extractor` | Build `associatedTopology` from `associatedData` or subnet IP lookup | resolution |
| `zone-from-topology` | Remediate UNKNOWN subnet `data.zone` from `topology-raw` graph | enrichment |

Assignments are declared per object type in entity descriptor `processing.resolvers`. The pipeline parts catalog (`loadPipelinePartsCatalog`) indexes which types use each resolver.

## Related packages

- [Running resolvers](../memorix-pipeline/docs/running-resolvers.md) — operational guide
- [`@x12i/memorix-pipeline`](../memorix-pipeline/) — runs resolver steps during resolution/enrichment stages
- [`@x12i/memorix-associator`](../memorix-associator/) — may run resolvers in association request rules before joins
- [Operational design note](../memorix-catalox-api/src/operational/memorix-enrichment-processes.md)

---
_Source: https://npm.io/package/@x12i/memorix-resolvers · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
