@fidacy/mcp 0.2.5 → 0.2.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.
@@ -0,0 +1,8 @@
1
+ export interface BannerState {
2
+ version: string;
3
+ tier: string;
4
+ firstRun: boolean;
5
+ claim: string | null;
6
+ weekNudge: string;
7
+ }
8
+ export declare function renderBanner(s: BannerState): string;
package/dist/core.js CHANGED
@@ -461,7 +461,7 @@ function resolveMandateRules(cfg) {
461
461
  }
462
462
 
463
463
  // src/telemetry.ts
464
- var CLIENT_VERSION = true ? "0.2.5" : "dev";
464
+ var CLIENT_VERSION = true ? "0.2.7" : "dev";
465
465
  function bandOf(amount) {
466
466
  if (typeof amount !== "number" || !Number.isFinite(amount) || amount <= 0) return void 0;
467
467
  if (amount < 10) return "lt10";
package/dist/index.js CHANGED
@@ -490,7 +490,7 @@ function resolveMandateRules(cfg) {
490
490
  }
491
491
 
492
492
  // src/telemetry.ts
493
- var CLIENT_VERSION = true ? "0.2.5" : "dev";
493
+ var CLIENT_VERSION = true ? "0.2.7" : "dev";
494
494
  function bandOf(amount) {
495
495
  if (typeof amount !== "number" || !Number.isFinite(amount) || amount <= 0) return void 0;
496
496
  if (amount < 10) return "lt10";
@@ -834,7 +834,7 @@ async function findArtifacts(sha2562, cfg) {
834
834
  }
835
835
 
836
836
  // src/provision.ts
837
- var CLIENT_VERSION2 = true ? "0.2.5" : "dev";
837
+ var CLIENT_VERSION2 = true ? "0.2.7" : "dev";
838
838
  function provisionEnabled() {
839
839
  const v = (process.env.FIDACY_DISABLE_PROVISION ?? "").trim().toLowerCase();
840
840
  return !(v === "1" || v === "true" || v === "yes");
@@ -995,15 +995,6 @@ function trialCountdownLine(keyOverride) {
995
995
  }
996
996
  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.`;
997
997
  }
998
- function activationBootLine() {
999
- if (hasEngineKey()) return null;
1000
- const used = decisionsUsed();
1001
- const left = remainingFree();
1002
- if (left === 0) {
1003
- return ` Anonymous trial over (${used}/${FREE_DECISIONS} free decisions used): payments are denied until activated with a free API key.`;
1004
- }
1005
- return ` Anonymous trial: ${used}/${FREE_DECISIONS} free decisions used; after that the firewall requires a free API key.`;
1006
- }
1007
998
 
1008
999
  // src/reporting.ts
1009
1000
  function withinDays(records, days, now = Date.now()) {
@@ -1018,10 +1009,10 @@ var addTo = (bucket, key, value) => {
1018
1009
  bucket[key] = (bucket[key] ?? 0) + value;
1019
1010
  };
1020
1011
  function summarize(records, days, now = Date.now()) {
1021
- const rows = withinDays(records, days, now);
1012
+ const rows2 = withinDays(records, days, now);
1022
1013
  const out = {
1023
1014
  window_days: days,
1024
- decisions: rows.length,
1015
+ decisions: rows2.length,
1025
1016
  allowed: 0,
1026
1017
  denied: 0,
1027
1018
  allowed_totals: {},
@@ -1029,11 +1020,11 @@ function summarize(records, days, now = Date.now()) {
1029
1020
  denied_by_rule: {},
1030
1021
  payees_paid: [],
1031
1022
  amount_unknown: 0,
1032
- first_ts: rows.length ? rows[0].ts : null,
1033
- last_ts: rows.length ? rows[rows.length - 1].ts : null
1023
+ first_ts: rows2.length ? rows2[0].ts : null,
1024
+ last_ts: rows2.length ? rows2[rows2.length - 1].ts : null
1034
1025
  };
1035
1026
  const paid = /* @__PURE__ */ new Set();
1036
- for (const r of rows) {
1027
+ for (const r of rows2) {
1037
1028
  const known = typeof r.amount === "number" && Number.isFinite(r.amount);
1038
1029
  if (!known) out.amount_unknown += 1;
1039
1030
  const ccy = r.currency ?? "unknown";
@@ -1086,9 +1077,9 @@ function toRows(records, status, limit) {
1086
1077
  invoiceRef: r.invoiceRef
1087
1078
  }));
1088
1079
  }
1089
- function renderRows(rows) {
1090
- if (!rows.length) return "No decisions match that filter yet.";
1091
- return rows.map((r) => {
1080
+ function renderRows(rows2) {
1081
+ if (!rows2.length) return "No decisions match that filter yet.";
1082
+ return rows2.map((r) => {
1092
1083
  const amount = typeof r.amount === "number" ? `${r.amount.toLocaleString("en-US")} ${r.currency ?? ""}`.trim() : "amount not recorded";
1093
1084
  const who = r.payee ?? "payee not recorded";
1094
1085
  const why = r.status === "DENY" ? ` blocked by ${r.violatedRule ?? "a rule not recorded on this older entry"}.` : "";
@@ -1118,6 +1109,70 @@ function explainRule(rule, payee) {
1118
1109
  return `The mandate rule "${rule}" was violated.`;
1119
1110
  }
1120
1111
 
1112
+ // src/banner.ts
1113
+ var fancy = () => {
1114
+ if (process.env.NO_COLOR) return false;
1115
+ if (process.env.FORCE_COLOR) return true;
1116
+ return Boolean(process.stderr.isTTY);
1117
+ };
1118
+ var A = "\x1B[94m";
1119
+ var D = "\x1B[2m";
1120
+ var B = "\x1B[1m";
1121
+ var R = "\x1B[0m";
1122
+ var WIDTH = 80;
1123
+ var LABEL = 9;
1124
+ function rows(s) {
1125
+ const used = decisionsUsed();
1126
+ const keyed = hasEngineKey();
1127
+ const out = [["mode", `${s.tier} \xB7 local-first \xB7 deny-by-default`]];
1128
+ if (!keyed) out.push(["trial", `${used}/${FREE_DECISIONS} anonymous decisions used \xB7 then a free key is required`]);
1129
+ if (s.firstRun) out.push(["mandate", "safe default active \xB7 add trusted payees in ~/.fidacy/config.json"]);
1130
+ if (keyed) {
1131
+ out.push(["verdicts", "engine key set \xB7 signed verdicts from the live engine"]);
1132
+ } else if (s.claim) {
1133
+ out.push(["activate", s.claim]);
1134
+ out.push(["", "free account + key in ~2 min \xB7 every block made here migrates"]);
1135
+ } else {
1136
+ out.push(["verdicts", "provisioning free key in background (or FIDACY_ENGINE_API_KEY)"]);
1137
+ }
1138
+ return out;
1139
+ }
1140
+ function renderBanner(s) {
1141
+ const title = "FIDACY \xB7 the payment firewall for AI agents";
1142
+ const sub = `signs the YES and the NO \xB7 v${s.version}`;
1143
+ const body = rows(s);
1144
+ if (!fancy()) {
1145
+ const lines2 = [
1146
+ `[fidacy] ${title} (${sub})`,
1147
+ ...body.map(([k, v]) => `[fidacy] ${(k || "").padEnd(LABEL)} ${v}`)
1148
+ ];
1149
+ if (s.weekNudge) lines2.push(`[fidacy] ${"".padEnd(LABEL)} ${s.weekNudge.trim()}`);
1150
+ return lines2.join("\n");
1151
+ }
1152
+ const content = WIDTH - 4;
1153
+ const clip = (t) => t.length > content ? t.slice(0, content - 1) + "\u2026" : t;
1154
+ const row = (styled, visible) => `\u2502 ${styled}${" ".repeat(Math.max(0, content - visible))} \u2502`;
1155
+ const bar = (l, r_) => l + "\u2500".repeat(WIDTH - 2) + r_;
1156
+ const lines = [
1157
+ bar("\u250C", "\u2510"),
1158
+ row(`${B}${A}${clip(title)}${R}`, clip(title).length),
1159
+ row(`${D}${clip(sub)}${R}`, clip(sub).length),
1160
+ bar("\u251C", "\u2524"),
1161
+ ...body.map(([k, v]) => {
1162
+ const value = clip(v).slice(0, content - LABEL - 1);
1163
+ const styled = `${A}${(k || "").padEnd(LABEL)}${R} ${k === "activate" ? `${B}${value}${R}` : `${D}${value}${R}`}`;
1164
+ return row(styled, LABEL + 1 + value.length);
1165
+ }),
1166
+ bar("\u2514", "\u2518")
1167
+ ];
1168
+ if (s.weekNudge) lines.push(`${D}${s.weekNudge.trim()}${R}`);
1169
+ lines.push(
1170
+ `${D}this is an MCP server, now waiting for an agent on stdio (Ctrl+C exits).${R}`,
1171
+ `${D}wire it into yours:${R} ${A}claude mcp add fidacy -- npx -y @fidacy/mcp${R}`
1172
+ );
1173
+ return lines.join("\n");
1174
+ }
1175
+
1121
1176
  // src/sentinel.ts
1122
1177
  var SENTINEL = {
1123
1178
  /** amount >= SPIKE_FACTOR x the historical max ALLOW to the same payee. */
@@ -1205,7 +1260,7 @@ function renderAlertLine(alerts) {
1205
1260
  var state = ensureState();
1206
1261
  var core = makeCore();
1207
1262
  var subject = process.env.FIDACY_SUBJECT ?? "agent:demo";
1208
- var SERVER_VERSION = true ? "0.2.5" : "dev";
1263
+ var SERVER_VERSION = true ? "0.2.7" : "dev";
1209
1264
  var bootClaim = claimUrl();
1210
1265
  var server = new McpServer(
1211
1266
  { name: "fidacy", version: SERVER_VERSION },
@@ -1334,10 +1389,10 @@ server.registerTool(
1334
1389
  },
1335
1390
  async ({ limit, status }) => {
1336
1391
  const records = await core.history(5e3);
1337
- const rows = toRows(records, status ?? "all", limit ?? 20);
1392
+ const rows2 = toRows(records, status ?? "all", limit ?? 20);
1338
1393
  return {
1339
- content: [{ type: "text", text: renderRows(rows) }],
1340
- structuredContent: { count: rows.length, decisions: rows }
1394
+ content: [{ type: "text", text: renderRows(rows2) }],
1395
+ structuredContent: { count: rows2.length, decisions: rows2 }
1341
1396
  };
1342
1397
  }
1343
1398
  );
@@ -1582,12 +1637,15 @@ async function main() {
1582
1637
  void flush();
1583
1638
  });
1584
1639
  void autoProvision();
1585
- const claim = claimUrl();
1586
- const verdictHint = process.env.FIDACY_ENGINE_API_KEY ? "" : claim ? ` This install is anonymous. Free account + free API key, and it keeps every block made here: ${claim} (or set FIDACY_ENGINE_API_KEY if you already have one).` : " Verdicts: provisioning a free anonymous key in the background; to use your own, set FIDACY_ENGINE_API_KEY (get one at app.fidacy.com).";
1587
- const tierHint = state.firstRun ? " First run: free local tier active (deny-unknown payee + cap). Add trusted payees in ~/.fidacy/config.json." : ` Tier: ${state.config.tier} (local-first).`;
1588
- const weekNudge = weekOneBootNudge("upgrade") ?? "";
1589
- const trialLine = activationBootLine() ?? "";
1590
- console.error("[fidacy] @fidacy/mcp ready on stdio: signed verdict + payment firewall." + tierHint + trialLine + verdictHint + weekNudge);
1640
+ console.error(
1641
+ renderBanner({
1642
+ version: SERVER_VERSION,
1643
+ tier: state.config.tier,
1644
+ firstRun: state.firstRun,
1645
+ claim: claimUrl(),
1646
+ weekNudge: weekOneBootNudge("upgrade") ?? ""
1647
+ })
1648
+ );
1591
1649
  }
1592
1650
  main().catch((e) => {
1593
1651
  console.error("[fidacy] fatal:", e);
package/dist/lib.js CHANGED
@@ -613,7 +613,7 @@ function resolveMandateRules(cfg) {
613
613
  }
614
614
 
615
615
  // src/telemetry.ts
616
- var CLIENT_VERSION = true ? "0.2.5" : "dev";
616
+ var CLIENT_VERSION = true ? "0.2.7" : "dev";
617
617
  function bandOf(amount) {
618
618
  if (typeof amount !== "number" || !Number.isFinite(amount) || amount <= 0) return void 0;
619
619
  if (amount < 10) return "lt10";
@@ -791,7 +791,7 @@ function requestUpgrade() {
791
791
  }
792
792
 
793
793
  // src/provision.ts
794
- var CLIENT_VERSION2 = true ? "0.2.5" : "dev";
794
+ var CLIENT_VERSION2 = true ? "0.2.7" : "dev";
795
795
  function provisionEnabled() {
796
796
  const v = (process.env.FIDACY_DISABLE_PROVISION ?? "").trim().toLowerCase();
797
797
  return !(v === "1" || v === "true" || v === "yes");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fidacy/mcp",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "Fidacy action firewall for AI agents. Mandate-gated payment authorization as an MCP server.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://fidacy.com",