@fidacy/openclaw-plugin 0.5.3 → 0.5.5
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/CHANGELOG.md +20 -0
- package/README.md +41 -14
- package/dist/index.js +27 -3
- package/openclaw.plugin.json +2 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Nudges agora contam, no canal OpenClaw tambem. Cada mensagem proativa que aparece para o operador (`first_deny`, `first_allow`, `bec_catch`, ...) emite um evento anonimo com a chave do nudge, marcado com o shell `openclaw-plugin`, no mesmo caminho sem PII do resto da telemetria: diz que uma mensagem apareceu e qual, nunca para quem nem sobre o que.
|
|
8
|
+
|
|
9
|
+
O fluxo de decisao ja disparava esses nudges (decisionNudge), mas ate agora eles nao deixavam rastro: o funil media instalacao e decisao e nada entre as duas. Sem o evento nao havia como saber se expor mais tinha efeito, e isso nao melhorava com o tempo, porque o instrumento nao existia. Herdado do @fidacy/mcp 0.7.2, que este plugin embarca da fonte. Nada muda para quem usa: mesmas mensagens, mesma frequencia de uma vez por install.
|
|
10
|
+
|
|
11
|
+
## 0.5.4
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Scope disclosure. A ClawHub security audit of 0.5.3 flagged that the plugin "observes all agent tool calls and stores or anchors session metadata beyond the clearly advertised payment scope". Correct: since 0.5.0 the plugin hooks every tool call to build the session report, while the manifest description still promised only signed verdicts on money-moving actions. Anyone installing read a smaller promise than the software keeps.
|
|
16
|
+
|
|
17
|
+
The manifest description now leads with the observer and names what stays on the machine (command, file path, arguments) versus what leaves (per-category counts and a hash), plus FIDACY_DISABLE_TELEMETRY. The README opens with that split, before any pitch, and includes the opt-in operatorEmail.
|
|
18
|
+
|
|
19
|
+
No behaviour change: same code as 0.5.3, honest labelling.
|
|
20
|
+
|
|
21
|
+
On the static-analysis hit for FIDACY_ENGINE_API_KEY plus a network call: that is your own credential going only to the engineUrl you configured, the shape of any API client. The README already carries the command that proves no credential literal ships in the package, and it passes.
|
|
22
|
+
|
|
3
23
|
## 0.2.10
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -2,26 +2,53 @@
|
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|
|
|
5
|
-
Fidacy
|
|
6
|
-
in-process (no MCP subprocess, no
|
|
5
|
+
Fidacy firewall for AI agents as a **native OpenClaw plugin**: the payment
|
|
6
|
+
firewall plus a session observer, registered in-process (no MCP subprocess, no
|
|
7
|
+
`npx` spawn).
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
## What this plugin observes, and what leaves your machine
|
|
10
|
+
|
|
11
|
+
Read this before installing. Since 0.5.0 the plugin is not payment-only: it
|
|
12
|
+
hooks every agent tool call to build a session report, and each session ends in
|
|
13
|
+
a hash digest anyone can recompute.
|
|
14
|
+
|
|
15
|
+
Stays on your machine, always:
|
|
16
|
+
|
|
17
|
+
- the command, file path and arguments of every tool call
|
|
18
|
+
- the full session log (`~/.fidacy/sessions/`), which is yours to delete
|
|
19
|
+
- your mandate and config (`~/.fidacy/`)
|
|
20
|
+
|
|
21
|
+
Leaves your machine:
|
|
22
|
+
|
|
23
|
+
- per-category counts (for example `shell: 9, file: 4`) and the session digest,
|
|
24
|
+
anchored via the Fidacy engine when the install is activated
|
|
25
|
+
- anonymous telemetry events (install, session, decision counts; a random UUID,
|
|
26
|
+
never a name or hostname). Disable with `FIDACY_DISABLE_TELEMETRY=1`.
|
|
27
|
+
- your email, only if you set `operatorEmail`, which is opt-in and removable
|
|
28
|
+
|
|
29
|
+
## The tools
|
|
30
|
+
|
|
31
|
+
- `request_payment`: authorize a payment against the active signed mandate.
|
|
9
32
|
ALLOW returns a short-lived Ed25519 grant the executor requires; DENY returns the
|
|
10
33
|
violated rule and no grant.
|
|
11
|
-
- `verify_mandate
|
|
12
|
-
- `get_audit_proof
|
|
13
|
-
- `assess_action
|
|
34
|
+
- `verify_mandate`: the active mandate envelope + Fidacy's public key.
|
|
35
|
+
- `get_audit_proof`: tamper-evident, hash-chained proof for any decision.
|
|
36
|
+
- `assess_action`: a SIGNED trust verdict from the live Fidacy engine
|
|
14
37
|
(requires an engine API key), verifiable by anyone via `@fidacy/verify`.
|
|
15
|
-
- `fidacy_upgrade
|
|
38
|
+
- `fidacy_upgrade`: upgrade the local install to a real Fidacy account.
|
|
39
|
+
|
|
40
|
+
Plus `spend_summary`, `list_decisions`, `sentinel_alerts`, `explain_decision`,
|
|
41
|
+
`anchor_artifact` and `check_artifact`.
|
|
16
42
|
|
|
17
|
-
Same engine as [`@fidacy/mcp`](https://www.npmjs.com/package/@fidacy/mcp)
|
|
43
|
+
Same engine as [`@fidacy/mcp`](https://www.npmjs.com/package/@fidacy/mcp): one
|
|
18
44
|
engine, many shells. Local-first, deny-by-default, non-custodial: Fidacy authorizes,
|
|
19
45
|
it never holds funds.
|
|
20
46
|
|
|
21
47
|
## To everyone who installed Fidacy
|
|
22
48
|
|
|
23
|
-
|
|
24
|
-
date, over 99% of them blocks. Thank you. Two things worth
|
|
49
|
+
Excluding our own test traffic, installs like yours have made about 1,600 real
|
|
50
|
+
firewall decisions to date, over 99% of them blocks. Thank you. Two things worth
|
|
51
|
+
a minute of your time:
|
|
25
52
|
|
|
26
53
|
1. **See and claim what YOUR install blocked.** Your install carries a private,
|
|
27
54
|
anonymous id on your machine (we never learn who you are unless you choose to).
|
|
@@ -37,10 +64,10 @@ Lucas de Lima, founder
|
|
|
37
64
|
|
|
38
65
|
## Install (2 minutes)
|
|
39
66
|
|
|
40
|
-
**Step 1
|
|
67
|
+
**Step 1: get your free API key** at
|
|
41
68
|
[app.fidacy.com/signup](https://app.fidacy.com/signup) (free tier, no card).
|
|
42
69
|
|
|
43
|
-
**Step 2
|
|
70
|
+
**Step 2: install and set the key.**
|
|
44
71
|
|
|
45
72
|
```bash
|
|
46
73
|
openclaw plugins install @fidacy/openclaw-plugin
|
|
@@ -132,7 +159,7 @@ with SHA-256 and send only the 64 hex characters.
|
|
|
132
159
|
## Prefer MCP instead?
|
|
133
160
|
|
|
134
161
|
If you'd rather run Fidacy as an MCP server (out-of-process), use
|
|
135
|
-
`openclaw mcp add fidacy --command npx --arg -y --arg @fidacy/mcp`
|
|
162
|
+
`openclaw mcp add fidacy --command npx --arg -y --arg @fidacy/mcp` , same tools,
|
|
136
163
|
same engine. This plugin is the native, in-process variant.
|
|
137
164
|
|
|
138
165
|
## Build (development)
|
|
@@ -143,7 +170,7 @@ pnpm --filter @fidacy/openclaw-plugin typecheck # tsc against the real openclaw
|
|
|
143
170
|
```
|
|
144
171
|
|
|
145
172
|
`openclaw/plugin-sdk/*` stays external (the host provides it at runtime); everything
|
|
146
|
-
else
|
|
173
|
+
else (the shared `@fidacy/firewall` engine and `@fidacy/mcp` shell wiring) is
|
|
147
174
|
inlined so the published package is self-contained.
|
|
148
175
|
|
|
149
176
|
Apache-2.0 · https://fidacy.com
|
package/dist/index.js
CHANGED
|
@@ -4426,6 +4426,24 @@ function sessionLabel(sessionId, total, byCategory) {
|
|
|
4426
4426
|
}
|
|
4427
4427
|
return parts.join(" ").slice(0, 120);
|
|
4428
4428
|
}
|
|
4429
|
+
function sessionSummary(opts) {
|
|
4430
|
+
const by = {};
|
|
4431
|
+
for (const [cat, n] of Object.entries(opts.byCategory)) if (n > 0) by[cat] = n;
|
|
4432
|
+
const s = {
|
|
4433
|
+
v: 1,
|
|
4434
|
+
// Mesmo saneamento do rótulo: o host vem de código nosso, mas o campo é
|
|
4435
|
+
// limitado na origem para que uma string estranha vire um valor curto e
|
|
4436
|
+
// legível em vez de um 400 que perderia o registro inteiro da sessão.
|
|
4437
|
+
host: opts.host.replace(/[^a-z0-9-]/gi, "").slice(0, 40) || "unknown",
|
|
4438
|
+
session_id: opts.sessionId.replace(/[^A-Za-z0-9-]/g, "").slice(0, 64) || "unknown",
|
|
4439
|
+
total: opts.total
|
|
4440
|
+
};
|
|
4441
|
+
if (Object.keys(by).length) s.by_category = by;
|
|
4442
|
+
if (opts.truncated) s.truncated = true;
|
|
4443
|
+
if (opts.startedAt) s.started_at = opts.startedAt;
|
|
4444
|
+
if (opts.endedAt) s.ended_at = opts.endedAt;
|
|
4445
|
+
return s;
|
|
4446
|
+
}
|
|
4429
4447
|
|
|
4430
4448
|
// ../mcp/src/observer.ts
|
|
4431
4449
|
var EXACT = {
|
|
@@ -5067,7 +5085,7 @@ var FileAuditStore = class {
|
|
|
5067
5085
|
import { statSync } from "node:fs";
|
|
5068
5086
|
|
|
5069
5087
|
// ../mcp/src/telemetry.ts
|
|
5070
|
-
var CLIENT_VERSION = true ? "0.5.
|
|
5088
|
+
var CLIENT_VERSION = true ? "0.5.5" : "dev";
|
|
5071
5089
|
function bandOf(amount) {
|
|
5072
5090
|
if (typeof amount !== "number" || !Number.isFinite(amount) || amount <= 0) return void 0;
|
|
5073
5091
|
if (amount < 10) return "lt10";
|
|
@@ -5150,6 +5168,7 @@ var recordInstall = () => record2("install");
|
|
|
5150
5168
|
var recordAgentActive = () => record2("agent_active");
|
|
5151
5169
|
var recordDecision = (status, violatedRule, amount, perTxMax) => record2("decision", resultOf(status, violatedRule), bandOf(amount), capRatioOf(amount, perTxMax));
|
|
5152
5170
|
var recordUpgradeIntent = () => record2("upgrade_intent");
|
|
5171
|
+
var recordNudge = (key) => record2("nudge", void 0, void 0, void 0, key);
|
|
5153
5172
|
async function flush() {
|
|
5154
5173
|
if (flushTimer) {
|
|
5155
5174
|
clearTimeout(flushTimer);
|
|
@@ -5255,7 +5274,7 @@ function requestUpgrade() {
|
|
|
5255
5274
|
}
|
|
5256
5275
|
|
|
5257
5276
|
// ../mcp/src/provision.ts
|
|
5258
|
-
var CLIENT_VERSION2 = true ? "0.5.
|
|
5277
|
+
var CLIENT_VERSION2 = true ? "0.5.5" : "dev";
|
|
5259
5278
|
function provisionEnabled() {
|
|
5260
5279
|
const v = (process.env.FIDACY_DISABLE_PROVISION ?? "").trim().toLowerCase();
|
|
5261
5280
|
return !(v === "1" || v === "true" || v === "yes");
|
|
@@ -5306,6 +5325,7 @@ function nudgeOnce(key) {
|
|
|
5306
5325
|
} catch {
|
|
5307
5326
|
return false;
|
|
5308
5327
|
}
|
|
5328
|
+
recordNudge(key);
|
|
5309
5329
|
return true;
|
|
5310
5330
|
}
|
|
5311
5331
|
var sessionDecisions = 0;
|
|
@@ -5397,7 +5417,7 @@ function trialCountdownLine(keyOverride) {
|
|
|
5397
5417
|
}
|
|
5398
5418
|
|
|
5399
5419
|
// ../mcp/src/register.ts
|
|
5400
|
-
var CLIENT_VERSION3 = true ? "0.5.
|
|
5420
|
+
var CLIENT_VERSION3 = true ? "0.5.5" : "dev";
|
|
5401
5421
|
function endpoint3() {
|
|
5402
5422
|
const base = (process.env.FIDACY_ENGINE_URL ?? "https://api.fidacy.com").replace(/\/$/, "");
|
|
5403
5423
|
return `${base}/v1/register`;
|
|
@@ -6340,6 +6360,10 @@ entry.register = (api) => {
|
|
|
6340
6360
|
sha256: head,
|
|
6341
6361
|
kind: "custom",
|
|
6342
6362
|
label: sessionLabel(sessionId, total, byCategory),
|
|
6363
|
+
// O contrato estruturado que o console lê. `host` é o campo que o
|
|
6364
|
+
// rótulo nunca teve, e sem ele este plugin e o hook de Claude Code
|
|
6365
|
+
// escreviam linhas indistinguíveis.
|
|
6366
|
+
summary: sessionSummary({ host: "openclaw", sessionId, total, byCategory }),
|
|
6343
6367
|
// Which install produced the session, so a fleet view can group by
|
|
6344
6368
|
// machine. The anon id is a random UUID minted on this machine and
|
|
6345
6369
|
// tied to no person, which is the point: the cockpit answers "which
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "fidacy",
|
|
3
3
|
"name": "Fidacy AI Agent Firewall",
|
|
4
|
-
"description": "
|
|
4
|
+
"description": "Firewall for AI agents. Watches every action the agent takes and ends each session in a digest anyone can recompute; commands, paths and arguments never leave your machine, only counts and a hash. Blocks wrong/lookalike payee, over-cap and duplicate-invoice fraud before money moves. Non-custodial, local-first, deny-by-default. Anonymous telemetry (counts only) can be disabled with FIDACY_DISABLE_TELEMETRY=1.",
|
|
5
5
|
"icon": "https://fidacy.com/logo.png",
|
|
6
|
-
"version": "0.5.
|
|
6
|
+
"version": "0.5.5",
|
|
7
7
|
"contracts": {
|
|
8
8
|
"tools": [
|
|
9
9
|
"request_payment",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fidacy/openclaw-plugin",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.5",
|
|
4
4
|
"description": "Fidacy payment firewall as a native OpenClaw plugin: signed, verifiable verdicts on every money-moving agent action, in-process (no MCP subprocess).",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Fidacy (ZeepCode Group Technology LLC) <hello@fidacy.com> (https://fidacy.com)",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"typebox": "1.1.39",
|
|
58
58
|
"typescript": "^5.6.3",
|
|
59
59
|
"@fidacy/firewall": "0.1.1",
|
|
60
|
-
"@fidacy/mcp": "0.7.
|
|
60
|
+
"@fidacy/mcp": "0.7.2"
|
|
61
61
|
},
|
|
62
62
|
"scripts": {
|
|
63
63
|
"build": "node scripts/bundle.mjs",
|