# @hostwebhook/node-types

Shared node type definitions, connection rules, dispatch config and the
centralized `NODE_REGISTRY` for HostWebhook. Read by all three repos -- the api,
hw-nodes and the dashboard -- so that a node's type, prefix, colour, allowed
connections and dispatch target are written once instead of three times.

**No dependencies and no peer dependencies.** That is deliberate: the dashboard
loads this package in the browser, and anything pulled in here would be pulled
in there. It also ships a tree-shakeable ESM branch alongside CommonJS, so
asking for one export does not drag in the Gmail, Notion and GitHub operation
catalogues (measured: 219 kB down to 61 kB in the dashboard's MCP app bundle).

```bash
npm install @hostwebhook/node-types
```

## What's in it

| Export | What it answers |
|---|---|
| `NodeType`, `ALL_NODE_TYPES` | Which node types exist |
| `NODE_REGISTRY`, `getNodeRegistryEntry` | Everything known about one node type |
| `NODE_CONNECTIONS`, `canReceiveFrom` | What may connect to what |
| `NODE_DISPATCH`, `getNodeDispatchConfig` | Which collection and service run a node |
| `NODE_UI`, `resolveNodeId` | Canvas handles, prefixes, colours |
| `CREDENTIAL_TYPES` | The credential type registry |
| `*_OPERATIONS`, `*_TOOLKIT_*` | Per-integration operation catalogues |
| `armarRespuestaDelSync` | The sync-mode HTTP response, built in one place |

## Two things worth knowing before you edit

**This file must be UTF-8.** It was a 36-byte UTF-16 stub until 2026-09-11,
when npm's registry began rejecting such manifests outright: `400 Bad Request
... manifest contains an unsupported NUL character`. Version 1.77.0 published
fine the day before with the exact same file, so the rule is new and it is not
retroactive -- the next publish of any package whose README a Windows `>`
redirect ever touched will fail the same way. `npm publish` always includes the
README, regardless of `files`.

**Relative imports inside `src/` need the `.js` extension.** Without it the ESM
branch still works in every bundler and dies in Node with
`ERR_MODULE_NOT_FOUND`. `__tests__/paquete-doble.test.ts` is what catches that,
along with `sideEffects: false` going missing and the `exports` map closing a
deep path someone else already depends on.
