@fidacy/openclaw-plugin 0.1.18 → 0.2.1

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 CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.1
4
+
5
+ Manifest catch-up: openclaw.plugin.json version was stale (0.1.18) in the 0.2.0
6
+ artifact, and the engineApiKey help now points to the free key and explains it
7
+ keeps the firewall active past the 20-decision anonymous trial. No code change.
8
+
9
+ ## 0.2.0
10
+
11
+ Activation gate (same engine as @fidacy/mcp 0.2.0): anonymous installs get 20
12
+ free firewall decisions, then request_payment fails closed with DENY
13
+ (activation_required) until engineApiKey (plugin config) or
14
+ FIDACY_ENGINE_API_KEY is set — free key at fidacy.com/claim, history migrates.
15
+ Countdown line on the last 5 free decisions. Keyed installs unaffected.
16
+
3
17
  ## 0.1.14 — 2026-07-06
4
18
 
5
19
  Founder note in the README for the week-one install base: claim your install's
package/README.md CHANGED
@@ -18,10 +18,10 @@ Same engine as [`@fidacy/mcp`](https://www.npmjs.com/package/@fidacy/mcp) — on
18
18
  engine, many shells. Local-first, deny-by-default, non-custodial: Fidacy authorizes,
19
19
  it never holds funds.
20
20
 
21
- ## To everyone who installed Fidacy this week
21
+ ## To everyone who installed Fidacy
22
22
 
23
- You are one of ~135 installs that made 1,784 real firewall decisions in week one,
24
- 76% of them blocks. Thank you. Two things worth a minute of your time:
23
+ You are one of ~170 installs that have made 2,100+ real firewall decisions to
24
+ date, over 99% of them blocks. Thank you. Two things worth a minute of your time:
25
25
 
26
26
  1. **See and claim what YOUR install blocked.** Your install carries a private,
27
27
  anonymous id on your machine (we never learn who you are unless you choose to).
@@ -35,14 +35,18 @@ You are one of ~135 installs that made 1,784 real firewall decisions in week one
35
35
 
36
36
  Lucas de Lima, founder
37
37
 
38
- ## Install
38
+ ## Install (2 minutes)
39
+
40
+ **Step 1 — get your free API key** at
41
+ [app.fidacy.com/signup](https://app.fidacy.com/signup) (free tier, no card).
42
+
43
+ **Step 2 — install and set the key:**
39
44
 
40
45
  ```bash
41
46
  openclaw plugins install @fidacy/openclaw-plugin
42
47
  ```
43
48
 
44
- Zero config to start (deny-unknown-payee + per-tx cap). Add trusted payees/caps in
45
- `~/.fidacy/config.json`. Optional plugin config (`plugins.entries.fidacy.config`):
49
+ Plugin config (`plugins.entries.fidacy.config`):
46
50
 
47
51
  ```json
48
52
  {
@@ -52,8 +56,17 @@ Zero config to start (deny-unknown-payee + per-tx cap). Add trusted payees/caps
52
56
  }
53
57
  ```
54
58
 
55
- `engineApiKey` enables signed verdicts (`assess_action`). Environment variables
56
- (`FIDACY_ENGINE_API_KEY`, `FIDACY_ENGINE_URL`, `FIDACY_SUBJECT`) are the fallback.
59
+ `engineApiKey` enables signed verdicts (`assess_action`) and keeps the firewall
60
+ active past the anonymous trial. Environment variables (`FIDACY_ENGINE_API_KEY`,
61
+ `FIDACY_ENGINE_URL`, `FIDACY_SUBJECT`) are the fallback. Decisions run locally,
62
+ deny-by-default (deny-unknown-payee + per-tx cap); add trusted payees/caps in
63
+ `~/.fidacy/config.json`.
64
+
65
+ **No key yet?** The install works anonymously for its first **20 firewall
66
+ decisions**, then fails closed (payments denied with `activation_required`) until
67
+ the free key is set. Claim an anonymous install's history:
68
+ `grep anon_id ~/.fidacy/config.json`, then open
69
+ `https://fidacy.com/claim?ref=<that id>`.
57
70
 
58
71
  Verify any verdict yourself: https://api.fidacy.com/.well-known/jwks.json
59
72
 
package/dist/index.js CHANGED
@@ -4690,7 +4690,7 @@ function resolveMandateRules(cfg) {
4690
4690
  }
4691
4691
 
4692
4692
  // ../mcp/src/telemetry.ts
4693
- var CLIENT_VERSION = true ? "0.1.18" : "dev";
4693
+ var CLIENT_VERSION = true ? "0.2.1" : "dev";
4694
4694
  function bandOf(amount) {
4695
4695
  if (typeof amount !== "number" || !Number.isFinite(amount) || amount <= 0) return void 0;
4696
4696
  if (amount < 10) return "lt10";
@@ -4867,7 +4867,7 @@ function requestUpgrade() {
4867
4867
  }
4868
4868
 
4869
4869
  // ../mcp/src/provision.ts
4870
- var CLIENT_VERSION2 = true ? "0.1.18" : "dev";
4870
+ var CLIENT_VERSION2 = true ? "0.2.1" : "dev";
4871
4871
  function provisionEnabled() {
4872
4872
  const v = (process.env.FIDACY_DISABLE_PROVISION ?? "").trim().toLowerCase();
4873
4873
  return !(v === "1" || v === "true" || v === "yes");
@@ -4956,6 +4956,41 @@ function noKeyCta() {
4956
4956
  return url ? `free in ~1 min for your operator: open ${url} (this install's history migrates), or set FIDACY_ENGINE_API_KEY if you already have one` : `free in ~1 min: call the upgrade tool (your history migrates), or set FIDACY_ENGINE_API_KEY if you already have one`;
4957
4957
  }
4958
4958
 
4959
+ // ../mcp/src/activation.ts
4960
+ var FREE_DECISIONS = 20;
4961
+ function hasEngineKey(keyOverride) {
4962
+ return Boolean((keyOverride ?? process.env.FIDACY_ENGINE_API_KEY ?? "").trim());
4963
+ }
4964
+ function decisionsUsed() {
4965
+ return readConfig()?.decisions_count ?? 0;
4966
+ }
4967
+ function remainingFree() {
4968
+ return Math.max(0, FREE_DECISIONS - decisionsUsed());
4969
+ }
4970
+ function claimDestination() {
4971
+ return claimUrl() ?? "https://fidacy.com/claim";
4972
+ }
4973
+ function activationGate(keyOverride) {
4974
+ if (hasEngineKey(keyOverride)) return null;
4975
+ if (decisionsUsed() < FREE_DECISIONS) return null;
4976
+ recordUpgradeIntent();
4977
+ const url = claimDestination();
4978
+ return {
4979
+ message: `DENY (activation_required). This anonymous install has used its ${FREE_DECISIONS} free firewall decisions, so the firewall now fails closed: no payment can proceed until it is activated. Activation is a free API key, about 2 minutes, no card. Relay this to your operator word for word: "Fidacy paused this agent's payments until you activate it. Get your free key at ${url} (this install's block history migrates to your account), then set FIDACY_ENGINE_API_KEY=<the key> where the agent runs and retry."`
4980
+ };
4981
+ }
4982
+ function trialCountdownLine(keyOverride) {
4983
+ if (hasEngineKey(keyOverride)) return null;
4984
+ if (!readConfig()) return null;
4985
+ const left = remainingFree();
4986
+ if (left > 5) return null;
4987
+ const url = claimDestination();
4988
+ if (left === 0) {
4989
+ return ` [fidacy] That was this install's LAST free anonymous decision \u2014 the next payment will be denied until it is activated. For your operator: free API key at ${url} (history migrates), then set FIDACY_ENGINE_API_KEY.`;
4990
+ }
4991
+ return ` [fidacy] ${left} free anonymous decision${left === 1 ? "" : "s"} left on this install before the firewall requires activation. For your operator: free API key at ${url} (history migrates), then set FIDACY_ENGINE_API_KEY.`;
4992
+ }
4993
+
4959
4994
  // ../mcp/src/assess.ts
4960
4995
  var AssessError = class extends Error {
4961
4996
  type;
@@ -5206,11 +5241,16 @@ var index_default = defineToolPlugin({
5206
5241
  )
5207
5242
  }),
5208
5243
  async execute(params, config) {
5244
+ const gate = activationGate(config.engineApiKey);
5245
+ if (gate) {
5246
+ return { status: "DENY", decisionId: "activation_required", violatedRule: "activation_required", message: gate.message };
5247
+ }
5209
5248
  const d = await boot().decide(params, subjectOf(config));
5210
5249
  const base = d.status === "ALLOW" ? `ALLOW (decision ${d.decisionId})${params.invoiceRef ? ` for invoice ${params.invoiceRef}` : ""}. To settle, call the executor with the SAME payee, amount, currency, and idempotencyKey, and set "grant" to EXACTLY this signed value:
5211
5250
  ${d.grant}` : `DENY (decision ${d.decisionId}). Rule violated: ${d.violatedRule}. No grant issued, this payment cannot proceed. The denial itself is recorded in the tamper-evident, hash-chained audit: call get_audit_proof with decisionId ${d.decisionId} for the proof of what was blocked.${d.violatedRule?.startsWith("payee_not_in_allowlist") ? ` If the user trusts this payee, add "${params.payee}" to mandate.payees in ~/.fidacy/config.json and retry: the firewall picks the change up on the next call, no restart needed.` : ""}`;
5212
5251
  const nudge = decisionNudge(d.status, d.violatedRule, "fidacy_upgrade");
5213
- const message = nudge ? `${base} ${nudge}` : base;
5252
+ const countdown = trialCountdownLine(config.engineApiKey);
5253
+ const message = [base, nudge, countdown].filter(Boolean).join(" ");
5214
5254
  return { status: d.status, decisionId: d.decisionId, grant: d.grant, violatedRule: d.violatedRule, message };
5215
5255
  }
5216
5256
  }),
@@ -3,7 +3,7 @@
3
3
  "name": "Fidacy — Payment Firewall",
4
4
  "description": "A signed, independently-verifiable verdict on every money-moving agent action. Blocks wrong/lookalike payee, over-cap, and duplicate-invoice fraud before money moves. Non-custodial, local-first, deny-by-default.",
5
5
  "icon": "https://fidacy.com/logo.png",
6
- "version": "0.1.18",
6
+ "version": "0.2.1",
7
7
  "contracts": {
8
8
  "tools": [
9
9
  "request_payment",
@@ -38,7 +38,7 @@
38
38
  "label": "Engine API key",
39
39
  "placeholder": "fky_live_...",
40
40
  "sensitive": true,
41
- "help": "Optional. Enables signed trust verdicts (assess_action) from the live Fidacy engine."
41
+ "help": "Free key at app.fidacy.com/signup. Enables signed trust verdicts (assess_action) and keeps the firewall active past the 20-decision anonymous trial."
42
42
  },
43
43
  "engineUrl": {
44
44
  "label": "Engine URL",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fidacy/openclaw-plugin",
3
- "version": "0.1.18",
3
+ "version": "0.2.1",
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
  "homepage": "https://fidacy.com",
@@ -56,7 +56,7 @@
56
56
  "typebox": "1.1.39",
57
57
  "typescript": "^5.6.3",
58
58
  "@fidacy/firewall": "0.1.1",
59
- "@fidacy/mcp": "0.1.26"
59
+ "@fidacy/mcp": "0.2.0"
60
60
  },
61
61
  "scripts": {
62
62
  "build": "node scripts/bundle.mjs",