npm.io
1.0.0-rc.4 • Published 2 weeks ago

@x12i/nexum

Licence
Apache-2.0
Version
1.0.0-rc.4
Deps
0
Size
324 kB
Vulns
0
Weekly
0

@x12i/nexum

Platform-neutral evidence-graph compiler. Protocol x12i-nexum/1.

No Memorix, Fastify, Mongo, or network I/O. analyze returns a draft and a per-item apply plan. It never writes a database.

npm install @x12i/nexum

Node 18+. ESM only ("type": "module").

Full host + worker copy-paste: x12i/nexum README.


Analyze

import {
  analyze,
  analyzeRequest,
  structuredItem,
  contentItem,
} from "@x12i/nexum";

const result = await analyze({
  request: analyzeRequest([
    structuredItem("credorix", "product", {
      name: "Credorix",
      ownerTeamId: "identity-team",
    }),
    contentItem(
      "auth",
      "# Auth\n\nSee [Credorix](nexum://product/credorix).\n\n## Tokens\n",
      { title: "Auth" },
    ),
  ]),
});

result.graphDraft.nodes;
result.graphDraft.propertyClaims;
result.graphDraft.edgeClaims;
result.applyPlan.actions; // replace-contribution | remove-contribution
result.itemResults;       // ok | failed | skipped
result.diagnostics;

Explicit request (no test helpers):

import {
  ANALYZER_VERSION,
  DEFAULT_LIMITS,
  NEXUM_PROTOCOL,
  analyze,
  coreRegistrySnapshot,
} from "@x12i/nexum";

await analyze({
  request: {
    protocol: NEXUM_PROTOCOL,
    scope: { organizationId: "acme", graphId: "default" },
    items: [
      {
        sourceRef: { namespace: "records", id: "credorix" },
        inputKind: "structured",
        objectType: "product",
        data: { name: "Credorix", ownerTeamId: "identity-team" },
      },
    ],
    registry: coreRegistrySnapshot(),
    options: {
      analyzerVersion: ANALYZER_VERSION,
      deterministicOnly: true,
      crossItemInference: true,
      limits: { ...DEFAULT_LIMITS },
    },
  },
});

Input kinds

inputKind objectType Body
structured product, team, service, person, object, … data object
content document content string (format: "markdown" | "text")
json-schema schema JSON Schema in data
openapi openapi OpenAPI 3.x or Swagger 2.0 in data
endpoint endpoint { method, path } in data

Mapped structured fields (core registry):

{
  name: "Credorix",
  ownerTeamId: "identity-team", // owned_by → team stub
  parentId: "platform",         // parent --parent_of--> this node
  uses: ["entra-id"],           // uses → technology stub
  externalAuthority: "sku",
  externalId: "X-1",            // exact auto-merge key
}

Markdown links: nexum://{type}/{id}. Other schemes need referenceResolvers.

await analyze({
  request: analyzeRequest([contentItem("d", "See [P](nexum://product/p).\n")]),
  // referenceResolvers: [{ scheme: "memorix", resolve(uri) { ... } }],
});

Delete:

analyzeRequest([], {
  deletions: [{ sourceRef: { namespace: "records", id: "credorix" } }],
});

Identity

  • Node id: {type}:{namespace}:{id} or {type}:derived:{slug}-{hash12}
  • Auto-merge: exact source id or exact externalAuthority + externalId
  • Same label across types/namespaces: not merged (review candidate)
  • parentId is the parent of the current record (parent_of source → child)

Optional AI

import {
  ANALYZER_VERSION,
  DEFAULT_LIMITS,
  analyze,
  analyzeRequest,
  contentItem,
  createFakeSemanticProvider,
  spanFact,
} from "@x12i/nexum";

const provider = createFakeSemanticProvider((req) => ({
  facts: [
    spanFact(req.chunk.text, "Alpha uses Beta", {
      kind: "relation",
      relation: "uses",
      sourceLabel: "Alpha",
      targetLabel: "Beta",
    }),
  ],
  tokensIn: 10,
  tokensOut: 5,
});

await analyze({
  semanticProvider: provider,
  semanticBudget: { maxInputTokens: 50_000, maxOutputTokens: 16_000, maxChunks: 24 },
  request: {
    ...analyzeRequest([contentItem("p", "Alpha uses Beta in production.")]),
    options: {
      analyzerVersion: ANALYZER_VERSION,
      deterministicOnly: false,
      crossItemInference: false,
      semantic: {
        enabled: true,
        required: false,
        policyId: "default",
        promptVersion: "nexum-semantic-1",
        providerModel: "fake",
        requireReviewForAiFacts: false,
      },
      limits: { ...DEFAULT_LIMITS },
    },
  },
});

Implement NexumSemanticProvider for a real model. Quotes must be exact spans. Missing provider + required: false → deterministic success, semantic.status: "unavailable".


Errors and abort

import { isNexumError } from "@x12i/nexum";

try {
  await analyze({ request, signal });
} catch (err) {
  if (isNexumError(err)) {
    // err.code, err.retryable, err.details
  }
  throw err;
}

NEXUM_VALIDATION, NEXUM_LIMIT_EXCEEDED, NEXUM_REGISTRY_MISSING, NEXUM_ABORTED, NEXUM_SEMANTIC_UNAVAILABLE, NEXUM_SEMANTIC_BUDGET_EXCEEDED.

Unknown objectType fails that item (itemResults[].status === "failed"), not the whole request.


Public exports

analyze, analyzeRequest, structuredItem, contentItem, coreRegistrySnapshot, canonicalize, hashCanonical, NexumError, isNexumError, NEXUM_PROTOCOL, ANALYZER_VERSION, DEFAULT_LIMITS, createFakeSemanticProvider, spanFact, graph algorithms (neighborhood, shortestPath, detectCycles, communities).

Types: NexumAnalyzeRequest, NexumAnalyzeResult, NexumItem, NexumSemanticProvider, AnalyzeInvocation.

Keywords