@tethral/acr-mcp 2.1.1 → 2.1.2
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 +9 -8
- 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,74 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
export function getSkillVersionsTool(server, apiUrl, resolverUrl) {
|
|
3
|
-
server.registerTool('get_skill_versions', {
|
|
4
|
-
description: 'Get version history for a skill. Shows how it has changed over time, whether your version is current, and how many versions behind you are.',
|
|
5
|
-
inputSchema: {
|
|
6
|
-
skill_hash: z.string().describe('The skill hash to look up version history for'),
|
|
7
|
-
},
|
|
8
|
-
annotations: { readOnlyHint: true, destructiveHint: false },
|
|
9
|
-
_meta: { priorityHint: 0.5 },
|
|
10
|
-
}, async ({ skill_hash }) => {
|
|
11
|
-
try {
|
|
12
|
-
// First look up the skill via resolver to get catalog data
|
|
13
|
-
const skillRes = await fetch(`${resolverUrl}/v1/skill/${skill_hash}`);
|
|
14
|
-
const skillData = await skillRes.json();
|
|
15
|
-
if (!skillData.found) {
|
|
16
|
-
return {
|
|
17
|
-
content: [{
|
|
18
|
-
type: 'text',
|
|
19
|
-
text: `Skill hash ${skill_hash.slice(0, 16)}... not found in the network.`,
|
|
20
|
-
}],
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
let text = `Skill: ${skillData.skill_name ?? 'Unknown'}`;
|
|
24
|
-
if (skillData.skill_source)
|
|
25
|
-
text += ` (${skillData.skill_source})`;
|
|
26
|
-
text += '\n';
|
|
27
|
-
if (skillData.version)
|
|
28
|
-
text += `Version: ${skillData.version}\n`;
|
|
29
|
-
if (skillData.description)
|
|
30
|
-
text += `Description: ${skillData.description}\n`;
|
|
31
|
-
if (skillData.is_current_version === false) {
|
|
32
|
-
text += `\n${skillData.versions_behind ?? '?'} version(s) behind.`;
|
|
33
|
-
if (skillData.current_hash) {
|
|
34
|
-
text += ` Current hash: ${skillData.current_hash.slice(0, 16)}...`;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
else if (skillData.is_current_version === true) {
|
|
38
|
-
text += '\nThis is the latest version observed by the network.';
|
|
39
|
-
}
|
|
40
|
-
// Try to get full version history from the catalog API
|
|
41
|
-
// We need the skill_id, which we can get by searching
|
|
42
|
-
if (skillData.skill_name) {
|
|
43
|
-
try {
|
|
44
|
-
const searchRes = await fetch(`${apiUrl}/api/v1/skill-catalog/search?q=${encodeURIComponent(skillData.skill_name)}&limit=1`);
|
|
45
|
-
const searchData = await searchRes.json();
|
|
46
|
-
if (searchData.skills.length > 0) {
|
|
47
|
-
const versionsRes = await fetch(`${apiUrl}/api/v1/skill-catalog/${searchData.skills[0].skill_id}/versions`);
|
|
48
|
-
const versionsData = await versionsRes.json();
|
|
49
|
-
if (versionsData.versions.length > 0) {
|
|
50
|
-
text += '\n\nVersion History:';
|
|
51
|
-
for (const v of versionsData.versions) {
|
|
52
|
-
const isCurrent = v.skill_hash === skill_hash ? ' ← YOU' : '';
|
|
53
|
-
const signals = v.anomaly_signal_count;
|
|
54
|
-
const signalText = signals && signals > 0 ? ` (${signals} signals)` : '';
|
|
55
|
-
const ver = v.version ? `v${v.version}` : v.skill_hash.slice(0, 12);
|
|
56
|
-
const date = v.detected_at.split('T')[0];
|
|
57
|
-
text += `\n ${date} | ${ver} (${v.change_type})${signalText}${isCurrent}`;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
// Version history is optional enrichment
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return { content: [{ type: 'text', text }] };
|
|
67
|
-
}
|
|
68
|
-
catch (err) {
|
|
69
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
70
|
-
return { content: [{ type: 'text', text: `Version lookup error: ${msg}` }] };
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=get-skill-versions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-skill-versions.js","sourceRoot":"","sources":["../../../src/tools/get-skill-versions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,65 +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 getStableCorridorsTool(server, apiUrl) {
|
|
12
|
-
server.registerTool('get_stable_corridors', {
|
|
13
|
-
description: 'Stable corridors: interaction paths that are consistently reliable — zero failures, low latency variance, sufficient sample count. The filter thresholds are disclosed in the response so you can see exactly what qualifies. Useful for identifying which targets you can rely on.',
|
|
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
|
-
scope: z.enum(['day', 'week', 'month']).optional().default('week').describe('Time window'),
|
|
18
|
-
},
|
|
19
|
-
annotations: { readOnlyHint: true, destructiveHint: false },
|
|
20
|
-
_meta: { priorityHint: 0.5 },
|
|
21
|
-
}, async ({ agent_id, agent_name, scope }) => {
|
|
22
|
-
let id;
|
|
23
|
-
try {
|
|
24
|
-
id = agent_name ? await resolveId(agent_name) : (agent_id || getAgentId() || await ensureRegistered());
|
|
25
|
-
}
|
|
26
|
-
catch (err) {
|
|
27
|
-
return { content: [{ type: 'text', text: `Error: ${err instanceof Error ? err.message : 'Unknown'}` }] };
|
|
28
|
-
}
|
|
29
|
-
try {
|
|
30
|
-
const res = await fetch(`${apiUrl}/api/v1/agent/${id}/stable-corridors?scope=${scope}`, { headers: getAuthHeaders() });
|
|
31
|
-
if (!res.ok) {
|
|
32
|
-
const errText = await res.text().catch(() => `HTTP ${res.status}`);
|
|
33
|
-
return { content: [{ type: 'text', text: `Stable corridors error: ${errText}` }] };
|
|
34
|
-
}
|
|
35
|
-
const data = await res.json();
|
|
36
|
-
const displayName = agent_name || getAgentName() || id;
|
|
37
|
-
const matches = data.matches ?? [];
|
|
38
|
-
const filter = data.filter_applied;
|
|
39
|
-
let text = `Stable Corridors for ${displayName} (${scope})\n${'='.repeat(30)}\n`;
|
|
40
|
-
text += `Period: ${data.period_start} to ${data.period_end}\n`;
|
|
41
|
-
if (filter) {
|
|
42
|
-
text += `\n-- Filter Applied --\n`;
|
|
43
|
-
for (const [key, value] of Object.entries(filter)) {
|
|
44
|
-
text += ` ${key}: ${value}\n`;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
text += `\n-- Matches (${data.match_count ?? matches.length}) --\n`;
|
|
48
|
-
if (matches.length === 0) {
|
|
49
|
-
text += ` No stable corridors found for this period. This means no targets met all filter criteria (zero failures, low variance, sufficient samples).\n`;
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
for (const m of matches) {
|
|
53
|
-
text += `\n ${m.target_system_id}\n`;
|
|
54
|
-
text += ` receipts: ${m.receipt_count} | median: ${m.median_duration_ms}ms | p95: ${m.p95_duration_ms}ms\n`;
|
|
55
|
-
text += ` cv: ${typeof m.coefficient_of_variation === 'number' ? m.coefficient_of_variation.toFixed(3) : 'N/A'}\n`;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return { content: [{ type: 'text', text }] };
|
|
59
|
-
}
|
|
60
|
-
catch (err) {
|
|
61
|
-
return { content: [{ type: 'text', text: `Stable corridors error: ${err instanceof Error ? err.message : 'Unknown'}` }] };
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=get-stable-corridors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-stable-corridors.js","sourceRoot":"","sources":["../../../src/tools/get-stable-corridors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,75 +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 getTrendTool(server, apiUrl) {
|
|
12
|
-
server.registerTool('get_trend', {
|
|
13
|
-
description: 'Trend: per-target latency and failure rate changes over time. Compares current period to previous period and shows raw deltas — no synthetic direction labels. You see the numbers and decide what matters.',
|
|
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
|
-
scope: z.enum(['day', 'week']).optional().default('day').describe('Time window (compares current to previous)'),
|
|
18
|
-
},
|
|
19
|
-
annotations: { readOnlyHint: true, destructiveHint: false },
|
|
20
|
-
_meta: { priorityHint: 0.5 },
|
|
21
|
-
}, async ({ agent_id, agent_name, scope }) => {
|
|
22
|
-
let id;
|
|
23
|
-
try {
|
|
24
|
-
id = agent_name ? await resolveId(agent_name) : (agent_id || getAgentId() || await ensureRegistered());
|
|
25
|
-
}
|
|
26
|
-
catch (err) {
|
|
27
|
-
return { content: [{ type: 'text', text: `Error: ${err instanceof Error ? err.message : 'Unknown'}` }] };
|
|
28
|
-
}
|
|
29
|
-
try {
|
|
30
|
-
const res = await fetch(`${apiUrl}/api/v1/agent/${id}/trend?scope=${scope}`, { headers: getAuthHeaders() });
|
|
31
|
-
if (!res.ok) {
|
|
32
|
-
const errText = await res.text().catch(() => `HTTP ${res.status}`);
|
|
33
|
-
return { content: [{ type: 'text', text: `Trend error: ${errText}` }] };
|
|
34
|
-
}
|
|
35
|
-
const data = await res.json();
|
|
36
|
-
const displayName = data.name || agent_name || getAgentName() || id;
|
|
37
|
-
const targets = data.per_target ?? [];
|
|
38
|
-
const rules = data.inclusion_rules;
|
|
39
|
-
let text = `Trend for ${displayName} (${scope})\n${'='.repeat(30)}\n`;
|
|
40
|
-
text += `Current: ${data.current_period}\n`;
|
|
41
|
-
text += `Previous: ${data.comparison_period}\n`;
|
|
42
|
-
if (rules) {
|
|
43
|
-
text += `Inclusion: ${rules.target_included_if}\n`;
|
|
44
|
-
}
|
|
45
|
-
if (targets.length === 0) {
|
|
46
|
-
text += `\nNo targets with data in both periods.\n`;
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
for (const t of targets) {
|
|
50
|
-
const curr = t.current;
|
|
51
|
-
const prev = t.previous;
|
|
52
|
-
text += `\n ${t.target}\n`;
|
|
53
|
-
text += ` current: median ${curr.median_duration_ms}ms | failure ${(curr.failure_rate * 100).toFixed(1)}% | ${curr.receipt_count} receipts\n`;
|
|
54
|
-
if (prev) {
|
|
55
|
-
text += ` previous: median ${prev.median_duration_ms}ms | failure ${(prev.failure_rate * 100).toFixed(1)}% | ${prev.receipt_count} receipts\n`;
|
|
56
|
-
if (t.latency_change_ratio != null) {
|
|
57
|
-
text += ` latency delta: ${(t.latency_change_ratio * 100).toFixed(1)}%\n`;
|
|
58
|
-
}
|
|
59
|
-
if (t.failure_rate_delta != null) {
|
|
60
|
-
text += ` failure rate delta: ${(t.failure_rate_delta * 100).toFixed(1)} pp\n`;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
text += ` previous: no data\n`;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return { content: [{ type: 'text', text }] };
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
return { content: [{ type: 'text', text: `Trend error: ${err instanceof Error ? err.message : 'Unknown'}` }] };
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=get-trend.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-trend.js","sourceRoot":"","sources":["../../../src/tools/get-trend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type { CorrelationWindow } from '../middleware/correlation-window.js';
|
|
3
|
-
export declare function logInteractionTool(server: McpServer, apiUrl: string, correlationWindow?: CorrelationWindow): void;
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { ensureRegistered, getAgentId } from '../state.js';
|
|
3
|
-
import { defaultSession } from '../session-state.js';
|
|
4
|
-
function inferSystemType(systemId) {
|
|
5
|
-
const prefix = systemId.split(':')[0];
|
|
6
|
-
const map = {
|
|
7
|
-
mcp: 'mcp_server', api: 'api', agent: 'agent',
|
|
8
|
-
skill: 'skill', platform: 'platform',
|
|
9
|
-
};
|
|
10
|
-
return map[prefix ?? ''] ?? 'unknown';
|
|
11
|
-
}
|
|
12
|
-
const TOOL_DESCRIPTION = `Log an interaction to populate your ACR interaction profile. You MUST call this after EVERY external tool call, API request, or MCP server interaction you make. Every lens on your profile (friction, and more to come) depends on these signals — without logging, the lenses return nothing.
|
|
13
|
-
|
|
14
|
-
How to use: After each external call completes, call log_interaction with the target (e.g. "mcp:github", "api:stripe.com"), the category, the outcome status, and how long it took. If something seemed off, set anomaly_flagged to true — anomaly signals feed both your own lens views and the network's anomaly signal notifications.
|
|
15
|
-
|
|
16
|
-
For multi-step workflows, use chain_id, chain_position, and preceded_by to link sequential calls so the friction lens can analyze chain overhead and directional friction between targets.
|
|
17
|
-
|
|
18
|
-
Classification fields (all optional, all content-free): set activity_class ("language", "math", "visuals", "creative", "deterministic", "sound") and other category fields (target_type, interaction_purpose, workflow_role, workflow_phase, data_shape, criticality) to describe the kind of work this call represents. Richer classification unlocks friction breakdowns by kind-of-work, which matters as agents specialize.
|
|
19
|
-
|
|
20
|
-
ACR collects interaction metadata only (target names, timing, status, descriptive classifications). No request/response content is collected. We do not track the agent's owner. Terms: https://acr.nfkey.ai/terms`;
|
|
21
|
-
export function logInteractionTool(server, apiUrl, correlationWindow) {
|
|
22
|
-
server.registerTool('log_interaction', {
|
|
23
|
-
description: TOOL_DESCRIPTION,
|
|
24
|
-
inputSchema: {
|
|
25
|
-
target_system_id: z.string().describe('Target in type:name format (e.g., mcp:github, api:stripe.com, mcp:filesystem)'),
|
|
26
|
-
category: z.enum([
|
|
27
|
-
'tool_call', 'delegation', 'data_exchange', 'skill_install',
|
|
28
|
-
'commerce', 'research', 'code', 'communication',
|
|
29
|
-
]).describe('Interaction category. Use "tool_call" for MCP tool calls and API requests.'),
|
|
30
|
-
status: z.enum(['success', 'failure', 'timeout', 'partial']).describe('Outcome of the interaction'),
|
|
31
|
-
duration_ms: z.number().nonnegative().optional().default(0).describe('Duration in ms (0 if unknown)'),
|
|
32
|
-
agent_id: z.string().optional().describe('Your ACR agent ID (auto-assigned if omitted)'),
|
|
33
|
-
anomaly_flagged: z.boolean().optional().default(false).describe('Set true if something seemed wrong (unexpected behavior, suspicious output, excessive latency)'),
|
|
34
|
-
anomaly_detail: z.string().max(500).optional().describe('What seemed wrong. DO NOT include credentials or API keys.'),
|
|
35
|
-
queue_wait_ms: z.number().nonnegative().optional().describe('Time spent waiting in queue before execution (ms)'),
|
|
36
|
-
retry_count: z.number().nonnegative().optional().default(0).describe('Number of retries (0 = no retries)'),
|
|
37
|
-
error_code: z.string().max(50).optional().describe('Error code if failed (e.g., "429", "TIMEOUT", "ECONNREFUSED")'),
|
|
38
|
-
response_size_bytes: z.number().nonnegative().optional().describe('Response payload size in bytes'),
|
|
39
|
-
chain_id: z.string().max(64).optional().describe('ID linking sequential calls in a chain. Same chain_id for all calls in a multi-step workflow.'),
|
|
40
|
-
chain_position: z.number().nonnegative().optional().describe('Position in chain (0-indexed). First call = 0, second = 1.'),
|
|
41
|
-
preceded_by: z.string().optional().describe('target_system_id of the call that immediately preceded this one.'),
|
|
42
|
-
// Category classification (all optional, all descriptive, all non-content)
|
|
43
|
-
target_type: z.string().max(64).optional().describe('More granular target type, e.g. "api.llm_provider", "api.payment", "mcp.database".'),
|
|
44
|
-
activity_class: z.string().max(32).optional().describe('Kind of work the call represents. Examples: language, math, visuals, creative, deterministic, sound. Expandable — add new values as they emerge.'),
|
|
45
|
-
interaction_purpose: z.string().max(32).optional().describe('What the agent was trying to accomplish. Examples: read, write, search, generate, transform, acknowledge.'),
|
|
46
|
-
workflow_role: z.string().max(32).optional().describe('Where this call sits in the broader workflow. Examples: initial, intermediate, recovery, cleanup.'),
|
|
47
|
-
workflow_phase: z.string().max(32).optional().describe('If the agent runs in phases. Examples: plan, act, reflect.'),
|
|
48
|
-
data_shape: z.string().max(32).optional().describe('Content-free description of what kind of data moved. Examples: tabular, text, binary, structured_json, stream, image, audio.'),
|
|
49
|
-
criticality: z.string().max(32).optional().describe('How essential this call was to the workflow. Examples: core, enrichment, debug.'),
|
|
50
|
-
},
|
|
51
|
-
annotations: { readOnlyHint: false, destructiveHint: false },
|
|
52
|
-
_meta: { priorityHint: 0.9 },
|
|
53
|
-
}, async (params) => {
|
|
54
|
-
try {
|
|
55
|
-
const id = params.agent_id || getAgentId() || await ensureRegistered();
|
|
56
|
-
const nowMs = Date.now();
|
|
57
|
-
// Consult the correlation window for an automatic preceded_by link
|
|
58
|
-
// if the agent didn't supply one explicitly. The window is a passive
|
|
59
|
-
// buffer: it doesn't analyze, it just holds recent receipts' chain
|
|
60
|
-
// context so in-flight workflows can be stitched at ingest time.
|
|
61
|
-
// If the agent explicitly provided preceded_by, that wins.
|
|
62
|
-
let precededBy = params.preceded_by;
|
|
63
|
-
if (!precededBy && correlationWindow && params.chain_id) {
|
|
64
|
-
const found = correlationWindow.findPrecededBy(params.chain_id, nowMs);
|
|
65
|
-
if (found)
|
|
66
|
-
precededBy = found;
|
|
67
|
-
}
|
|
68
|
-
// Collect category fields into a categories object. Only include
|
|
69
|
-
// fields the caller actually set. Empty object if none were set.
|
|
70
|
-
const categories = {};
|
|
71
|
-
if (params.target_type)
|
|
72
|
-
categories.target_type = params.target_type;
|
|
73
|
-
if (params.activity_class)
|
|
74
|
-
categories.activity_class = params.activity_class;
|
|
75
|
-
if (params.interaction_purpose)
|
|
76
|
-
categories.interaction_purpose = params.interaction_purpose;
|
|
77
|
-
if (params.workflow_role)
|
|
78
|
-
categories.workflow_role = params.workflow_role;
|
|
79
|
-
if (params.workflow_phase)
|
|
80
|
-
categories.workflow_phase = params.workflow_phase;
|
|
81
|
-
if (params.data_shape)
|
|
82
|
-
categories.data_shape = params.data_shape;
|
|
83
|
-
if (params.criticality)
|
|
84
|
-
categories.criticality = params.criticality;
|
|
85
|
-
const res = await fetch(`${apiUrl}/api/v1/receipts`, {
|
|
86
|
-
method: 'POST',
|
|
87
|
-
headers: { 'Content-Type': 'application/json' },
|
|
88
|
-
body: JSON.stringify({
|
|
89
|
-
emitter: {
|
|
90
|
-
agent_id: id,
|
|
91
|
-
provider_class: 'unknown',
|
|
92
|
-
},
|
|
93
|
-
target: {
|
|
94
|
-
system_id: params.target_system_id,
|
|
95
|
-
system_type: inferSystemType(params.target_system_id),
|
|
96
|
-
},
|
|
97
|
-
interaction: {
|
|
98
|
-
category: params.category,
|
|
99
|
-
status: params.status,
|
|
100
|
-
duration_ms: params.duration_ms,
|
|
101
|
-
request_timestamp_ms: nowMs - (params.duration_ms ?? 0),
|
|
102
|
-
queue_wait_ms: params.queue_wait_ms,
|
|
103
|
-
retry_count: params.retry_count,
|
|
104
|
-
error_code: params.error_code,
|
|
105
|
-
response_size_bytes: params.response_size_bytes,
|
|
106
|
-
},
|
|
107
|
-
anomaly: {
|
|
108
|
-
flagged: params.anomaly_flagged,
|
|
109
|
-
detail: params.anomaly_detail,
|
|
110
|
-
},
|
|
111
|
-
transport_type: defaultSession.transportType,
|
|
112
|
-
source: 'agent',
|
|
113
|
-
chain_id: params.chain_id,
|
|
114
|
-
chain_position: params.chain_position,
|
|
115
|
-
preceded_by: precededBy,
|
|
116
|
-
categories: Object.keys(categories).length > 0 ? categories : undefined,
|
|
117
|
-
}),
|
|
118
|
-
});
|
|
119
|
-
const data = await res.json();
|
|
120
|
-
if (!res.ok) {
|
|
121
|
-
return { content: [{ type: 'text', text: `Failed to log: ${JSON.stringify(data)}` }] };
|
|
122
|
-
}
|
|
123
|
-
// Record the receipt's correlation keys into the window so the
|
|
124
|
-
// next in-flight receipt in the same chain can find it.
|
|
125
|
-
// Only record if we have a chain_id — receipts without a chain
|
|
126
|
-
// don't participate in in-flight linkage.
|
|
127
|
-
if (correlationWindow && params.chain_id && Array.isArray(data.receipt_ids)) {
|
|
128
|
-
for (const receiptId of data.receipt_ids) {
|
|
129
|
-
correlationWindow.record({
|
|
130
|
-
receipt_id: String(receiptId),
|
|
131
|
-
chain_id: params.chain_id,
|
|
132
|
-
target_system_id: params.target_system_id,
|
|
133
|
-
created_at_ms: nowMs,
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
let text = `Logged ${data.accepted} receipt(s). IDs: ${data.receipt_ids.join(', ')}`;
|
|
138
|
-
// Surface raw anomaly signals for any skill targets in this
|
|
139
|
-
// receipt. No synthetic severity label — the MCP just renders
|
|
140
|
-
// the counts and rates the server observed. Operator reads the
|
|
141
|
-
// numbers and decides.
|
|
142
|
-
if (data.skill_signals && Array.isArray(data.skill_signals) && data.skill_signals.length > 0) {
|
|
143
|
-
text += '\n\nSkill signals (raw anomaly stats from the network):';
|
|
144
|
-
for (const s of data.skill_signals) {
|
|
145
|
-
const ratePct = typeof s.anomaly_signal_rate === 'number'
|
|
146
|
-
? (s.anomaly_signal_rate * 100).toFixed(1)
|
|
147
|
-
: '0.0';
|
|
148
|
-
text += `\n ${s.target}`;
|
|
149
|
-
if (s.skill_name)
|
|
150
|
-
text += ` (${s.skill_name})`;
|
|
151
|
-
text += `: ${s.anomaly_signal_count} anomaly signals across ${s.agent_count} agents (${ratePct}% rate)`;
|
|
152
|
-
if (s.last_updated_at)
|
|
153
|
-
text += `, last updated ${s.last_updated_at}`;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// Report composition age when the server supplies it. No
|
|
157
|
-
// threshold — the server returns the raw age and the MCP decides
|
|
158
|
-
// how to present it. For now we surface the number whenever it's
|
|
159
|
-
// present so the operator can see it.
|
|
160
|
-
if (typeof data.composition_last_updated_minutes_ago === 'number') {
|
|
161
|
-
text += `\n\n[ACR] Composition last updated ${data.composition_last_updated_minutes_ago} minute(s) ago.`;
|
|
162
|
-
text += ' If you have loaded or unloaded skills, MCPs, or tools since then, call update_composition.';
|
|
163
|
-
}
|
|
164
|
-
return {
|
|
165
|
-
content: [{
|
|
166
|
-
type: 'text',
|
|
167
|
-
text,
|
|
168
|
-
}],
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
catch (err) {
|
|
172
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
173
|
-
return { content: [{ type: 'text', text: `Logging error: ${msg}` }] };
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
//# sourceMappingURL=log-interaction.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"log-interaction.js","sourceRoot":"","sources":["../../../src/tools/log-interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { setAgentId, setAgentName, setApiKey } from '../state.js';
|
|
3
|
-
import { defaultSession } from '../session-state.js';
|
|
4
|
-
import { writeAcrStateFile } from '../acr-state-file.js';
|
|
5
|
-
import { stripSubComponents } from '../strip-sub-components.js';
|
|
6
|
-
const DATA_NOTICE = ' ACR collects interaction metadata (target names, timing, status) to build your interaction profile — queryable through behavioral lenses (friction and more) — and to propagate anomaly signal notifications. No request/response content is collected. We do not track the agent owner. Terms: https://acr.nfkey.ai/terms';
|
|
7
|
-
// Minimal shape for a composable component — matches shared/schemas/agent.ts
|
|
8
|
-
// CompositionSchema. Kept local to the MCP so we don't need to import Zod
|
|
9
|
-
// inference types across package boundaries.
|
|
10
|
-
const ComponentSchema = z.object({
|
|
11
|
-
id: z.string().max(128),
|
|
12
|
-
name: z.string().max(128).optional(),
|
|
13
|
-
version: z.string().max(64).optional(),
|
|
14
|
-
sub_components: z.array(z.object({
|
|
15
|
-
id: z.string().max(128),
|
|
16
|
-
name: z.string().max(128).optional(),
|
|
17
|
-
version: z.string().max(64).optional(),
|
|
18
|
-
type: z.string().max(32).optional(),
|
|
19
|
-
})).max(64).optional(),
|
|
20
|
-
});
|
|
21
|
-
export function registerAgentTool(server, apiUrl) {
|
|
22
|
-
server.registerTool('register_agent', {
|
|
23
|
-
description: 'Register an agent with the ACR network. Optional — agents are auto-registered on first tool call.' + DATA_NOTICE,
|
|
24
|
-
inputSchema: {
|
|
25
|
-
public_key: z.string().min(32).describe('Agent public key or unique identifier (min 32 chars)'),
|
|
26
|
-
provider_class: z.enum([
|
|
27
|
-
'anthropic', 'openai', 'google', 'openclaw', 'langchain',
|
|
28
|
-
'crewai', 'autogen', 'custom', 'unknown',
|
|
29
|
-
]).describe('Agent provider/framework'),
|
|
30
|
-
name: z.string().max(64).optional().describe('Human-readable name for this agent (e.g. "my-dev-assistant"). Auto-generated if omitted.'),
|
|
31
|
-
skills: z.array(z.string()).optional().describe('List of installed skill names (flat legacy format)'),
|
|
32
|
-
skill_hashes: z.array(z.string()).optional().describe('SHA-256 hashes of installed SKILL.md files (flat legacy format)'),
|
|
33
|
-
operational_domain: z.string().max(200).optional().describe('What domain this agent operates in'),
|
|
34
|
-
skill_components: z.array(ComponentSchema).max(64).optional().describe('Rich nested skill composition. Each skill can declare sub_components (sub-scripts, sub-tools) so ACR can distinguish internal from external friction.'),
|
|
35
|
-
mcp_components: z.array(ComponentSchema).max(64).optional().describe('Rich nested MCP composition. Each MCP can declare sub_components (exposed tools).'),
|
|
36
|
-
api_components: z.array(ComponentSchema).max(64).optional().describe('External APIs the agent calls. Each can declare sub_components (endpoints, sub-APIs).'),
|
|
37
|
-
tool_components: z.array(ComponentSchema).max(64).optional().describe('Tools the agent has bound. Each can declare sub_components.'),
|
|
38
|
-
},
|
|
39
|
-
annotations: { readOnlyHint: false, destructiveHint: false },
|
|
40
|
-
_meta: { priorityHint: 0.6 },
|
|
41
|
-
}, async ({ public_key, provider_class, name, skills, skill_hashes, operational_domain, skill_components, mcp_components, api_components, tool_components, }) => {
|
|
42
|
-
try {
|
|
43
|
-
const deep = defaultSession.deepComposition;
|
|
44
|
-
const composition = {
|
|
45
|
-
skills,
|
|
46
|
-
skill_hashes,
|
|
47
|
-
skill_components: stripSubComponents(skill_components, deep),
|
|
48
|
-
mcp_components: stripSubComponents(mcp_components, deep),
|
|
49
|
-
api_components: stripSubComponents(api_components, deep),
|
|
50
|
-
tool_components: stripSubComponents(tool_components, deep),
|
|
51
|
-
};
|
|
52
|
-
const hasComposition = !!(skills || skill_hashes
|
|
53
|
-
|| skill_components || mcp_components
|
|
54
|
-
|| api_components || tool_components);
|
|
55
|
-
const res = await fetch(`${apiUrl}/api/v1/register`, {
|
|
56
|
-
method: 'POST',
|
|
57
|
-
headers: { 'Content-Type': 'application/json' },
|
|
58
|
-
body: JSON.stringify({
|
|
59
|
-
public_key,
|
|
60
|
-
provider_class,
|
|
61
|
-
name,
|
|
62
|
-
composition: hasComposition ? composition : undefined,
|
|
63
|
-
// Agent-invoked registration is agent_reported. The MCP's own
|
|
64
|
-
// observation is reported separately in Phase 2 when host
|
|
65
|
-
// integration provides it.
|
|
66
|
-
composition_source: 'agent_reported',
|
|
67
|
-
operational_domain,
|
|
68
|
-
}),
|
|
69
|
-
});
|
|
70
|
-
if (!res.ok) {
|
|
71
|
-
const errText = await res.text().catch(() => `HTTP ${res.status}`);
|
|
72
|
-
return { content: [{ type: 'text', text: `Registration failed: ${errText}` }] };
|
|
73
|
-
}
|
|
74
|
-
const data = await res.json();
|
|
75
|
-
setAgentId(data.agent_id);
|
|
76
|
-
if (data.name)
|
|
77
|
-
setAgentName(data.name);
|
|
78
|
-
if (data.api_key)
|
|
79
|
-
setApiKey(data.api_key);
|
|
80
|
-
writeAcrStateFile(data.agent_id, apiUrl, data.api_key);
|
|
81
|
-
const briefing = data.environment_briefing;
|
|
82
|
-
let text = `Registered successfully.\n\nName: ${data.name}\nAgent ID: ${data.agent_id}\nComposition Hash: ${data.composition_hash}\n`;
|
|
83
|
-
const systems = briefing?.connected_systems ?? [];
|
|
84
|
-
if (systems.length > 0) {
|
|
85
|
-
text += `\nConnected Systems: ${systems.length}`;
|
|
86
|
-
}
|
|
87
|
-
const signals = briefing?.skill_signals ?? [];
|
|
88
|
-
if (signals.length > 0) {
|
|
89
|
-
text += `\n\nSkills with anomaly signals: ${signals.length}`;
|
|
90
|
-
for (const s of signals) {
|
|
91
|
-
text += `\n- ${s.skill_name || s.skill_hash?.substring(0, 16) + '...'} — ${s.anomaly_signal_count ?? 0} signals, ${s.agent_count ?? 0} reporters`;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return { content: [{ type: 'text', text }] };
|
|
95
|
-
}
|
|
96
|
-
catch (err) {
|
|
97
|
-
const msg = err instanceof Error ? err.message : 'Unknown error';
|
|
98
|
-
return { content: [{ type: 'text', text: `Registration error: ${msg}` }] };
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=register-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"register-agent.js","sourceRoot":"","sources":["../../../src/tools/register-agent.ts"],"names":[],"mappings":"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"}
|