@agentistics/mcp 2.76.0 → 2.76.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.
@@ -171,51 +171,6 @@ var DEFAULT_TEAM = Object.freeze({
171
171
  connections: Object.freeze([])
172
172
  });
173
173
  var SHARE_SOURCE_TYPES = new Set(["repo", "project", "none"]);
174
- // ../core/src/redact.ts
175
- var REDACTION = "[REDACTED]";
176
- var PLACEHOLDER = /^(\*+|x+|\.+|-+|<[^>]*>|\{[^}]*\}|\$\{?[A-Z_][A-Z0-9_]*\}?|your[-_]?\w*|todo|changeme|none|null|nil|empty|redacted|\[redacted\])$/i;
177
- function looksSecret(value) {
178
- const v = value.trim().replace(/^["']|["']$/g, "");
179
- if (v.length < 12)
180
- return false;
181
- if (PLACEHOLDER.test(v))
182
- return false;
183
- if (/^\d+$/.test(v))
184
- return false;
185
- if (/\s/.test(v))
186
- return false;
187
- const classes = [/[a-z]/.test(v), /[A-Z]/.test(v), /\d/.test(v), /[^A-Za-z0-9]/.test(v)].filter(Boolean).length;
188
- return classes >= 2;
189
- }
190
- function guarded(whole, prefix, value) {
191
- return looksSecret(value) ? `${prefix}${REDACTION}` : whole;
192
- }
193
- var STRONG = [
194
- /-----BEGIN[^-]*PRIVATE KEY-----[\s\S]*?-----END[^-]*PRIVATE KEY-----/g,
195
- /\bgithub_pat_[A-Za-z0-9_]{20,}/g,
196
- /\bgh[pousr]_[A-Za-z0-9]{20,}/g,
197
- /\bsk-ant-[A-Za-z0-9\-_]{16,}/g,
198
- /\bsk-(?:proj-)?[A-Za-z0-9\-_]{20,}/g,
199
- /\bxox[baprs]-[A-Za-z0-9-]{10,}/g,
200
- /\bAIza[A-Za-z0-9\-_]{35}/g,
201
- /\bAKIA[0-9A-Z]{16}\b/g,
202
- /\beyJ[A-Za-z0-9\-_]{8,}\.eyJ[A-Za-z0-9\-_]{8,}\.[A-Za-z0-9\-_]{8,}/g,
203
- /\bact1_[A-Za-z0-9\-_]+\.[A-Za-z0-9]{16,}/g
204
- ];
205
- var URI_CREDENTIAL = /\b([a-z][a-z0-9+.\-]*:\/\/[^\s:/@"']+:)([^\s@"']+)@/gi;
206
- var ASSIGNMENT = /(^|[^A-Za-z0-9_])((?:[A-Za-z0-9]+[_-])*(?:pass(?:word|wd)?|pwd|secret|token|auth|credentials?|api[_-]?key|access[_-]?key|private[_-]?key)[a-z0-9_-]*\s*[:=]\s*)(["']?[^\s"',;]+["']?)/gi;
207
- var BEARER = /\b(Bearer\s+)([A-Za-z0-9\-._~+/]{12,}=*)/g;
208
- function redactSecrets(text) {
209
- if (typeof text !== "string" || text === "")
210
- return "";
211
- let out = text;
212
- for (const re of STRONG)
213
- out = out.replace(re, REDACTION);
214
- out = out.replace(URI_CREDENTIAL, (whole, prefix, pw) => PLACEHOLDER.test(pw) ? whole : `${prefix}${REDACTION}@`);
215
- out = out.replace(ASSIGNMENT, (whole, lead, prefix, value) => guarded(whole, `${lead}${prefix}`, value));
216
- out = out.replace(BEARER, (whole, prefix, value) => guarded(whole, prefix, value));
217
- return out;
218
- }
219
174
  // ../core/src/plan-catalog.ts
220
175
  var CLAUDE_PRICING = "https://claude.com/pricing";
221
176
  var COPILOT_PRICING = "https://github.com/features/copilot/plans";
@@ -860,224 +815,6 @@ function harnessParam() {
860
815
  };
861
816
  }
862
817
 
863
- // agent-audit.ts
864
- import { createHash } from "node:crypto";
865
- import * as nodeFs from "node:fs";
866
- import { homedir } from "node:os";
867
- import { dirname, join } from "node:path";
868
- var AUDIT_ROTATE_BYTES = 10 * 1024 * 1024;
869
- var AUDIT_KEEP_FILES = 3;
870
- function defaultAuditPath(env = process.env) {
871
- return join(env.AGENTISTICS_DIR ?? join(homedir(), ".agentistics"), "agent-audit.jsonl");
872
- }
873
- var TARGET_KEYS = [
874
- "ref",
875
- "id",
876
- "taskId",
877
- "subtaskId",
878
- "sessionId",
879
- "session",
880
- "sessions",
881
- "group",
882
- "parentGroupId",
883
- "blockedBy",
884
- "componentId",
885
- "instanceId",
886
- "tag",
887
- "remove"
888
- ];
889
- var ID_SHAPE = /^[A-Za-z0-9][A-Za-z0-9_.:@-]{0,79}$/;
890
- var MAX_TARGETS = 20;
891
- function asId(v) {
892
- if (typeof v !== "string" || !ID_SHAPE.test(v))
893
- return null;
894
- return redactSecrets(v) === v ? v : null;
895
- }
896
- function targetsOf(args) {
897
- const out = [];
898
- let omitted = 0;
899
- if (!args || typeof args !== "object")
900
- return { targets: out, omitted };
901
- const a = args;
902
- for (const key of TARGET_KEYS) {
903
- const raw = a[key];
904
- if (raw === undefined || raw === null || typeof raw === "boolean")
905
- continue;
906
- for (const v of Array.isArray(raw) ? raw : [raw]) {
907
- const id = asId(v);
908
- if (id === null) {
909
- omitted++;
910
- continue;
911
- }
912
- if (out.length >= MAX_TARGETS) {
913
- omitted++;
914
- continue;
915
- }
916
- if (!out.includes(id))
917
- out.push(id);
918
- }
919
- }
920
- return { targets: out, omitted };
921
- }
922
- function canonical(v) {
923
- if (Array.isArray(v))
924
- return `[${v.map(canonical).join(",")}]`;
925
- if (v && typeof v === "object") {
926
- const o = v;
927
- return `{${Object.keys(o).sort().map((k) => `${JSON.stringify(k)}:${canonical(o[k])}`).join(",")}}`;
928
- }
929
- return JSON.stringify(v ?? null);
930
- }
931
- function argsHash(args) {
932
- return createHash("sha256").update(canonical(args ?? {})).digest("hex").slice(0, 16);
933
- }
934
- function label(v) {
935
- if (typeof v !== "string")
936
- return;
937
- const t = v.trim().slice(0, 64);
938
- if (!/^[\w.:@/ -]{1,64}$/.test(t))
939
- return;
940
- return redactSecrets(t) === t ? t : undefined;
941
- }
942
- function actorOf(client, args, naySession) {
943
- const a = args && typeof args === "object" ? args : {};
944
- const declared = label(a.actor) ?? label(a.by);
945
- const nay = naySession !== undefined ? asId(naySession) ?? undefined : undefined;
946
- return {
947
- client: label(client?.name) ?? null,
948
- clientVersion: label(client?.version) ?? null,
949
- ...declared !== undefined ? { declared } : {},
950
- ...nay !== undefined ? { naySession: nay } : {}
951
- };
952
- }
953
- function outcomeOf(result) {
954
- if (result === "unknown_tool")
955
- return "unknown_tool";
956
- if (!result.isError)
957
- return "ok";
958
- const m = /→ HTTP (\d{3})\b/.exec(result.errorText ?? "");
959
- return m ? `http_${Number(m[1])}` : "error";
960
- }
961
- function isKnownTool(name) {
962
- return Object.prototype.hasOwnProperty.call(AGENT_TOOL_POLICY, name);
963
- }
964
- function riskOf(name) {
965
- return isKnownTool(name) ? AGENT_TOOL_POLICY[name].risk : null;
966
- }
967
- function buildToolAuditRecord(input) {
968
- const known = isKnownTool(input.name);
969
- const { targets, omitted } = targetsOf(input.args);
970
- return {
971
- v: 1,
972
- kind: "tool",
973
- at: input.at.toISOString(),
974
- actor: actorOf(input.client, input.args, input.naySession),
975
- tool: known ? input.name : null,
976
- risk: riskOf(input.name),
977
- targets,
978
- ...omitted > 0 ? { targetsOmitted: omitted } : {},
979
- argsHash: argsHash(input.args),
980
- outcome: known ? outcomeOf(input.result) : "unknown_tool"
981
- };
982
- }
983
- function hourOf(at) {
984
- return at.toISOString().slice(0, 13);
985
- }
986
- function readCountRecord(hour, counts) {
987
- return { v: 1, kind: "reads", hour, counts: { ...counts } };
988
- }
989
- function rotatedPath(path, n) {
990
- return n === 0 ? path : `${path}.${n}`;
991
- }
992
- function createAgentAuditSink(opts = {}) {
993
- const path = opts.path ?? defaultAuditPath();
994
- const maxBytes = opts.maxBytes ?? AUDIT_ROTATE_BYTES;
995
- const keep = Math.max(1, opts.keep ?? AUDIT_KEEP_FILES);
996
- const fs = opts.fs ?? nodeFs;
997
- const now = opts.now ?? (() => new Date);
998
- let written = 0;
999
- let writeFailures = 0;
1000
- let pendingDropped = 0;
1001
- let modeChecked = false;
1002
- let readHour = null;
1003
- let readCounts = {};
1004
- function sizeOf(p) {
1005
- try {
1006
- return fs.statSync(p).size;
1007
- } catch {
1008
- return 0;
1009
- }
1010
- }
1011
- function rotate() {
1012
- fs.rmSync(rotatedPath(path, keep - 1), { force: true });
1013
- for (let n = keep - 2;n >= 0; n--) {
1014
- const from = rotatedPath(path, n);
1015
- try {
1016
- fs.renameSync(from, rotatedPath(path, n + 1));
1017
- } catch (e) {
1018
- if (e?.code !== "ENOENT")
1019
- throw e;
1020
- }
1021
- }
1022
- modeChecked = false;
1023
- }
1024
- function write(rec) {
1025
- try {
1026
- const line = `${JSON.stringify(pendingDropped > 0 ? { ...rec, dropped: pendingDropped } : rec)}
1027
- `;
1028
- if (!modeChecked)
1029
- fs.mkdirSync(dirname(path), { recursive: true, mode: 448 });
1030
- if (keep > 1 && sizeOf(path) + Buffer.byteLength(line) > maxBytes && sizeOf(path) > 0)
1031
- rotate();
1032
- else if (keep === 1 && sizeOf(path) + Buffer.byteLength(line) > maxBytes)
1033
- fs.rmSync(path, { force: true });
1034
- fs.appendFileSync(path, line, { mode: 384 });
1035
- if (!modeChecked) {
1036
- fs.chmodSync(path, 384);
1037
- modeChecked = true;
1038
- }
1039
- written++;
1040
- pendingDropped = 0;
1041
- } catch {
1042
- writeFailures++;
1043
- pendingDropped++;
1044
- }
1045
- }
1046
- function flushReads() {
1047
- if (readHour === null || Object.keys(readCounts).length === 0)
1048
- return;
1049
- const rec = readCountRecord(readHour, readCounts);
1050
- readHour = null;
1051
- readCounts = {};
1052
- write(rec);
1053
- }
1054
- return {
1055
- recordCall(input) {
1056
- try {
1057
- const at = now();
1058
- const hour = hourOf(at);
1059
- if (readHour !== null && readHour !== hour)
1060
- flushReads();
1061
- if (riskOf(input.name) === "R") {
1062
- readHour = hour;
1063
- readCounts[input.name] = (readCounts[input.name] ?? 0) + 1;
1064
- return;
1065
- }
1066
- write(buildToolAuditRecord({ ...input, at }));
1067
- } catch {
1068
- writeFailures++;
1069
- pendingDropped++;
1070
- }
1071
- },
1072
- flush() {
1073
- flushReads();
1074
- },
1075
- stats() {
1076
- return { written, writeFailures, pendingDropped };
1077
- }
1078
- };
1079
- }
1080
-
1081
818
  // agentistics-mcp.ts
1082
819
  var API = process.env.AGENTISTICS_API ?? "http://localhost:47291";
1083
820
  var HARNESS_PARAM = harnessParam();
@@ -1648,30 +1385,7 @@ var TOOLS = [
1648
1385
  }
1649
1386
  ];
1650
1387
  server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
1651
- var audit = createAgentAuditSink();
1652
- process.on("exit", () => audit.flush());
1653
- for (const sig of ["SIGINT", "SIGTERM"]) {
1654
- process.on(sig, () => {
1655
- audit.flush();
1656
- process.exit(0);
1657
- });
1658
- }
1659
1388
  server.setRequestHandler(CallToolRequestSchema, async (req) => {
1660
- const result = await callTool(req);
1661
- const first = result.content?.[0];
1662
- audit.recordCall({
1663
- name: req.params.name,
1664
- args: req.params.arguments,
1665
- client: server.getClientVersion(),
1666
- naySession: process.env.AGENTISTICS_NAY_SESSION,
1667
- result: {
1668
- isError: result.isError === true,
1669
- errorText: first && first.type === "text" ? first.text : undefined
1670
- }
1671
- });
1672
- return result;
1673
- });
1674
- async function callTool(req) {
1675
1389
  const { name, arguments: args } = req.params;
1676
1390
  try {
1677
1391
  switch (name) {
@@ -2350,6 +2064,6 @@ async function callTool(req) {
2350
2064
  isError: true
2351
2065
  };
2352
2066
  }
2353
- }
2067
+ });
2354
2068
  var transport = new StdioServerTransport;
2355
2069
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentistics/mcp",
3
- "version": "2.76.0",
3
+ "version": "2.76.1",
4
4
  "description": "Agentistics MCP server — Claude Code analytics for Claude Desktop and Claude Code",
5
5
  "type": "module",
6
6
  "main": "./dist/agentistics-mcp.js",