fieldnote-ops
relayloom
Default-off external chat relay for agent harnesses; first adapter targets DingTalk Stream.
- Stars
- 1
- Language
- JavaScript
- Created
- Aug 14, 2026
- Updated
- Aug 15, 2026
Introduction
RelayLoom
RelayLoom is an independent, default-off external chat relay for agent harnesses. Its first compatibility adapter connects the public DingTalk Stream protocol to DeepSeek Harness agents.
This repository is a developer preview, not a verified production bot. The credential-free core, official SDK binding, webhook transport, and real DSH install/boot path are tested; no real DingTalk tenant has yet completed the receive → ACK → reply round trip.
What is implemented
- immediate callback ACK before asynchronous model work settles;
- retry deduplication by
msgIdand bounded memory use; - direct-message and group-mention filtering;
- default-deny staff-id allowlist;
- stable sender-isolated sessions with deterministic non-secret storage ids;
- DSH agent create/resume, preset mounting, committed-answer delivery, cancellation, and bounded teardown;
- single-use, expiring, sender-and-conversation-bound
/approveand/rejectdecisions; - official
sessionWebhookMarkdown replies with exact HTTPS host allowlisting, redirect denial, response limits, timeout, expiry checks, and output chunking; - a default
enabled: falsebundle, so installation and boot do not read credentials or make DingTalk requests.
The text approval flow is a safe fallback, not a claim that interactive approval cards work. Card rendering/update, attachments, reconnect replay, and a tenant-observed round trip remain deferred.
Live tenant transport probe
Version 0.2.2 includes an explicit opt-in probe for closing the remaining transport evidence gap without calling a model or DSH agent. It waits for one random challenge from one configured staff account, immediately ACKs the Stream callback, sends a bounded sessionWebhook reply, and creates a new 0600 JSON report that contains no credentials, raw staff id, conversation id, message id, webhook, or message body.
Clone the repository and install its locked dependencies without lifecycle scripts:
git clone https://github.com/fieldnote-ops/relayloom.git
cd relayloom
npm ci --ignore-scripts --registry=https://registry.npmjs.org
Set DINGTALK_CLIENT_ID, DINGTALK_CLIENT_SECRET, and RELAYLOOM_ALLOWED_USER in the process environment without placing the secret in a committed file or shell-history command, then run:
npm run tenant:smoke
Send the exact random challenge printed by the process to the internal robot. The default wait is 180 seconds. Use RELAYLOOM_PROBE_REPORT for a new workspace-relative report path; an existing report is never overwritten. This command makes real DingTalk network calls and is never run by installation, DSH boot, tests, or CI.
Install from GitHub
For a copy-pasteable install, pin the last publicly verified runtime commit rather than relying on a moving branch:
dsh plugin --profile web add github:fieldnote-ops/relayloom#04338f0f8ef33ba508768ab5026d758d81a10e0a
That commit passed the public Node 24 unit job and DSH rc.6/latest/next consumer matrix. The installed bundle remains disabled. Edit its profile row only after creating a DingTalk internal robot and setting credentials in the launching environment:
- id: relayloom
name: relayloom
config:
enabled: true
clientIdEnv: DINGTALK_CLIENT_ID
clientSecretEnv: DINGTALK_CLIENT_SECRET
allowedUsers:
- your-staff-id
preset: standard
RelayLoom does not read credentials from YAML. Empty allowlists are rejected whenever the bridge is enabled.
Evidence
Local tests cover protocol normalization, ACK ordering, deduplication, serialization, DSH session create/resume, committed output, cancellation, approval actor binding, webhook SSRF defenses, and default-off lifecycle. HarnessProof v0.1.5 installed the exact locked dependency graph in an isolated copy, added the plugin through the official DSH command, observed the bundle layer, booted DSH 0.1.0-rc.6, and received HTTP 200 without credentials or external service calls. The live tenant probe is a separate, explicit network action and its result must not be inferred from HarnessProof.
This does not prove a live DingTalk robot, card approval behavior, independent security review, independent-user adoption, Marketplace acceptance, purchase, or income.
Development
npm ci --ignore-scripts
npm run check
The direct runtime dependency is the official dingtalk-stream Node SDK. Protocol references:
- https://github.com/open-dingtalk/dingtalk-stream-sdk-nodejs
- https://open-dingtalk.github.io/developerpedia/docs/learn/stream/protocol/
- https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/cookbook/extension-cookbook.md
RelayLoom is a FIELD NOTE AI-assisted, human-reviewed interoperability experiment. It is not affiliated with, sponsored by, endorsed by, or an official product of DingTalk, Alibaba, DeepSeek, or their affiliates. Product names identify compatibility targets only; no logos or brand trade dress are used.
MIT licensed.