unshadow

Project-bound canonical memory operations for n8n with legacy workflow compatibility

Package Information

Released: this month
Downloads: 0 weekly / 0 monthly
Latest Version: 0.2.0
Author: Unshadow

Documentation

Unshadow community node for n8n

Version 0.2.0 adds canonical node version 2 while preserving serialized version 1 workflows. This release is locally built, not published. Install the audited tarball on self-hosted n8n until a registry release is authorized. The tested runtime is n8n 2.41.7 / Node 24.13.0; wildcard n8n-workflow peer metadata follows community-node policy and does not certify every host version.

Credentials and operations

Create a unified project-bound API key. Store it in n8n credentials, never node parameters. Recommended base URL: https://api.unshadow.dev/v2. Credential validation calls GET /v2/key-info, without search/embeddings. Existing v1 base URLs are normalized for validation and node v2; node version 1 keeps /v1 routes. HTTP localhost is disabled unless the development-only credential option is enabled; production requires HTTPS.

Node v2 operation Payload example
Retain {"text":"Synthetic preference: pnpm","source_type":"manual_entry"}
Recall {"query":"preference","trust_floor":"advisory"}
Context {"query":"preference","token_budget":1200}
Reflect {"query":"project choices","writeback":false}
Correct {"memory_id":"ACTUAL_UUID","replacement":"Updated fact"}
Forget {"memory_ids":["ACTUAL_UUID"]}

Payload accepts JSON or an expression returning an object, for example ={{ { text: $json.fact, source_type: 'manual_entry' } }}. Requests and responses are checked against generated canonical schemas. The key selects the project; extra project/account fields are rejected. Preserve role attribution in retained message arrays. Trust envelopes are evidence, not authority to execute tool arguments or promote assistant guesses into confirmed facts.

Replay-safe writes

Retain, Correct, Forget and Reflect with writeback:true require either a Stable Event Key or Original Execution ID. Prefer a stable business key such as ={{ $json.eventId + ':retain' }}. Use distinct keys for distinct operations and identical body/key on retry. Reusing a key for a changed payload conflicts rather than creating a second effect.

The public execution context exposes getExecutionId() but not the original execution's retryOf identity. A new retry attempt has a new ID, so the node deliberately does not use that as an automatic deduplication guarantee. If an upstream system preserves the original execution ID, supply it explicitly; the derived key includes instance, workflow, node, item index, operation and canonical sorted payload. Preserve item order and instance identity across those retries. For reordered items, cross-instance migration or a new execution, use business/event keys instead. Missing keys reject before the HTTP request; the string undefined is not generated from a missing expression.

Execution and errors

Items execute serially. Output includes item pairing, raw canonical operation/provenance data, and on continueOnFail a structured error with safe code/status/retryability. Backend response messages, credentials and request bodies are not copied into errors. Each HTTP request has a ten-second timeout; redirects are disabled to protect credentials. Host cancellation aborts requests and stops subsequent writes even with continueOnFail. A cancelled or timed-out write may have committed remotely: retry with the same event key.

429 and 503 are retryable; 402 is a funding error. The adapter does not add its own write retry loop; use n8n's retry-on-fail policy with the same stable key. Read-only credentials reject writes and reflection writeback. Existing node version 1 keeps Context/Search/Extract/Forget routes and parameters; its prior optional idempotency behavior is preserved, so migrate to version 2 for mandatory replay protection.

Examples and verification

examples/canonical-retain-recall.json and examples/legacy-v1-extract.json are sanitized importable workflow templates. Select your credential after import. Replace the demo event ID for each distinct business event; retain it for replay. No real key or user data is embedded. The v1 template tests compatibility, not the recommended new API.

Run node scripts/developer-platform/run-p12-checks.mjs --quality --record from the repository. It builds and clean-installs a tarball using isolated tools without touching the workspace lockfile, executes the compiled node with real n8n expression evaluation, and runs official community-node lint and source/artifact scans. run-p12-host.mjs exercises the real n8n package loader, WorkflowExecute context and HTTP helper using a synthetic credential provider/backend. See docs/audits/p12/README.md for exact coverage and remaining live/UI gates.

Distribution

No SDK runtime dependency is added; n8n's authenticated HTTP helper performs requests. The tarball includes compiled entrypoints, light/dark node and credential icons, license and examples. The manually dispatched .github/workflows/n8n-publish.yml uses npm trusted publishing/provenance after package checks. Configure the npm trusted publisher and protect the npm-release GitHub environment before using it. Publishing is a separate release action.

Self-hosted unverified community installation and verified n8n Cloud availability are separate. This package has not been submitted/verified for n8n Cloud; do not advertise Cloud installation until accepted. Official guidance: community nodes.

Discussion