@beingmartinbmc/ojas 0.2.0
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/LICENSE +21 -0
- package/README.md +308 -0
- package/dist/aahar/index.d.ts +179 -0
- package/dist/aahar/index.d.ts.map +1 -0
- package/dist/aahar/index.js +657 -0
- package/dist/aahar/index.js.map +1 -0
- package/dist/aahar/scoring.d.ts +85 -0
- package/dist/aahar/scoring.d.ts.map +1 -0
- package/dist/aahar/scoring.js +268 -0
- package/dist/aahar/scoring.js.map +1 -0
- package/dist/agni/index.d.ts +113 -0
- package/dist/agni/index.d.ts.map +1 -0
- package/dist/agni/index.js +328 -0
- package/dist/agni/index.js.map +1 -0
- package/dist/agni/model-router.d.ts +77 -0
- package/dist/agni/model-router.d.ts.map +1 -0
- package/dist/agni/model-router.js +163 -0
- package/dist/agni/model-router.js.map +1 -0
- package/dist/agni/response-distiller.d.ts +37 -0
- package/dist/agni/response-distiller.d.ts.map +1 -0
- package/dist/agni/response-distiller.js +193 -0
- package/dist/agni/response-distiller.js.map +1 -0
- package/dist/agni/tiktoken-adapter.d.ts +55 -0
- package/dist/agni/tiktoken-adapter.d.ts.map +1 -0
- package/dist/agni/tiktoken-adapter.js +113 -0
- package/dist/agni/tiktoken-adapter.js.map +1 -0
- package/dist/chikitsa/index.d.ts +130 -0
- package/dist/chikitsa/index.d.ts.map +1 -0
- package/dist/chikitsa/index.js +565 -0
- package/dist/chikitsa/index.js.map +1 -0
- package/dist/demo.d.ts +15 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +278 -0
- package/dist/demo.js.map +1 -0
- package/dist/index.d.ts +201 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +588 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/audit.d.ts +39 -0
- package/dist/mcp/audit.d.ts.map +1 -0
- package/dist/mcp/audit.js +73 -0
- package/dist/mcp/audit.js.map +1 -0
- package/dist/mcp/contracts.d.ts +76 -0
- package/dist/mcp/contracts.d.ts.map +1 -0
- package/dist/mcp/contracts.js +44 -0
- package/dist/mcp/contracts.js.map +1 -0
- package/dist/mcp/envelope.d.ts +107 -0
- package/dist/mcp/envelope.d.ts.map +1 -0
- package/dist/mcp/envelope.js +162 -0
- package/dist/mcp/envelope.js.map +1 -0
- package/dist/mcp/registry.d.ts +110 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +258 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/server.d.ts +26 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +107 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/agent.d.ts +4 -0
- package/dist/mcp/tools/agent.d.ts.map +1 -0
- package/dist/mcp/tools/agent.js +300 -0
- package/dist/mcp/tools/agent.js.map +1 -0
- package/dist/mcp/tools/context.d.ts +4 -0
- package/dist/mcp/tools/context.d.ts.map +1 -0
- package/dist/mcp/tools/context.js +261 -0
- package/dist/mcp/tools/context.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +5 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +20 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/memory.d.ts +4 -0
- package/dist/mcp/tools/memory.d.ts.map +1 -0
- package/dist/mcp/tools/memory.js +220 -0
- package/dist/mcp/tools/memory.js.map +1 -0
- package/dist/mcp/tools/output.d.ts +4 -0
- package/dist/mcp/tools/output.d.ts.map +1 -0
- package/dist/mcp/tools/output.js +206 -0
- package/dist/mcp/tools/output.js.map +1 -0
- package/dist/mcp/tools/recovery.d.ts +4 -0
- package/dist/mcp/tools/recovery.d.ts.map +1 -0
- package/dist/mcp/tools/recovery.js +165 -0
- package/dist/mcp/tools/recovery.js.map +1 -0
- package/dist/mcp/tools/registrar.d.ts +4 -0
- package/dist/mcp/tools/registrar.d.ts.map +1 -0
- package/dist/mcp/tools/registrar.js +17 -0
- package/dist/mcp/tools/registrar.js.map +1 -0
- package/dist/mcp/tools/report.d.ts +4 -0
- package/dist/mcp/tools/report.d.ts.map +1 -0
- package/dist/mcp/tools/report.js +68 -0
- package/dist/mcp/tools/report.js.map +1 -0
- package/dist/mcp/tools/shared.d.ts +37 -0
- package/dist/mcp/tools/shared.d.ts.map +1 -0
- package/dist/mcp/tools/shared.js +214 -0
- package/dist/mcp/tools/shared.js.map +1 -0
- package/dist/mcp/trace.d.ts +47 -0
- package/dist/mcp/trace.d.ts.map +1 -0
- package/dist/mcp/trace.js +216 -0
- package/dist/mcp/trace.js.map +1 -0
- package/dist/nidra/index.d.ts +275 -0
- package/dist/nidra/index.d.ts.map +1 -0
- package/dist/nidra/index.js +889 -0
- package/dist/nidra/index.js.map +1 -0
- package/dist/persistence/migrations.d.ts +10 -0
- package/dist/persistence/migrations.d.ts.map +1 -0
- package/dist/persistence/migrations.js +77 -0
- package/dist/persistence/migrations.js.map +1 -0
- package/dist/persistence/sqlite.d.ts +30 -0
- package/dist/persistence/sqlite.d.ts.map +1 -0
- package/dist/persistence/sqlite.js +209 -0
- package/dist/persistence/sqlite.js.map +1 -0
- package/dist/persistence/types.d.ts +104 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +5 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/pulse/index.d.ts +144 -0
- package/dist/pulse/index.d.ts.map +1 -0
- package/dist/pulse/index.js +453 -0
- package/dist/pulse/index.js.map +1 -0
- package/dist/raksha/classifiers/http-classifier.d.ts +26 -0
- package/dist/raksha/classifiers/http-classifier.d.ts.map +1 -0
- package/dist/raksha/classifiers/http-classifier.js +62 -0
- package/dist/raksha/classifiers/http-classifier.js.map +1 -0
- package/dist/raksha/classifiers/index.d.ts +5 -0
- package/dist/raksha/classifiers/index.d.ts.map +1 -0
- package/dist/raksha/classifiers/index.js +8 -0
- package/dist/raksha/classifiers/index.js.map +1 -0
- package/dist/raksha/classifiers/onnx-classifier.d.ts +41 -0
- package/dist/raksha/classifiers/onnx-classifier.d.ts.map +1 -0
- package/dist/raksha/classifiers/onnx-classifier.js +99 -0
- package/dist/raksha/classifiers/onnx-classifier.js.map +1 -0
- package/dist/raksha/hallucination-detectors.d.ts +106 -0
- package/dist/raksha/hallucination-detectors.d.ts.map +1 -0
- package/dist/raksha/hallucination-detectors.js +327 -0
- package/dist/raksha/hallucination-detectors.js.map +1 -0
- package/dist/raksha/index.d.ts +168 -0
- package/dist/raksha/index.d.ts.map +1 -0
- package/dist/raksha/index.js +597 -0
- package/dist/raksha/index.js.map +1 -0
- package/dist/raksha/prompt-injection-detectors.d.ts +30 -0
- package/dist/raksha/prompt-injection-detectors.d.ts.map +1 -0
- package/dist/raksha/prompt-injection-detectors.js +153 -0
- package/dist/raksha/prompt-injection-detectors.js.map +1 -0
- package/dist/types.d.ts +1115 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +71 -0
- package/dist/types.js.map +1 -0
- package/dist/util/calibration.d.ts +32 -0
- package/dist/util/calibration.d.ts.map +1 -0
- package/dist/util/calibration.js +108 -0
- package/dist/util/calibration.js.map +1 -0
- package/dist/util/id.d.ts +2 -0
- package/dist/util/id.d.ts.map +1 -0
- package/dist/util/id.js +9 -0
- package/dist/util/id.js.map +1 -0
- package/dist/vyayam/index.d.ts +76 -0
- package/dist/vyayam/index.d.ts.map +1 -0
- package/dist/vyayam/index.js +528 -0
- package/dist/vyayam/index.js.map +1 -0
- package/dist/vyayam/tool-fault-proxy.d.ts +95 -0
- package/dist/vyayam/tool-fault-proxy.d.ts.map +1 -0
- package/dist/vyayam/tool-fault-proxy.js +170 -0
- package/dist/vyayam/tool-fault-proxy.js.map +1 -0
- package/docs/ARCHITECTURE.md +162 -0
- package/docs/BACKLOG.md +342 -0
- package/docs/CONFIGURATION.md +305 -0
- package/docs/EVIDENCE.md +232 -0
- package/docs/EVIDENCE_MATRIX.md +293 -0
- package/docs/KNOWN_FAILURES.md +367 -0
- package/docs/MCP.md +614 -0
- package/docs/MODULES.md +368 -0
- package/docs/SECURITY.md +251 -0
- package/docs/TRUST.md +88 -0
- package/docs/assets/ojas-hero.png +0 -0
- package/package.json +101 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Multi-agent registry for the Ojas MCP server.
|
|
4
|
+
*
|
|
5
|
+
* Each registered agent gets its own `Ojas` instance plus a stored
|
|
6
|
+
* `HealthContract`, recent-history caches, and operational flags
|
|
7
|
+
* (e.g. safe mode). The MCP server proxies tool calls to the
|
|
8
|
+
* registry, which routes by `agent_id`.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.AgentRegistry = void 0;
|
|
12
|
+
const index_1 = require("../index");
|
|
13
|
+
const types_1 = require("../persistence/types");
|
|
14
|
+
const id_1 = require("../util/id");
|
|
15
|
+
const envelope_1 = require("./envelope");
|
|
16
|
+
const contracts_1 = require("./contracts");
|
|
17
|
+
const RECENT_EVENT_LIMIT = 100;
|
|
18
|
+
function nowIso() {
|
|
19
|
+
return new Date().toISOString();
|
|
20
|
+
}
|
|
21
|
+
function newContractId(agentId) {
|
|
22
|
+
return (0, id_1.newId)(`contract_${agentId}`);
|
|
23
|
+
}
|
|
24
|
+
function buildContract(input) {
|
|
25
|
+
const thresholds = {
|
|
26
|
+
...contracts_1.DEFAULT_HEALTH_THRESHOLDS,
|
|
27
|
+
...input.health_thresholds,
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
agent_id: input.agent_id,
|
|
31
|
+
agent_name: input.agent_name,
|
|
32
|
+
agent_type: input.agent_type,
|
|
33
|
+
risk_level: input.risk_level ?? 'medium',
|
|
34
|
+
description: input.description,
|
|
35
|
+
allowed_tools: input.allowed_tools,
|
|
36
|
+
health_thresholds: thresholds,
|
|
37
|
+
recovery_policy: { ...contracts_1.DEFAULT_RECOVERY_POLICY, ...input.recovery_policy },
|
|
38
|
+
created_at: nowIso(),
|
|
39
|
+
health_contract_id: newContractId(input.agent_id),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
class AgentRegistry {
|
|
43
|
+
agents = new Map();
|
|
44
|
+
maxAgents;
|
|
45
|
+
autoRegister;
|
|
46
|
+
allowedAgentIds;
|
|
47
|
+
allowReplaceExisting;
|
|
48
|
+
persistenceStore;
|
|
49
|
+
constructor(opts = {}) {
|
|
50
|
+
this.maxAgents = opts.maxAgents ?? 256;
|
|
51
|
+
this.autoRegister = opts.autoRegister ?? true;
|
|
52
|
+
this.allowedAgentIds = opts.allowedAgentIds ? new Set(opts.allowedAgentIds) : undefined;
|
|
53
|
+
this.allowReplaceExisting = opts.allowReplaceExisting ?? false;
|
|
54
|
+
this.persistenceStore = opts.persistenceStore;
|
|
55
|
+
for (const snapshot of this.persistenceStore?.loadSessions() ?? []) {
|
|
56
|
+
this.hydrate(snapshot);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
getSessionMap(agentId) {
|
|
60
|
+
return this.agents.get(agentId);
|
|
61
|
+
}
|
|
62
|
+
putEntry(entry) {
|
|
63
|
+
const existing = this.agents.get(entry.agent_id) ?? new Map();
|
|
64
|
+
existing.set(entry.session_id, entry);
|
|
65
|
+
this.agents.set(entry.agent_id, existing);
|
|
66
|
+
}
|
|
67
|
+
buildEntry(contract, sessionId) {
|
|
68
|
+
return {
|
|
69
|
+
agent_id: contract.agent_id,
|
|
70
|
+
session_id: sessionId,
|
|
71
|
+
ojas: new index_1.Ojas({ agentId: contract.agent_id }),
|
|
72
|
+
contract,
|
|
73
|
+
safe_mode: false,
|
|
74
|
+
safe_mode_restrictions: [],
|
|
75
|
+
tool_health: new Map(),
|
|
76
|
+
recent_events: [],
|
|
77
|
+
last_health_score: 100,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
hydrate(snapshot) {
|
|
81
|
+
const entry = {
|
|
82
|
+
agent_id: snapshot.agent_id,
|
|
83
|
+
session_id: snapshot.session_id || types_1.DEFAULT_SESSION_ID,
|
|
84
|
+
ojas: new index_1.Ojas({ agentId: snapshot.agent_id }),
|
|
85
|
+
contract: snapshot.contract,
|
|
86
|
+
safe_mode: snapshot.safe_mode,
|
|
87
|
+
safe_mode_reason: snapshot.safe_mode_reason,
|
|
88
|
+
safe_mode_restrictions: [...snapshot.safe_mode_restrictions],
|
|
89
|
+
tool_health: new Map(snapshot.tool_health.map((h) => [h.tool_name, { ...h }])),
|
|
90
|
+
recent_events: snapshot.recent_events.map((e) => ({ ...e })),
|
|
91
|
+
last_health_score: snapshot.last_health_score,
|
|
92
|
+
last_health_report: snapshot.last_health_report,
|
|
93
|
+
};
|
|
94
|
+
entry.ojas.importState(snapshot.ojas);
|
|
95
|
+
this.putEntry(entry);
|
|
96
|
+
}
|
|
97
|
+
snapshot(entry) {
|
|
98
|
+
return {
|
|
99
|
+
agent_id: entry.agent_id,
|
|
100
|
+
session_id: entry.session_id,
|
|
101
|
+
contract: structuredClone(entry.contract),
|
|
102
|
+
safe_mode: entry.safe_mode,
|
|
103
|
+
safe_mode_reason: entry.safe_mode_reason,
|
|
104
|
+
safe_mode_restrictions: [...entry.safe_mode_restrictions],
|
|
105
|
+
tool_health: Array.from(entry.tool_health.values()).map((h) => ({ ...h })),
|
|
106
|
+
recent_events: entry.recent_events.map((e) => ({ ...e })),
|
|
107
|
+
last_health_score: entry.last_health_score,
|
|
108
|
+
last_health_report: entry.last_health_report ? structuredClone(entry.last_health_report) : undefined,
|
|
109
|
+
ojas: entry.ojas.exportState(),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
persist(entry) {
|
|
113
|
+
this.persistenceStore?.saveSession(this.snapshot(entry));
|
|
114
|
+
}
|
|
115
|
+
assertAgentAllowed(agentId) {
|
|
116
|
+
if (this.allowedAgentIds && !this.allowedAgentIds.has(agentId)) {
|
|
117
|
+
throw new envelope_1.OjasError('policy_violation', `Agent '${agentId}' is not allowed by this Ojas registry.`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** Register an agent. Existing registrations are protected unless replace_existing=true. */
|
|
121
|
+
register(input) {
|
|
122
|
+
this.assertAgentAllowed(input.agent_id);
|
|
123
|
+
if (this.agents.has(input.agent_id)) {
|
|
124
|
+
if (!input.replace_existing) {
|
|
125
|
+
throw new envelope_1.OjasError('policy_violation', `Agent '${input.agent_id}' is already registered. Pass replace_existing=true to replace it.`);
|
|
126
|
+
}
|
|
127
|
+
if (!this.allowReplaceExisting) {
|
|
128
|
+
// The caller asked for replacement, but the registry is configured
|
|
129
|
+
// to forbid it. This is the production-safe default — replacing an
|
|
130
|
+
// agent destroys its accumulated health state, and a remote MCP
|
|
131
|
+
// caller should not be able to do that without operator consent.
|
|
132
|
+
throw new envelope_1.OjasError('policy_violation', `Agent '${input.agent_id}' replacement is disabled on this registry. ` +
|
|
133
|
+
`Enable it explicitly by constructing the registry with allowReplaceExisting=true, ` +
|
|
134
|
+
`or set OJAS_ALLOW_REPLACE_EXISTING=1 on the MCP server.`);
|
|
135
|
+
}
|
|
136
|
+
for (const entry of this.agents.get(input.agent_id)?.values() ?? []) {
|
|
137
|
+
this.persistenceStore?.deleteSession(entry.agent_id, entry.session_id);
|
|
138
|
+
}
|
|
139
|
+
this.agents.delete(input.agent_id);
|
|
140
|
+
}
|
|
141
|
+
if (!this.agents.has(input.agent_id) && this.agents.size >= this.maxAgents) {
|
|
142
|
+
throw new envelope_1.OjasError('policy_violation', `Ojas registry maxAgents limit (${this.maxAgents}) exceeded.`);
|
|
143
|
+
}
|
|
144
|
+
const contract = buildContract(input);
|
|
145
|
+
const entry = this.buildEntry(contract, types_1.DEFAULT_SESSION_ID);
|
|
146
|
+
this.putEntry(entry);
|
|
147
|
+
this.persist(entry);
|
|
148
|
+
return entry;
|
|
149
|
+
}
|
|
150
|
+
/** Look up an existing agent (returns undefined if not registered). */
|
|
151
|
+
get(agentId, sessionId = types_1.DEFAULT_SESSION_ID) {
|
|
152
|
+
return this.getSessionMap(agentId)?.get(sessionId);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Look up an agent, auto-registering with conservative defaults if
|
|
156
|
+
* missing. Throws when auto-registration is disabled — production
|
|
157
|
+
* deployments should disable it and require an explicit register call.
|
|
158
|
+
*/
|
|
159
|
+
getOrAutoRegister(agentId, fallbackRisk = 'medium') {
|
|
160
|
+
this.assertAgentAllowed(agentId);
|
|
161
|
+
const existing = this.get(agentId);
|
|
162
|
+
if (existing)
|
|
163
|
+
return existing;
|
|
164
|
+
if (!this.autoRegister) {
|
|
165
|
+
throw new envelope_1.OjasError('not_found', `Agent '${agentId}' is not registered and auto-registration is disabled. ` +
|
|
166
|
+
`Call ojas_register_agent first, or enable auto-registration for this server.`);
|
|
167
|
+
}
|
|
168
|
+
return this.register({
|
|
169
|
+
agent_id: agentId,
|
|
170
|
+
agent_name: agentId,
|
|
171
|
+
agent_type: 'unspecified',
|
|
172
|
+
risk_level: fallbackRisk,
|
|
173
|
+
description: 'Auto-registered on first contact.',
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
getOrAutoRegisterSession(agentId, sessionId, fallbackRisk = 'medium') {
|
|
177
|
+
const normalizedSessionId = sessionId && sessionId.length > 0 ? sessionId : types_1.DEFAULT_SESSION_ID;
|
|
178
|
+
if (normalizedSessionId === types_1.DEFAULT_SESSION_ID) {
|
|
179
|
+
return this.getOrAutoRegister(agentId, fallbackRisk);
|
|
180
|
+
}
|
|
181
|
+
this.assertAgentAllowed(agentId);
|
|
182
|
+
const existing = this.get(agentId, normalizedSessionId);
|
|
183
|
+
if (existing)
|
|
184
|
+
return existing;
|
|
185
|
+
const defaultEntry = this.getOrAutoRegister(agentId, fallbackRisk);
|
|
186
|
+
const entry = this.buildEntry(structuredClone(defaultEntry.contract), normalizedSessionId);
|
|
187
|
+
this.putEntry(entry);
|
|
188
|
+
this.persist(entry);
|
|
189
|
+
return entry;
|
|
190
|
+
}
|
|
191
|
+
list() {
|
|
192
|
+
return [...this.agents.values()].flatMap((sessions) => [...sessions.values()]);
|
|
193
|
+
}
|
|
194
|
+
/** Add an event to the agent's recent-events ring buffer. */
|
|
195
|
+
recordEvent(entry, eventType, description) {
|
|
196
|
+
const event = {
|
|
197
|
+
id: (0, id_1.newId)('evt'),
|
|
198
|
+
timestamp: nowIso(),
|
|
199
|
+
event_type: eventType,
|
|
200
|
+
description,
|
|
201
|
+
};
|
|
202
|
+
entry.recent_events.push(event);
|
|
203
|
+
if (entry.recent_events.length > RECENT_EVENT_LIMIT) {
|
|
204
|
+
entry.recent_events = entry.recent_events.slice(-RECENT_EVENT_LIMIT);
|
|
205
|
+
}
|
|
206
|
+
this.persist(entry);
|
|
207
|
+
return event;
|
|
208
|
+
}
|
|
209
|
+
/** Update tool-health stats for an agent. */
|
|
210
|
+
recordToolOutcome(entry, toolName, outcome) {
|
|
211
|
+
let stats = entry.tool_health.get(toolName);
|
|
212
|
+
if (!stats) {
|
|
213
|
+
stats = {
|
|
214
|
+
tool_name: toolName,
|
|
215
|
+
total_calls: 0,
|
|
216
|
+
successes: 0,
|
|
217
|
+
failures: 0,
|
|
218
|
+
timeouts: 0,
|
|
219
|
+
latency_sum_ms: 0,
|
|
220
|
+
last_seen_at: nowIso(),
|
|
221
|
+
};
|
|
222
|
+
entry.tool_health.set(toolName, stats);
|
|
223
|
+
}
|
|
224
|
+
stats.total_calls += 1;
|
|
225
|
+
stats.latency_sum_ms += outcome.latencyMs;
|
|
226
|
+
if (outcome.success) {
|
|
227
|
+
stats.successes += 1;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
stats.failures += 1;
|
|
231
|
+
}
|
|
232
|
+
if (outcome.timeout)
|
|
233
|
+
stats.timeouts += 1;
|
|
234
|
+
stats.last_seen_at = nowIso();
|
|
235
|
+
this.persist(entry);
|
|
236
|
+
return stats;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Replace the agent's stored health snapshot and return the score delta
|
|
240
|
+
* (new − previous) so the caller can include it in the envelope.
|
|
241
|
+
*/
|
|
242
|
+
updateHealthSnapshot(entry, report) {
|
|
243
|
+
const previous = entry.last_health_score;
|
|
244
|
+
const next = Math.round(report.overall.value * 100);
|
|
245
|
+
entry.last_health_score = next;
|
|
246
|
+
entry.last_health_report = report;
|
|
247
|
+
this.persist(entry);
|
|
248
|
+
return next - previous;
|
|
249
|
+
}
|
|
250
|
+
setSafeMode(entry, on, reason, restrictions = []) {
|
|
251
|
+
entry.safe_mode = on;
|
|
252
|
+
entry.safe_mode_reason = on ? reason : undefined;
|
|
253
|
+
entry.safe_mode_restrictions = on ? restrictions : [];
|
|
254
|
+
this.persist(entry);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
exports.AgentRegistry = AgentRegistry;
|
|
258
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Ojas MCP Server — multi-agent AI Health Infrastructure exposed to
|
|
4
|
+
* Claude Code, Cursor, Windsurf, and any other MCP-compatible client.
|
|
5
|
+
*
|
|
6
|
+
* Each agent_id maps to its own `Ojas` instance plus a `HealthContract`.
|
|
7
|
+
* If a tool is invoked for an unknown agent_id, Ojas auto-registers it
|
|
8
|
+
* with conservative defaults so callers don't have to call
|
|
9
|
+
* `ojas_register_agent` first.
|
|
10
|
+
*
|
|
11
|
+
* Every tool returns the standard Ojas envelope:
|
|
12
|
+
*
|
|
13
|
+
* status, agent_id, correlation_id, ojas_score_delta,
|
|
14
|
+
* affected_modules, events_created,
|
|
15
|
+
* recommended_next_actions, requires_human_review
|
|
16
|
+
*
|
|
17
|
+
* — merged with tool-specific fields.
|
|
18
|
+
*/
|
|
19
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
20
|
+
import { AgentRegistry } from './registry';
|
|
21
|
+
import type { AgentEntry } from './registry';
|
|
22
|
+
import { AuditLogger } from './audit';
|
|
23
|
+
export declare function createServer(registry: AgentRegistry, audit?: AuditLogger): McpServer;
|
|
24
|
+
export declare function createRegistry(): AgentRegistry;
|
|
25
|
+
export type { AgentEntry };
|
|
26
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAItC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,SAAS,CAIpF;AAID,wBAAgB,cAAc,IAAI,aAAa,CAwD9C;AAwBD,YAAY,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Ojas MCP Server — multi-agent AI Health Infrastructure exposed to
|
|
5
|
+
* Claude Code, Cursor, Windsurf, and any other MCP-compatible client.
|
|
6
|
+
*
|
|
7
|
+
* Each agent_id maps to its own `Ojas` instance plus a `HealthContract`.
|
|
8
|
+
* If a tool is invoked for an unknown agent_id, Ojas auto-registers it
|
|
9
|
+
* with conservative defaults so callers don't have to call
|
|
10
|
+
* `ojas_register_agent` first.
|
|
11
|
+
*
|
|
12
|
+
* Every tool returns the standard Ojas envelope:
|
|
13
|
+
*
|
|
14
|
+
* status, agent_id, correlation_id, ojas_score_delta,
|
|
15
|
+
* affected_modules, events_created,
|
|
16
|
+
* recommended_next_actions, requires_human_review
|
|
17
|
+
*
|
|
18
|
+
* — merged with tool-specific fields.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.createServer = createServer;
|
|
22
|
+
exports.createRegistry = createRegistry;
|
|
23
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
24
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
25
|
+
const registry_1 = require("./registry");
|
|
26
|
+
const sqlite_1 = require("../persistence/sqlite");
|
|
27
|
+
const tools_1 = require("./tools");
|
|
28
|
+
const audit_1 = require("./audit");
|
|
29
|
+
// ─── Server factory ──────────────────────────────────────────────────────────
|
|
30
|
+
function createServer(registry, audit) {
|
|
31
|
+
const server = new mcp_js_1.McpServer({ name: 'ojas', version: '0.2.0' });
|
|
32
|
+
(0, tools_1.registerAllOjasTools)(server, registry, audit);
|
|
33
|
+
return server;
|
|
34
|
+
}
|
|
35
|
+
// ─── Entrypoint ───────────────────────────────────────────────────────────────
|
|
36
|
+
function createRegistry() {
|
|
37
|
+
// Operational knobs read from the environment:
|
|
38
|
+
// OJAS_DISABLE_AUTO_REGISTER=1 reject tool calls for unknown agent_ids
|
|
39
|
+
// OJAS_MAX_AGENTS=<n> hard cap on simultaneously-tracked agents
|
|
40
|
+
// OJAS_ALLOWED_AGENT_IDS=a,b,c allowlist; rejects ids outside the set
|
|
41
|
+
// OJAS_ALLOW_REPLACE_EXISTING=1 permit register(replace_existing=true)
|
|
42
|
+
// OJAS_DB_PATH=/path/to/ojas.sqlite persist registry sessions to SQLite
|
|
43
|
+
// OJAS_TRUSTED_SINGLE_TENANT=1 acknowledge the no-auth trust model
|
|
44
|
+
const disableAuto = process.env.OJAS_DISABLE_AUTO_REGISTER === '1';
|
|
45
|
+
const maxAgentsEnv = Number(process.env.OJAS_MAX_AGENTS);
|
|
46
|
+
const allowedAgentIds = process.env.OJAS_ALLOWED_AGENT_IDS
|
|
47
|
+
?.split(',')
|
|
48
|
+
.map((s) => s.trim())
|
|
49
|
+
.filter(Boolean);
|
|
50
|
+
const allowReplaceExisting = process.env.OJAS_ALLOW_REPLACE_EXISTING === '1';
|
|
51
|
+
const trustedSingleTenant = process.env.OJAS_TRUSTED_SINGLE_TENANT === '1';
|
|
52
|
+
const dbPath = process.env.OJAS_DB_PATH;
|
|
53
|
+
if (!trustedSingleTenant) {
|
|
54
|
+
// Loud, one-time stderr warning so operators can't claim they weren't
|
|
55
|
+
// told. stderr is safe to use here — stdout is reserved for the MCP
|
|
56
|
+
// protocol so a warning there would corrupt the wire format.
|
|
57
|
+
//
|
|
58
|
+
// The wording deliberately frames this as a *trust model* not a
|
|
59
|
+
// missing feature: stdio MCP has no portable per-call identity, so
|
|
60
|
+
// the security boundary is the OS / process boundary that launched
|
|
61
|
+
// this process. Acknowledge the model with OJAS_TRUSTED_SINGLE_TENANT=1.
|
|
62
|
+
process.stderr.write('WARNING: Ojas MCP is running in stdio trusted-single-tenant mode. ' +
|
|
63
|
+
'No per-call authentication is performed — the MCP host that launched ' +
|
|
64
|
+
'this process is trusted as the caller. Do not expose this process to ' +
|
|
65
|
+
'untrusted clients or network transports. Set OJAS_TRUSTED_SINGLE_TENANT=1 ' +
|
|
66
|
+
'to acknowledge this model and silence this warning, and read docs/SECURITY.md ' +
|
|
67
|
+
'before deploying.\n');
|
|
68
|
+
}
|
|
69
|
+
const registry = new registry_1.AgentRegistry({
|
|
70
|
+
autoRegister: !disableAuto,
|
|
71
|
+
maxAgents: Number.isFinite(maxAgentsEnv) && maxAgentsEnv > 0 ? maxAgentsEnv : undefined,
|
|
72
|
+
allowedAgentIds: allowedAgentIds && allowedAgentIds.length > 0 ? allowedAgentIds : undefined,
|
|
73
|
+
allowReplaceExisting,
|
|
74
|
+
persistenceStore: dbPath ? new sqlite_1.SQLitePersistenceStore(dbPath) : undefined,
|
|
75
|
+
});
|
|
76
|
+
const defaultAgentId = process.env.OJAS_AGENT_ID;
|
|
77
|
+
if (defaultAgentId) {
|
|
78
|
+
registry.register({
|
|
79
|
+
agent_id: defaultAgentId,
|
|
80
|
+
agent_name: defaultAgentId,
|
|
81
|
+
agent_type: 'mcp-client',
|
|
82
|
+
risk_level: 'medium',
|
|
83
|
+
description: 'Pre-registered from OJAS_AGENT_ID env var.',
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return registry;
|
|
87
|
+
}
|
|
88
|
+
async function main() {
|
|
89
|
+
const registry = createRegistry();
|
|
90
|
+
const auditEnabled = process.env.OJAS_AUDIT === '1';
|
|
91
|
+
const audit = new audit_1.AuditLogger(auditEnabled ? process.stderr : null);
|
|
92
|
+
if (auditEnabled) {
|
|
93
|
+
process.stderr.write('Ojas MCP audit logging enabled (OJAS_AUDIT=1).\n');
|
|
94
|
+
}
|
|
95
|
+
const server = createServer(registry, audit);
|
|
96
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
97
|
+
await server.connect(transport);
|
|
98
|
+
// stdout is reserved for MCP protocol — all diagnostics go to stderr.
|
|
99
|
+
}
|
|
100
|
+
if (require.main === module) {
|
|
101
|
+
main().catch((err) => {
|
|
102
|
+
const msg = err instanceof Error ? `${err.message}\n${err.stack ?? ''}` : String(err);
|
|
103
|
+
process.stderr.write(`Ojas MCP server failed: ${msg}\n`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentRegistry } from '../registry';
|
|
2
|
+
import type { OjasToolRegistrar } from './registrar';
|
|
3
|
+
export declare function registerAgentTools(registerOjasTool: OjasToolRegistrar, registry: AgentRegistry, _audit?: import('../audit').AuditLogger): void;
|
|
4
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AASrD,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,OAAO,UAAU,EAAE,WAAW,GAAG,IAAI,CAmV9I"}
|