shroud-privacy 2.5.6 → 2.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -79,7 +79,7 @@ Shroud does not guarantee compliance — regex-based detection has limitations (
79
79
  | `globalThis.__shroudStreamDeobfuscate` | LLM → Agent | Streaming event deobfuscation hook |
80
80
  | `globalThis.__shroudDeobfuscate` | Agent → Channel | Global deobfuscation hook — called by OpenClaw before ANY channel send |
81
81
 
82
- > **How it works:** Shroud intercepts ALL outbound LLM API calls (Anthropic, OpenAI, Google, any provider) at the `fetch` level and obfuscates detected entities in every message — including assistant history and Slack `<mailto:>` markup — before it leaves the process. On the response side, SSE streaming is deobfuscated per content block with buffered flushing. Every delivery path (Slack, WhatsApp, TUI, Telegram, Discord, Signal, web) gets real text automatically. Zero host patches required.
82
+ > **How it works:** Shroud intercepts ALL outbound LLM API calls (Anthropic, OpenAI, Google, any provider) at the `fetch` level and obfuscates detected entities in every message — including assistant history, Slack `<mailto:>` markup, and OpenAI Responses / Codex `input_text` blocks — before it leaves the process. On the response side, SSE streaming is deobfuscated per content block with buffered flushing, and OpenAI Responses `output_text` blocks are treated the same as plain `text` blocks. Every delivery path (Slack, WhatsApp, TUI, Telegram, Discord, Signal, web) gets real text automatically. Zero host patches required.
83
83
 
84
84
  > **Requires OpenClaw 2026.3.24 or later.**
85
85
 
@@ -220,6 +220,15 @@ openclaw plugins install --path .
220
220
  openclaw gateway restart
221
221
  ```
222
222
 
223
+ For a local Docker-backed OpenClaw install, use the repo deploy script instead. It builds the checkout, runs the key regression tests, syncs the packaged plugin into `~/.openclaw/extensions/shroud-privacy`, clears the Node compile cache, and recreates `openclaw-primary-gateway` when `~/.openclaw/compose/docker-compose.primary.yml` is present:
224
+
225
+ ```bash
226
+ git clone https://github.com/wkeything/shroud.git
227
+ cd shroud
228
+ npm install
229
+ ./deploy-local.sh
230
+ ```
231
+
223
232
  ## Updating
224
233
 
225
234
  ```bash
package/dist/hooks.js CHANGED
@@ -415,7 +415,7 @@ export function registerHooks(api, obfuscator) {
415
415
  texts.push(msg.content);
416
416
  else if (Array.isArray(msg.content)) {
417
417
  for (const b of msg.content) {
418
- if (b?.type === "text" && typeof b.text === "string")
418
+ if (typeof b?.text === "string")
419
419
  texts.push(b.text);
420
420
  }
421
421
  }
@@ -475,7 +475,7 @@ export function registerHooks(api, obfuscator) {
475
475
  if (!b || typeof b !== "object")
476
476
  return b;
477
477
  let newBlock = b;
478
- if (b.type === "text" && typeof b.text === "string") {
478
+ if (typeof b.text === "string") {
479
479
  const cleaned = stripSlackLinksForHook(b.text);
480
480
  const result = ob().obfuscate(cleaned, undefined, _exemptCats);
481
481
  totalEntities += result.entities.length;
@@ -1139,7 +1139,7 @@ export function registerHooks(api, obfuscator) {
1139
1139
  else if (Array.isArray(msg.content)) {
1140
1140
  const isAssistant = msg.role === "assistant" || msg.role === "model";
1141
1141
  for (const block of msg.content) {
1142
- if (block?.type === "text" && typeof block.text === "string") {
1142
+ if (typeof block?.text === "string") {
1143
1143
  const r = obfuscateText(block.text);
1144
1144
  if (r.modified) {
1145
1145
  block.text = r.text;
@@ -1435,7 +1435,7 @@ export function registerHooks(api, obfuscator) {
1435
1435
  // Deobfuscate content blocks in message events (message_start etc)
1436
1436
  if (Array.isArray(json.message?.content)) {
1437
1437
  for (const block of json.message.content) {
1438
- if (block?.type === "text" && typeof block.text === "string") {
1438
+ if (typeof block?.text === "string") {
1439
1439
  block.text = ob().deobfuscate(block.text);
1440
1440
  }
1441
1441
  }
@@ -1567,7 +1567,7 @@ export function registerHooks(api, obfuscator) {
1567
1567
  const json = JSON.parse(text);
1568
1568
  if (Array.isArray(json.content)) {
1569
1569
  for (const block of json.content) {
1570
- if (block?.type === "text" && typeof block.text === "string") {
1570
+ if (typeof block?.text === "string") {
1571
1571
  block.text = ob().deobfuscate(block.text);
1572
1572
  }
1573
1573
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "shroud-privacy",
3
3
  "name": "Shroud",
4
- "version": "2.5.6",
4
+ "version": "2.5.7",
5
5
  "description": "Privacy obfuscation with deterministic fake values and deobfuscation — PII never reaches the LLM, tool calls still work",
6
6
  "configSchema": {
7
7
  "type": "object",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shroud-privacy",
3
- "version": "2.5.6",
3
+ "version": "2.5.7",
4
4
  "description": "Privacy and infrastructure protection for AI agents — detects sensitive data (PII, network topology, credentials, OT/SCADA) and replaces with deterministic fakes before anything reaches the LLM.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",