@fidacy/mcp 0.2.5 → 0.2.6

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.6" : "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.6" : "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.6" : "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,66 @@ 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
+ return lines.join("\n");
1170
+ }
1171
+
1121
1172
  // src/sentinel.ts
1122
1173
  var SENTINEL = {
1123
1174
  /** amount >= SPIKE_FACTOR x the historical max ALLOW to the same payee. */
@@ -1205,7 +1256,7 @@ function renderAlertLine(alerts) {
1205
1256
  var state = ensureState();
1206
1257
  var core = makeCore();
1207
1258
  var subject = process.env.FIDACY_SUBJECT ?? "agent:demo";
1208
- var SERVER_VERSION = true ? "0.2.5" : "dev";
1259
+ var SERVER_VERSION = true ? "0.2.6" : "dev";
1209
1260
  var bootClaim = claimUrl();
1210
1261
  var server = new McpServer(
1211
1262
  { name: "fidacy", version: SERVER_VERSION },
@@ -1334,10 +1385,10 @@ server.registerTool(
1334
1385
  },
1335
1386
  async ({ limit, status }) => {
1336
1387
  const records = await core.history(5e3);
1337
- const rows = toRows(records, status ?? "all", limit ?? 20);
1388
+ const rows2 = toRows(records, status ?? "all", limit ?? 20);
1338
1389
  return {
1339
- content: [{ type: "text", text: renderRows(rows) }],
1340
- structuredContent: { count: rows.length, decisions: rows }
1390
+ content: [{ type: "text", text: renderRows(rows2) }],
1391
+ structuredContent: { count: rows2.length, decisions: rows2 }
1341
1392
  };
1342
1393
  }
1343
1394
  );
@@ -1582,12 +1633,15 @@ async function main() {
1582
1633
  void flush();
1583
1634
  });
1584
1635
  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);
1636
+ console.error(
1637
+ renderBanner({
1638
+ version: SERVER_VERSION,
1639
+ tier: state.config.tier,
1640
+ firstRun: state.firstRun,
1641
+ claim: claimUrl(),
1642
+ weekNudge: weekOneBootNudge("upgrade") ?? ""
1643
+ })
1644
+ );
1591
1645
  }
1592
1646
  main().catch((e) => {
1593
1647
  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.6" : "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.6" : "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.6",
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",