@tethral/acr-mcp 2.1.1 → 2.1.3
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/dist/http.mjs +0 -1
- package/dist/index.mjs +0 -1
- package/package.json +11 -11
- package/dist/http.mjs.map +0 -7
- package/dist/index.mjs.map +0 -7
- package/dist/src/acr-state-file.d.ts +0 -6
- package/dist/src/acr-state-file.js +0 -32
- package/dist/src/acr-state-file.js.map +0 -1
- package/dist/src/env-detect.d.ts +0 -25
- package/dist/src/env-detect.js +0 -52
- package/dist/src/env-detect.js.map +0 -1
- package/dist/src/http.d.ts +0 -2
- package/dist/src/http.js +0 -112
- package/dist/src/http.js.map +0 -1
- package/dist/src/index.d.ts +0 -2
- package/dist/src/index.js +0 -17
- package/dist/src/index.js.map +0 -1
- package/dist/src/middleware/correlation-window.d.ts +0 -68
- package/dist/src/middleware/correlation-window.js +0 -113
- package/dist/src/middleware/correlation-window.js.map +0 -1
- package/dist/src/middleware/self-log.d.ts +0 -22
- package/dist/src/middleware/self-log.js +0 -72
- package/dist/src/middleware/self-log.js.map +0 -1
- package/dist/src/server.d.ts +0 -17
- package/dist/src/server.js +0 -96
- package/dist/src/server.js.map +0 -1
- package/dist/src/session-state.d.ts +0 -29
- package/dist/src/session-state.js +0 -102
- package/dist/src/session-state.js.map +0 -1
- package/dist/src/state.d.ts +0 -10
- package/dist/src/state.js +0 -39
- package/dist/src/state.js.map +0 -1
- package/dist/src/strip-sub-components.d.ts +0 -7
- package/dist/src/strip-sub-components.js +0 -15
- package/dist/src/strip-sub-components.js.map +0 -1
- package/dist/src/tools/acknowledge-threat.d.ts +0 -3
- package/dist/src/tools/acknowledge-threat.js +0 -38
- package/dist/src/tools/acknowledge-threat.js.map +0 -1
- package/dist/src/tools/check-entity.d.ts +0 -2
- package/dist/src/tools/check-entity.js +0 -144
- package/dist/src/tools/check-entity.js.map +0 -1
- package/dist/src/tools/check-environment.d.ts +0 -2
- package/dist/src/tools/check-environment.js +0 -32
- package/dist/src/tools/check-environment.js.map +0 -1
- package/dist/src/tools/disable-deep-composition.d.ts +0 -20
- package/dist/src/tools/disable-deep-composition.js +0 -45
- package/dist/src/tools/disable-deep-composition.js.map +0 -1
- package/dist/src/tools/get-coverage.d.ts +0 -2
- package/dist/src/tools/get-coverage.js +0 -67
- package/dist/src/tools/get-coverage.js.map +0 -1
- package/dist/src/tools/get-failure-registry.d.ts +0 -2
- package/dist/src/tools/get-failure-registry.js +0 -75
- package/dist/src/tools/get-failure-registry.js.map +0 -1
- package/dist/src/tools/get-friction-report.d.ts +0 -2
- package/dist/src/tools/get-friction-report.js +0 -208
- package/dist/src/tools/get-friction-report.js.map +0 -1
- package/dist/src/tools/get-interaction-log.d.ts +0 -2
- package/dist/src/tools/get-interaction-log.js +0 -199
- package/dist/src/tools/get-interaction-log.js.map +0 -1
- package/dist/src/tools/get-my-agent.d.ts +0 -2
- package/dist/src/tools/get-my-agent.js +0 -36
- package/dist/src/tools/get-my-agent.js.map +0 -1
- package/dist/src/tools/get-network-status.d.ts +0 -2
- package/dist/src/tools/get-network-status.js +0 -85
- package/dist/src/tools/get-network-status.js.map +0 -1
- package/dist/src/tools/get-notifications.d.ts +0 -3
- package/dist/src/tools/get-notifications.js +0 -34
- package/dist/src/tools/get-notifications.js.map +0 -1
- package/dist/src/tools/get-profile.d.ts +0 -2
- package/dist/src/tools/get-profile.js +0 -89
- package/dist/src/tools/get-profile.js.map +0 -1
- package/dist/src/tools/get-skill-tracker.d.ts +0 -2
- package/dist/src/tools/get-skill-tracker.js +0 -93
- package/dist/src/tools/get-skill-tracker.js.map +0 -1
- package/dist/src/tools/get-skill-versions.d.ts +0 -2
- package/dist/src/tools/get-skill-versions.js +0 -74
- package/dist/src/tools/get-skill-versions.js.map +0 -1
- package/dist/src/tools/get-stable-corridors.d.ts +0 -2
- package/dist/src/tools/get-stable-corridors.js +0 -65
- package/dist/src/tools/get-stable-corridors.js.map +0 -1
- package/dist/src/tools/get-trend.d.ts +0 -2
- package/dist/src/tools/get-trend.js +0 -75
- package/dist/src/tools/get-trend.js.map +0 -1
- package/dist/src/tools/log-interaction.d.ts +0 -3
- package/dist/src/tools/log-interaction.js +0 -177
- package/dist/src/tools/log-interaction.js.map +0 -1
- package/dist/src/tools/register-agent.d.ts +0 -2
- package/dist/src/tools/register-agent.js +0 -102
- package/dist/src/tools/register-agent.js.map +0 -1
- package/dist/src/tools/search-skills.d.ts +0 -2
- package/dist/src/tools/search-skills.js +0 -78
- package/dist/src/tools/search-skills.js.map +0 -1
- package/dist/src/tools/summarize-my-agent.d.ts +0 -2
- package/dist/src/tools/summarize-my-agent.js +0 -100
- package/dist/src/tools/summarize-my-agent.js.map +0 -1
- package/dist/src/tools/update-composition.d.ts +0 -3
- package/dist/src/tools/update-composition.js +0 -89
- package/dist/src/tools/update-composition.js.map +0 -1
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { ensureRegistered, getAgentId, getAgentName, getAuthHeaders } from '../state.js';
|
|
3
|
-
const STATUS_TRANSLATIONS = {
|
|
4
|
-
success: 'success',
|
|
5
|
-
failure: 'failure — target returned an error',
|
|
6
|
-
timeout: 'timeout — target did not respond in time',
|
|
7
|
-
partial: 'partial — incomplete response received',
|
|
8
|
-
};
|
|
9
|
-
// Anomaly categories are passed through as-is from the agent's report.
|
|
10
|
-
// No synthetic descriptions — the category name is the data.
|
|
11
|
-
async function resolveId(agentName, agentId, apiUrl) {
|
|
12
|
-
if (agentName) {
|
|
13
|
-
if (agentName.startsWith('acr_') || agentName.startsWith('pseudo_'))
|
|
14
|
-
return agentName;
|
|
15
|
-
const res = await fetch(`${apiUrl}/api/v1/agent/${encodeURIComponent(agentName)}`);
|
|
16
|
-
if (!res.ok)
|
|
17
|
-
throw new Error(`Agent "${agentName}" not found`);
|
|
18
|
-
const data = await res.json();
|
|
19
|
-
return data.agent_id;
|
|
20
|
-
}
|
|
21
|
-
return agentId || getAgentId() || await ensureRegistered();
|
|
22
|
-
}
|
|
23
|
-
export function getInteractionLogTool(server, apiUrl) {
|
|
24
|
-
server.registerTool('get_interaction_log', {
|
|
25
|
-
description: 'View your interaction history. Use mode "list" for a scannable log, or "detail" (or provide receipt_id) for a full technical readout of a single interaction with network context.',
|
|
26
|
-
inputSchema: {
|
|
27
|
-
agent_id: z.string().optional().describe('Your ACR agent ID'),
|
|
28
|
-
agent_name: z.string().optional().describe('Your agent name (alternative to agent_id)'),
|
|
29
|
-
receipt_id: z.string().optional().describe('Specific receipt ID for detail view'),
|
|
30
|
-
mode: z.enum(['list', 'detail']).optional().default('list').describe('Display mode: "list" for scannable log, "detail" for full readout'),
|
|
31
|
-
limit: z.number().min(1).max(200).optional().default(20).describe('Max interactions to show'),
|
|
32
|
-
target: z.string().optional().describe('Filter by target system (e.g. "mcp:github")'),
|
|
33
|
-
category: z.string().optional().describe('Filter by category (tool_call, delegation, etc.)'),
|
|
34
|
-
status: z.string().optional().describe('Filter by status (success, failure, timeout, partial)'),
|
|
35
|
-
anomaly_only: z.boolean().optional().default(false).describe('Show only anomaly-flagged interactions'),
|
|
36
|
-
since: z.string().optional().describe('Show interactions after this ISO timestamp'),
|
|
37
|
-
},
|
|
38
|
-
annotations: { readOnlyHint: true, destructiveHint: false },
|
|
39
|
-
_meta: { priorityHint: 0.7 },
|
|
40
|
-
}, async ({ agent_id, agent_name, receipt_id, mode, limit, target, category, status, anomaly_only, since }) => {
|
|
41
|
-
let id;
|
|
42
|
-
try {
|
|
43
|
-
id = await resolveId(agent_name, agent_id, apiUrl);
|
|
44
|
-
}
|
|
45
|
-
catch (err) {
|
|
46
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
47
|
-
return { content: [{ type: 'text', text: `Error: ${msg}` }] };
|
|
48
|
-
}
|
|
49
|
-
try {
|
|
50
|
-
// Build query params
|
|
51
|
-
const params = new URLSearchParams();
|
|
52
|
-
if (receipt_id)
|
|
53
|
-
params.set('receipt_id', receipt_id);
|
|
54
|
-
if (limit)
|
|
55
|
-
params.set('limit', String(limit));
|
|
56
|
-
if (target)
|
|
57
|
-
params.set('target', target);
|
|
58
|
-
if (category)
|
|
59
|
-
params.set('category', category);
|
|
60
|
-
if (status)
|
|
61
|
-
params.set('status', status);
|
|
62
|
-
if (anomaly_only)
|
|
63
|
-
params.set('anomaly', 'true');
|
|
64
|
-
if (since)
|
|
65
|
-
params.set('since', since);
|
|
66
|
-
const res = await fetch(`${apiUrl}/api/v1/agent/${id}/receipts?${params}`, { headers: getAuthHeaders() });
|
|
67
|
-
if (!res.ok) {
|
|
68
|
-
const errText = await res.text().catch(() => `HTTP ${res.status}`);
|
|
69
|
-
return { content: [{ type: 'text', text: `Error: ${errText}` }] };
|
|
70
|
-
}
|
|
71
|
-
const data = await res.json();
|
|
72
|
-
if (data.error) {
|
|
73
|
-
return { content: [{ type: 'text', text: `Error: ${data.error.message}` }] };
|
|
74
|
-
}
|
|
75
|
-
const displayName = data.name || agent_name || getAgentName() || id;
|
|
76
|
-
// Detail mode — single receipt
|
|
77
|
-
if (receipt_id || mode === 'detail') {
|
|
78
|
-
if (data.receipt) {
|
|
79
|
-
return { content: [{ type: 'text', text: formatDetail(data, displayName) }] };
|
|
80
|
-
}
|
|
81
|
-
// If receipt_id was given but we got a list, show first item in detail
|
|
82
|
-
if (data.receipts && data.receipts.length > 0) {
|
|
83
|
-
return { content: [{ type: 'text', text: formatListDetailed(data.receipts.slice(0, 5), displayName) }] };
|
|
84
|
-
}
|
|
85
|
-
return { content: [{ type: 'text', text: `No interactions found for ${displayName}. Call log_interaction after each external tool call to start recording data.` }] };
|
|
86
|
-
}
|
|
87
|
-
// List mode
|
|
88
|
-
const receipts = data.receipts ?? [];
|
|
89
|
-
if (receipts.length === 0) {
|
|
90
|
-
return { content: [{ type: 'text', text: `No interactions found for ${displayName}. Call log_interaction after each external tool call to start recording data.` }] };
|
|
91
|
-
}
|
|
92
|
-
let text = `Interaction Log for ${displayName}\n`;
|
|
93
|
-
text += `Showing ${receipts.length} interaction${receipts.length === 1 ? '' : 's'}`;
|
|
94
|
-
if (data.next_cursor)
|
|
95
|
-
text += ' (more available)';
|
|
96
|
-
text += '\n\n';
|
|
97
|
-
for (const r of receipts) {
|
|
98
|
-
text += formatListLine(r);
|
|
99
|
-
}
|
|
100
|
-
if (data.next_cursor) {
|
|
101
|
-
text += `\n... more interactions available. Use since/target/category filters or cursor to paginate.`;
|
|
102
|
-
}
|
|
103
|
-
return { content: [{ type: 'text', text }] };
|
|
104
|
-
}
|
|
105
|
-
catch (err) {
|
|
106
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
107
|
-
return { content: [{ type: 'text', text: `Interaction log error: ${msg}` }] };
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
function formatListLine(r) {
|
|
112
|
-
let line = `[${r.created_at}] ${r.interaction_category} -> ${r.target_system_id} (${r.target_system_type})\n`;
|
|
113
|
-
line += ` ${r.duration_ms ?? '?'}ms | ${STATUS_TRANSLATIONS[r.status] ?? r.status}`;
|
|
114
|
-
if (r.anomaly_flagged) {
|
|
115
|
-
const cat = r.anomaly_category;
|
|
116
|
-
line += ` | ANOMALY: ${cat}`;
|
|
117
|
-
}
|
|
118
|
-
line += '\n';
|
|
119
|
-
if (r.anomaly_flagged && r.anomaly_detail) {
|
|
120
|
-
line += ` [reported] ${r.anomaly_detail}\n`;
|
|
121
|
-
}
|
|
122
|
-
return line + '\n';
|
|
123
|
-
}
|
|
124
|
-
function formatDetail(data, displayName) {
|
|
125
|
-
const r = data.receipt;
|
|
126
|
-
const ctx = data.network_context;
|
|
127
|
-
const baseline = data.baseline;
|
|
128
|
-
let text = `Receipt: ${r.receipt_id}\n`;
|
|
129
|
-
text += `${'='.repeat(40)}\n`;
|
|
130
|
-
text += `When: ${r.created_at}\n`;
|
|
131
|
-
text += `What: ${r.interaction_category} -> ${r.target_system_id} (${r.target_system_type})\n`;
|
|
132
|
-
// Duration with baseline context
|
|
133
|
-
const dur = r.duration_ms;
|
|
134
|
-
if (dur != null) {
|
|
135
|
-
text += `Duration: ${dur}ms`;
|
|
136
|
-
if (baseline) {
|
|
137
|
-
const bMedian = baseline.baseline_median_ms;
|
|
138
|
-
const bP95 = baseline.baseline_p95_ms;
|
|
139
|
-
if (bMedian > 0) {
|
|
140
|
-
const ratio = dur / bMedian;
|
|
141
|
-
if (ratio > 2) {
|
|
142
|
-
text += ` — ${ratio.toFixed(1)}x baseline median (${bMedian}ms), p95 ${bP95}ms`;
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
text += ` — within normal range (baseline median ${bMedian}ms, p95 ${bP95}ms)`;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
text += '\n';
|
|
150
|
-
}
|
|
151
|
-
text += `Status: ${STATUS_TRANSLATIONS[r.status] ?? r.status}\n`;
|
|
152
|
-
text += `\nAgent: ${displayName} (${r.emitter_agent_id})\n`;
|
|
153
|
-
if (r.emitter_provider_class)
|
|
154
|
-
text += `Provider: ${r.emitter_provider_class}\n`;
|
|
155
|
-
if (r.emitter_composition_hash)
|
|
156
|
-
text += `Composition: ${r.emitter_composition_hash}\n`;
|
|
157
|
-
if (r.anomaly_flagged) {
|
|
158
|
-
const cat = r.anomaly_category;
|
|
159
|
-
text += `\nAnomaly: ${cat}\n`;
|
|
160
|
-
if (r.anomaly_detail) {
|
|
161
|
-
text += `[reported] ${r.anomaly_detail}\n`;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
text += `\nAnomaly: none\n`;
|
|
166
|
-
}
|
|
167
|
-
// Network context
|
|
168
|
-
if (ctx) {
|
|
169
|
-
text += `\n-- Network Context --\n`;
|
|
170
|
-
text += `${r.target_system_id} — failure ${(ctx.failure_rate * 100).toFixed(1)}%`;
|
|
171
|
-
text += `, anomaly ${(ctx.anomaly_rate * 100).toFixed(1)}%`;
|
|
172
|
-
text += `, ${ctx.distinct_agent_count} agents observed\n`;
|
|
173
|
-
if (ctx.median_duration_ms != null) {
|
|
174
|
-
text += `Network median: ${ctx.median_duration_ms}ms`;
|
|
175
|
-
if (ctx.p95_duration_ms != null)
|
|
176
|
-
text += `, p95: ${ctx.p95_duration_ms}ms`;
|
|
177
|
-
text += '\n';
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return text;
|
|
181
|
-
}
|
|
182
|
-
function formatListDetailed(receipts, displayName) {
|
|
183
|
-
let text = `Interaction Detail for ${displayName}\n${'='.repeat(40)}\n\n`;
|
|
184
|
-
for (const r of receipts) {
|
|
185
|
-
text += `[${r.created_at}] ${r.interaction_category} -> ${r.target_system_id}\n`;
|
|
186
|
-
text += ` ${r.duration_ms ?? '?'}ms | ${STATUS_TRANSLATIONS[r.status] ?? r.status}\n`;
|
|
187
|
-
if (r.emitter_composition_hash)
|
|
188
|
-
text += ` composition: ${r.emitter_composition_hash}\n`;
|
|
189
|
-
if (r.anomaly_flagged) {
|
|
190
|
-
text += ` ANOMALY: ${r.anomaly_category}`;
|
|
191
|
-
if (r.anomaly_detail)
|
|
192
|
-
text += ` — [reported] ${r.anomaly_detail}`;
|
|
193
|
-
text += '\n';
|
|
194
|
-
}
|
|
195
|
-
text += '\n';
|
|
196
|
-
}
|
|
197
|
-
return text;
|
|
198
|
-
}
|
|
199
|
-
//# sourceMappingURL=get-interaction-log.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-interaction-log.js","sourceRoot":"","sources":["../../../src/tools/get-interaction-log.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAc,cAAc,EAAE,MAAM,aAAa,CAAC;AAErG,MAAM,mBAAmB,GAA2B;IAClD,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,oCAAoC;IAC7C,OAAO,EAAE,0CAA0C;IACnD,OAAO,EAAE,wCAAwC;CAClD,CAAC;AAEF,uEAAuE;AACvE,6DAA6D;AAE7D,KAAK,UAAU,SAAS,CAAC,SAA6B,EAAE,OAA2B,EAAE,MAAc;IACjG,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QACtF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,iBAAiB,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,aAAa,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA0B,CAAC;QACtD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,OAAO,OAAO,IAAI,UAAU,EAAE,IAAI,MAAM,gBAAgB,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAc;IACrE,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,WAAW,EAAE,oLAAoL;QACjM,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC7D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACvF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACjF,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,mEAAmE,CAAC;YACzI,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YAC7F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;YACrF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;YAC5F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YAC/F,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;YACtG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;SACpF;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE;QAC3D,KAAK,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE;KAC7B,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE;QACzG,IAAI,EAAU,CAAC;QACf,IAAI,CAAC;YACH,EAAE,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QACzE,CAAC;QAED,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,UAAU;gBAAE,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,KAAK;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,IAAI,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACzC,IAAI,QAAQ;gBAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC/C,IAAI,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACzC,IAAI,YAAY;gBAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAChD,IAAI,KAAK;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAEtC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,iBAAiB,EAAE,aAAa,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;YAC1G,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;gBACnE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7E,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAE9B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;YACxF,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,IAAI,YAAY,EAAE,IAAI,EAAE,CAAC;YAEpE,+BAA+B;YAC/B,IAAI,UAAU,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;gBACzF,CAAC;gBACD,uEAAuE;gBACvE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpH,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,WAAW,+EAA+E,EAAE,CAAC,EAAE,CAAC;YACjL,CAAC;YAED,YAAY;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;YACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,WAAW,+EAA+E,EAAE,CAAC,EAAE,CAAC;YACjL,CAAC;YAED,IAAI,IAAI,GAAG,uBAAuB,WAAW,IAAI,CAAC;YAClD,IAAI,IAAI,WAAW,QAAQ,CAAC,MAAM,eAAe,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACpF,IAAI,IAAI,CAAC,WAAW;gBAAE,IAAI,IAAI,mBAAmB,CAAC;YAClD,IAAI,IAAI,MAAM,CAAC;YAEf,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,IAAI,6FAA6F,CAAC;YACxG,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,CAA0B;IAChD,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,oBAAoB,OAAO,CAAC,CAAC,gBAAgB,KAAK,CAAC,CAAC,kBAAkB,KAAK,CAAC;IAC9G,IAAI,IAAI,KAAK,CAAC,CAAC,WAAW,IAAI,GAAG,QAAQ,mBAAmB,CAAC,CAAC,CAAC,MAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/F,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,CAAC,CAAC,gBAA0B,CAAC;QACzC,IAAI,IAAI,eAAe,GAAG,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;QAC1C,IAAI,IAAI,gBAAgB,CAAC,CAAC,cAAc,IAAI,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CAAC,IAA6B,EAAE,WAAmB;IACtE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAkC,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,eAAiD,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA0C,CAAC;IAEjE,IAAI,IAAI,GAAG,YAAY,CAAC,CAAC,UAAU,IAAI,CAAC;IACxC,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;IAC9B,IAAI,IAAI,SAAS,CAAC,CAAC,UAAU,IAAI,CAAC;IAClC,IAAI,IAAI,SAAS,CAAC,CAAC,oBAAoB,OAAO,CAAC,CAAC,gBAAgB,KAAK,CAAC,CAAC,kBAAkB,KAAK,CAAC;IAE/F,iCAAiC;IACjC,MAAM,GAAG,GAAG,CAAC,CAAC,WAA4B,CAAC;IAC3C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,IAAI,IAAI,aAAa,GAAG,IAAI,CAAC;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,QAAQ,CAAC,kBAA4B,CAAC;YACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAyB,CAAC;YAChD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC;gBAC5B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;oBACd,IAAI,IAAI,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,OAAO,YAAY,IAAI,IAAI,CAAC;gBAClF,CAAC;qBAAM,CAAC;oBACN,IAAI,IAAI,2CAA2C,OAAO,WAAW,IAAI,KAAK,CAAC;gBACjF,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,IAAI,IAAI,CAAC;IACf,CAAC;IAED,IAAI,IAAI,WAAW,mBAAmB,CAAC,CAAC,CAAC,MAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;IAC3E,IAAI,IAAI,YAAY,WAAW,KAAK,CAAC,CAAC,gBAAgB,KAAK,CAAC;IAC5D,IAAI,CAAC,CAAC,sBAAsB;QAAE,IAAI,IAAI,aAAa,CAAC,CAAC,sBAAsB,IAAI,CAAC;IAChF,IAAI,CAAC,CAAC,wBAAwB;QAAE,IAAI,IAAI,gBAAgB,CAAC,CAAC,wBAAwB,IAAI,CAAC;IAEvF,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,CAAC,CAAC,gBAA0B,CAAC;QACzC,IAAI,IAAI,cAAc,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;YACrB,IAAI,IAAI,cAAc,CAAC,CAAC,cAAc,IAAI,CAAC;QAC7C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,mBAAmB,CAAC;IAC9B,CAAC;IAED,kBAAkB;IAClB,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,IAAI,2BAA2B,CAAC;QACpC,IAAI,IAAI,GAAG,CAAC,CAAC,gBAAgB,cAAc,CAAE,GAAG,CAAC,YAAuB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9F,IAAI,IAAI,aAAa,CAAE,GAAG,CAAC,YAAuB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACxE,IAAI,IAAI,KAAK,GAAG,CAAC,oBAAoB,oBAAoB,CAAC;QAC1D,IAAI,GAAG,CAAC,kBAAkB,IAAI,IAAI,EAAE,CAAC;YACnC,IAAI,IAAI,mBAAmB,GAAG,CAAC,kBAAkB,IAAI,CAAC;YACtD,IAAI,GAAG,CAAC,eAAe,IAAI,IAAI;gBAAE,IAAI,IAAI,UAAU,GAAG,CAAC,eAAe,IAAI,CAAC;YAC3E,IAAI,IAAI,IAAI,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAwC,EAAE,WAAmB;IACvF,IAAI,IAAI,GAAG,0BAA0B,WAAW,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;IAC1E,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,oBAAoB,OAAO,CAAC,CAAC,gBAAgB,IAAI,CAAC;QACjF,IAAI,IAAI,KAAK,CAAC,CAAC,WAAW,IAAI,GAAG,QAAQ,mBAAmB,CAAC,CAAC,CAAC,MAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;QACjG,IAAI,CAAC,CAAC,wBAAwB;YAAE,IAAI,IAAI,kBAAkB,CAAC,CAAC,wBAAwB,IAAI,CAAC;QACzF,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;YACtB,IAAI,IAAI,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAC3C,IAAI,CAAC,CAAC,cAAc;gBAAE,IAAI,IAAI,iBAAiB,CAAC,CAAC,cAAc,EAAE,CAAC;YAClE,IAAI,IAAI,IAAI,CAAC;QACf,CAAC;QACD,IAAI,IAAI,IAAI,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { ensureRegistered, getAgentId, getAgentName, getApiUrl, getApiKey, getAuthHeaders } from '../state.js';
|
|
2
|
-
const DASHBOARD_URL = process.env.ACR_DASHBOARD_URL ?? 'https://dashboard.acr.nfkey.ai';
|
|
3
|
-
export function getMyAgentTool(server) {
|
|
4
|
-
server.registerTool('get_my_agent', {
|
|
5
|
-
description: 'Get your agent profile — name, ID, provider, status, and registration date. Zero-config: uses the auto-assigned agent identity.',
|
|
6
|
-
annotations: { readOnlyHint: true, destructiveHint: false },
|
|
7
|
-
_meta: { priorityHint: 0.8 },
|
|
8
|
-
}, async () => {
|
|
9
|
-
const id = getAgentId() || await ensureRegistered();
|
|
10
|
-
const name = getAgentName();
|
|
11
|
-
const apiUrl = getApiUrl();
|
|
12
|
-
const apiKey = getApiKey();
|
|
13
|
-
try {
|
|
14
|
-
const res = await fetch(`${apiUrl}/api/v1/agent/${encodeURIComponent(id)}`, {
|
|
15
|
-
headers: getAuthHeaders(),
|
|
16
|
-
});
|
|
17
|
-
const agent = res.ok
|
|
18
|
-
? await res.json()
|
|
19
|
-
: null;
|
|
20
|
-
const displayName = agent?.name ?? name ?? id;
|
|
21
|
-
const provider = agent?.provider_class ?? 'unknown';
|
|
22
|
-
let text = `${displayName} (${provider})\n`;
|
|
23
|
-
text += `ID: ${id}\n`;
|
|
24
|
-
if (apiKey)
|
|
25
|
-
text += `Key: ${apiKey.substring(0, 16)}...${apiKey.substring(apiKey.length - 4)} (full key in ~/.claude/.acr-state.json)\n`;
|
|
26
|
-
text += `Dashboard: ${DASHBOARD_URL}/agents/${id}\n`;
|
|
27
|
-
text += `\nLenses: get_friction_report · get_profile · summarize_my_agent · get_coverage · get_failure_registry · get_stable_corridors · get_trend · get_interaction_log · get_network_status`;
|
|
28
|
-
return { content: [{ type: 'text', text }] };
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
32
|
-
return { content: [{ type: 'text', text: `Error: ${msg}` }] };
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=get-my-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-my-agent.js","sourceRoot":"","sources":["../../../src/tools/get-my-agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/G,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,gCAAgC,CAAC;AAExF,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,WAAW,EAAE,iIAAiI;QAC9I,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE;QAC3D,KAAK,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,GAAG,UAAU,EAAE,IAAI,MAAM,gBAAgB,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,iBAAiB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1E,OAAO,EAAE,cAAc,EAAE;aAC1B,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE;gBAClB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAGb;gBACH,CAAC,CAAC,IAAI,CAAC;YAET,MAAM,WAAW,GAAG,KAAK,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,KAAK,EAAE,cAAc,IAAI,SAAS,CAAC;YAEpD,IAAI,IAAI,GAAG,GAAG,WAAW,KAAK,QAAQ,KAAK,CAAC;YAC5C,IAAI,IAAI,OAAO,EAAE,IAAI,CAAC;YACtB,IAAI,MAAM;gBAAE,IAAI,IAAI,QAAQ,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,4CAA4C,CAAC;YACzI,IAAI,IAAI,cAAc,aAAa,WAAW,EAAE,IAAI,CAAC;YACrD,IAAI,IAAI,sLAAsL,CAAC;YAE/L,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QACzE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
export function getNetworkStatusTool(server, apiUrl) {
|
|
2
|
-
server.registerTool('get_network_status', {
|
|
3
|
-
description: 'Network-wide observation dashboard. Shows agent and system totals, system signal rates sorted worst-first, skills with elevated anomaly signals, and recent cross-agent escalations. Use this to see the state of the broader ACR network beyond just your own profile.',
|
|
4
|
-
annotations: { readOnlyHint: true, destructiveHint: false },
|
|
5
|
-
_meta: { priorityHint: 0.7 },
|
|
6
|
-
}, async () => {
|
|
7
|
-
try {
|
|
8
|
-
const res = await fetch(`${apiUrl}/api/v1/network/status`);
|
|
9
|
-
if (!res.ok) {
|
|
10
|
-
const errText = await res.text().catch(() => `HTTP ${res.status}`);
|
|
11
|
-
return { content: [{ type: 'text', text: `Network status error: ${errText}` }] };
|
|
12
|
-
}
|
|
13
|
-
const data = await res.json();
|
|
14
|
-
const t = data.totals ?? {};
|
|
15
|
-
let text = `ACR Network Dashboard\n${'='.repeat(30)}\n`;
|
|
16
|
-
if (data.stale) {
|
|
17
|
-
text += `\nDATA MAY BE STALE — background jobs may not have run recently.\n`;
|
|
18
|
-
}
|
|
19
|
-
// Totals
|
|
20
|
-
text += `\n-- Totals (24h) --\n`;
|
|
21
|
-
text += ` Active agents: ${t.active_agents ?? 0}`;
|
|
22
|
-
text += ` | Systems: ${t.active_systems ?? 0}`;
|
|
23
|
-
text += ` | Interactions: ${(t.interactions_24h ?? 0).toLocaleString()}\n`;
|
|
24
|
-
const anomalyPct = ((t.anomaly_rate_24h ?? 0) * 100).toFixed(1);
|
|
25
|
-
text += ` Anomaly rate: ${anomalyPct}%\n`;
|
|
26
|
-
// Systems
|
|
27
|
-
const systems = data.systems ?? [];
|
|
28
|
-
if (systems.length > 0) {
|
|
29
|
-
text += `\n-- Systems (${systems.length}, worst-first) --\n`;
|
|
30
|
-
for (const s of systems.slice(0, 20)) {
|
|
31
|
-
text += ` ${s.system_id}`;
|
|
32
|
-
text += ` — ${s.agent_count ?? 0} agents`;
|
|
33
|
-
if (s.failure_rate > 0)
|
|
34
|
-
text += `, ${(s.failure_rate * 100).toFixed(1)}% failure`;
|
|
35
|
-
if (s.anomaly_rate > 0)
|
|
36
|
-
text += `, ${(s.anomaly_rate * 100).toFixed(1)}% anomaly`;
|
|
37
|
-
if (s.median_duration_ms != null)
|
|
38
|
-
text += `, ${s.median_duration_ms}ms median`;
|
|
39
|
-
text += '\n';
|
|
40
|
-
}
|
|
41
|
-
if (systems.length > 20) {
|
|
42
|
-
text += ` ... and ${systems.length - 20} more systems\n`;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
text += `\n-- Systems --\n No system health data available.\n`;
|
|
47
|
-
}
|
|
48
|
-
// Skills with anomaly signals
|
|
49
|
-
const threats = data.threats ?? [];
|
|
50
|
-
if (threats.length > 0) {
|
|
51
|
-
text += `\n-- Skill Anomaly Signals (${threats.length}) --\n`;
|
|
52
|
-
for (const th of threats) {
|
|
53
|
-
text += ` ${th.skill_name || th.skill_hash.substring(0, 16) + '...'}`;
|
|
54
|
-
text += ` — ${th.anomaly_signal_count} signals, ${th.agent_count} reporters`;
|
|
55
|
-
text += '\n';
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
text += `\n-- Skill Anomaly Signals --\n No elevated anomaly signals observed.\n`;
|
|
60
|
-
}
|
|
61
|
-
// Escalations
|
|
62
|
-
const escalations = data.recent_escalations ?? [];
|
|
63
|
-
if (escalations.length > 0) {
|
|
64
|
-
text += `\n-- Recent Escalations (${escalations.length}) --\n`;
|
|
65
|
-
for (const e of escalations) {
|
|
66
|
-
text += ` ${e.target} — ${e.agents_affected} agents`;
|
|
67
|
-
if (e.providers_affected?.length > 0) {
|
|
68
|
-
text += `, ${e.providers_affected.length} providers [${e.providers_affected.join(', ')}]`;
|
|
69
|
-
}
|
|
70
|
-
text += '\n';
|
|
71
|
-
if (e.anomaly_categories?.length > 0) {
|
|
72
|
-
text += ` Categories: ${e.anomaly_categories.join(', ')}\n`;
|
|
73
|
-
}
|
|
74
|
-
text += ` Detected: ${e.detected_at}\n`;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return { content: [{ type: 'text', text }] };
|
|
78
|
-
}
|
|
79
|
-
catch (err) {
|
|
80
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
81
|
-
return { content: [{ type: 'text', text: `Network status error: ${msg}` }] };
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=get-network-status.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-network-status.js","sourceRoot":"","sources":["../../../src/tools/get-network-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { getAuthHeaders } from '../state.js';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
export function getNotificationsTool(server, apiUrl, getSession) {
|
|
4
|
-
server.registerTool('get_notifications', {
|
|
5
|
-
description: 'Check for unread anomaly signal notifications about components in your composition. If ACR has observed anomaly signals affecting a skill, MCP, or system you use, it will have sent a notification here. Also delivers version updates. Call this on startup. ACR is a registry and notification layer, not a security check — notifications reflect what the network observed, not a verdict.',
|
|
6
|
-
inputSchema: {
|
|
7
|
-
agent_id: z.string().optional().describe('Your agent ID (uses session if omitted)'),
|
|
8
|
-
},
|
|
9
|
-
annotations: { readOnlyHint: true, destructiveHint: false },
|
|
10
|
-
_meta: { priorityHint: 0.5 },
|
|
11
|
-
}, async ({ agent_id }) => {
|
|
12
|
-
try {
|
|
13
|
-
const resolvedId = agent_id ?? getSession().agentId ?? await getSession().ensureRegistered(apiUrl);
|
|
14
|
-
const res = await fetch(`${apiUrl}/api/v1/agent/${resolvedId}/notifications?read=false`, { headers: getAuthHeaders() });
|
|
15
|
-
const data = await res.json();
|
|
16
|
-
if (data.unread_count === 0) {
|
|
17
|
-
return { content: [{ type: 'text', text: 'No unread notifications.' }] };
|
|
18
|
-
}
|
|
19
|
-
let text = `You have ${data.unread_count} unread notification(s):\n`;
|
|
20
|
-
for (const n of data.notifications) {
|
|
21
|
-
text += `\n[${n.severity}] ${n.title}`;
|
|
22
|
-
text += `\n ${n.message}`;
|
|
23
|
-
text += `\n ID: ${n.id} | ${n.created_at.split('T')[0]}`;
|
|
24
|
-
text += '\n';
|
|
25
|
-
}
|
|
26
|
-
return { content: [{ type: 'text', text }] };
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
30
|
-
return { content: [{ type: 'text', text: `Notification check error: ${msg}` }] };
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=get-notifications.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-notifications.js","sourceRoot":"","sources":["../../../src/tools/get-notifications.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAc,EAAE,UAA8B;IACpG,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,WAAW,EAAE,iYAAiY;QAC9Y,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SACpF;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE;QAC3D,KAAK,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE;KAC7B,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC,OAAO,IAAI,MAAM,UAAU,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACnG,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,iBAAiB,UAAU,2BAA2B,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;YACxH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAM1B,CAAC;YAEF,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,EAAE,CAAC;YACpF,CAAC;YAED,IAAI,IAAI,GAAG,YAAY,IAAI,CAAC,YAAY,4BAA4B,CAAC;YACrE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnC,IAAI,IAAI,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACvC,IAAI,IAAI,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC5B,IAAI,IAAI,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,IAAI,IAAI,IAAI,CAAC;YACf,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { ensureRegistered, getAgentId, getAgentName, getApiUrl, getAuthHeaders } from '../state.js';
|
|
3
|
-
async function resolveId(nameOrId) {
|
|
4
|
-
if (nameOrId.startsWith('acr_') || nameOrId.startsWith('pseudo_'))
|
|
5
|
-
return nameOrId;
|
|
6
|
-
const res = await fetch(`${getApiUrl()}/api/v1/agent/${encodeURIComponent(nameOrId)}`);
|
|
7
|
-
if (!res.ok)
|
|
8
|
-
throw new Error(`Agent "${nameOrId}" not found`);
|
|
9
|
-
return (await res.json()).agent_id;
|
|
10
|
-
}
|
|
11
|
-
export function getProfileTool(server, apiUrl) {
|
|
12
|
-
server.registerTool('get_profile', {
|
|
13
|
-
description: 'Your interaction profile: identity, composition summary, composition delta (MCP-observed vs agent-reported), receipt counts, target counts, and days active. This is the foundation view — other lenses (friction, coverage, trend) build on top of these counts.',
|
|
14
|
-
inputSchema: {
|
|
15
|
-
agent_id: z.string().optional().describe('Your ACR agent ID (auto-assigned if omitted)'),
|
|
16
|
-
agent_name: z.string().optional().describe('Your agent name (alternative to agent_id)'),
|
|
17
|
-
},
|
|
18
|
-
annotations: { readOnlyHint: true, destructiveHint: false },
|
|
19
|
-
_meta: { priorityHint: 0.7 },
|
|
20
|
-
}, async ({ agent_id, agent_name }) => {
|
|
21
|
-
let id;
|
|
22
|
-
try {
|
|
23
|
-
id = agent_name ? await resolveId(agent_name) : (agent_id || getAgentId() || await ensureRegistered());
|
|
24
|
-
}
|
|
25
|
-
catch (err) {
|
|
26
|
-
return { content: [{ type: 'text', text: `Error: ${err instanceof Error ? err.message : 'Unknown'}` }] };
|
|
27
|
-
}
|
|
28
|
-
try {
|
|
29
|
-
const res = await fetch(`${apiUrl}/api/v1/agent/${id}/profile`, { headers: getAuthHeaders() });
|
|
30
|
-
if (!res.ok) {
|
|
31
|
-
const errText = await res.text().catch(() => `HTTP ${res.status}`);
|
|
32
|
-
return { content: [{ type: 'text', text: `Profile error: ${errText}` }] };
|
|
33
|
-
}
|
|
34
|
-
const data = await res.json();
|
|
35
|
-
const displayName = data.name || agent_name || getAgentName() || id;
|
|
36
|
-
const c = data.counts;
|
|
37
|
-
const comp = data.composition_summary;
|
|
38
|
-
let text = `Profile: ${displayName}\n${'='.repeat(30)}\n`;
|
|
39
|
-
text += `Agent ID: ${data.agent_id}\n`;
|
|
40
|
-
if (data.provider_class)
|
|
41
|
-
text += `Provider: ${data.provider_class}\n`;
|
|
42
|
-
if (data.operational_domain)
|
|
43
|
-
text += `Domain: ${data.operational_domain}\n`;
|
|
44
|
-
if (data.composition_hash)
|
|
45
|
-
text += `Composition hash: ${data.composition_hash}\n`;
|
|
46
|
-
text += `Registered: ${data.registered_at}\n`;
|
|
47
|
-
text += `Last active: ${data.last_active_at}\n`;
|
|
48
|
-
text += `\n-- Counts --\n`;
|
|
49
|
-
text += ` Total receipts: ${c.total_receipts}\n`;
|
|
50
|
-
text += ` Last 24h: ${c.receipts_last_24h}\n`;
|
|
51
|
-
text += ` Distinct targets: ${c.distinct_targets}\n`;
|
|
52
|
-
text += ` Distinct categories: ${c.distinct_categories}\n`;
|
|
53
|
-
text += ` Distinct chains: ${c.distinct_chains}\n`;
|
|
54
|
-
text += ` Days active: ${c.days_active}\n`;
|
|
55
|
-
if (c.first_signal_at)
|
|
56
|
-
text += ` First signal: ${c.first_signal_at}\n`;
|
|
57
|
-
if (c.last_signal_at)
|
|
58
|
-
text += ` Last signal: ${c.last_signal_at}\n`;
|
|
59
|
-
text += `\n-- Composition --\n`;
|
|
60
|
-
text += ` Skills: ${comp.skill_count ?? 0}\n`;
|
|
61
|
-
text += ` MCPs: ${comp.mcp_count ?? 0}\n`;
|
|
62
|
-
text += ` Tools: ${comp.tool_count ?? 0}\n`;
|
|
63
|
-
const delta = data.composition_delta;
|
|
64
|
-
if (delta) {
|
|
65
|
-
const mcpOnly = delta.mcp_only;
|
|
66
|
-
const agentOnly = delta.agent_only;
|
|
67
|
-
if (mcpOnly.length > 0 || agentOnly.length > 0) {
|
|
68
|
-
text += `\n-- Composition Delta (MCP-observed vs agent-reported) --\n`;
|
|
69
|
-
if (mcpOnly.length > 0)
|
|
70
|
-
text += ` MCP sees but agent didn't report: ${mcpOnly.join(', ')}\n`;
|
|
71
|
-
if (agentOnly.length > 0)
|
|
72
|
-
text += ` Agent reported but MCP doesn't see: ${agentOnly.join(', ')}\n`;
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
text += `\n Composition sources agree.\n`;
|
|
76
|
-
}
|
|
77
|
-
if (delta.last_observed_at)
|
|
78
|
-
text += ` Last MCP observation: ${delta.last_observed_at}\n`;
|
|
79
|
-
if (delta.last_reported_at)
|
|
80
|
-
text += ` Last agent report: ${delta.last_reported_at}\n`;
|
|
81
|
-
}
|
|
82
|
-
return { content: [{ type: 'text', text }] };
|
|
83
|
-
}
|
|
84
|
-
catch (err) {
|
|
85
|
-
return { content: [{ type: 'text', text: `Profile error: ${err instanceof Error ? err.message : 'Unknown'}` }] };
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=get-profile.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-profile.js","sourceRoot":"","sources":["../../../src/tools/get-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
export function getSkillTrackerTool(server, apiUrl) {
|
|
3
|
-
server.registerTool('get_skill_tracker', {
|
|
4
|
-
description: 'Track skill adoption and anomaly signal rates across the agent population. Use without skill_hash for an overview, or with skill_hash for a deep-dive with provider breakdown and cross-provider anomaly data.',
|
|
5
|
-
inputSchema: {
|
|
6
|
-
skill_hash: z.string().optional().describe('Specific skill hash for deep-dive view'),
|
|
7
|
-
min_anomaly_signals: z.number().optional().describe('Only show skills with at least this many anomaly signals'),
|
|
8
|
-
sort: z.enum(['agent_count', 'interaction_count', 'anomaly_signal_rate']).optional().default('agent_count').describe('Sort field'),
|
|
9
|
-
limit: z.number().min(1).max(100).optional().default(20).describe('Max skills to show'),
|
|
10
|
-
},
|
|
11
|
-
annotations: { readOnlyHint: true, destructiveHint: false },
|
|
12
|
-
_meta: { priorityHint: 0.5 },
|
|
13
|
-
}, async ({ skill_hash, min_anomaly_signals, sort, limit }) => {
|
|
14
|
-
try {
|
|
15
|
-
// Deep-dive mode
|
|
16
|
-
if (skill_hash) {
|
|
17
|
-
const res = await fetch(`${apiUrl}/api/v1/network/skills/${encodeURIComponent(skill_hash)}`);
|
|
18
|
-
if (!res.ok) {
|
|
19
|
-
const data = await res.json().catch(() => ({}));
|
|
20
|
-
return { content: [{ type: 'text', text: `Error: ${data.message ?? 'Skill not found'}` }] };
|
|
21
|
-
}
|
|
22
|
-
const skill = await res.json();
|
|
23
|
-
return { content: [{ type: 'text', text: formatSkillDetail(skill) }] };
|
|
24
|
-
}
|
|
25
|
-
// List mode
|
|
26
|
-
const params = new URLSearchParams();
|
|
27
|
-
if (min_anomaly_signals != null)
|
|
28
|
-
params.set('min_anomaly_signals', String(min_anomaly_signals));
|
|
29
|
-
if (sort)
|
|
30
|
-
params.set('sort', sort);
|
|
31
|
-
if (limit)
|
|
32
|
-
params.set('limit', String(limit));
|
|
33
|
-
const res = await fetch(`${apiUrl}/api/v1/network/skills?${params}`);
|
|
34
|
-
if (!res.ok) {
|
|
35
|
-
const errText = await res.text().catch(() => `HTTP ${res.status}`);
|
|
36
|
-
return { content: [{ type: 'text', text: `Skill tracker error: ${errText}` }] };
|
|
37
|
-
}
|
|
38
|
-
const data = await res.json();
|
|
39
|
-
if (!data.skills || data.skills.length === 0) {
|
|
40
|
-
return { content: [{ type: 'text', text: 'No skills tracked yet.' }] };
|
|
41
|
-
}
|
|
42
|
-
let text = `Skill Tracker\n${'='.repeat(20)}\n\n`;
|
|
43
|
-
for (const s of data.skills) {
|
|
44
|
-
text += `${s.skill_name || s.skill_hash.substring(0, 16) + '...'}\n`;
|
|
45
|
-
text += ` ${s.agent_count} agents | ${s.interaction_count} interactions`;
|
|
46
|
-
const sigRate = s.anomaly_signal_rate;
|
|
47
|
-
if (sigRate > 0) {
|
|
48
|
-
text += ` | ${s.anomaly_signal_count} anomaly signals (${(sigRate * 100).toFixed(2)}%)`;
|
|
49
|
-
}
|
|
50
|
-
text += '\n\n';
|
|
51
|
-
}
|
|
52
|
-
if (data.next_cursor) {
|
|
53
|
-
text += `... more skills available. Use filters or cursor to paginate.\n`;
|
|
54
|
-
}
|
|
55
|
-
return { content: [{ type: 'text', text }] };
|
|
56
|
-
}
|
|
57
|
-
catch (err) {
|
|
58
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
59
|
-
return { content: [{ type: 'text', text: `Skill tracker error: ${msg}` }] };
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
function formatSkillDetail(skill) {
|
|
64
|
-
let text = `Skill: ${skill.skill_name || skill.skill_hash}\n`;
|
|
65
|
-
text += `${'='.repeat(40)}\n`;
|
|
66
|
-
text += ` Hash: ${skill.skill_hash}\n`;
|
|
67
|
-
text += ` Adoption: ${skill.agent_count} agents | ${skill.interaction_count} interactions\n`;
|
|
68
|
-
const sigCount = skill.anomaly_signal_count;
|
|
69
|
-
const sigRate = skill.anomaly_signal_rate;
|
|
70
|
-
text += ` Anomaly rate: ${(sigRate * 100).toFixed(2)}% (${sigCount} signals)\n`;
|
|
71
|
-
text += ` First seen: ${skill.first_seen} | Last updated: ${skill.last_updated}\n`;
|
|
72
|
-
// Provider breakdown
|
|
73
|
-
const providers = skill.provider_breakdown;
|
|
74
|
-
if (providers && providers.length > 0) {
|
|
75
|
-
text += `\n By provider:\n`;
|
|
76
|
-
for (const p of providers) {
|
|
77
|
-
text += ` ${p.provider_class}: ${p.agent_count} agents\n`;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
// Cross-provider anomaly data
|
|
81
|
-
const crossProvider = skill.cross_provider_anomalies;
|
|
82
|
-
if (crossProvider && crossProvider.length > 0) {
|
|
83
|
-
text += `\n Anomalies by provider (last 7d):\n`;
|
|
84
|
-
for (const cp of crossProvider) {
|
|
85
|
-
text += ` ${cp.provider}: ${cp.anomaly_count} anomalies\n`;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
if (crossProvider && crossProvider.length >= 2) {
|
|
89
|
-
text += `\n ${crossProvider.length} providers reporting anomalies\n`;
|
|
90
|
-
}
|
|
91
|
-
return text;
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=get-skill-tracker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-skill-tracker.js","sourceRoot":"","sources":["../../../src/tools/get-skill-tracker.ts"],"names":[],"mappings":"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"}
|