@mce-bt/microagents-registry 0.1.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/dist/client.d.ts +27 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +97 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +25 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +91 -0
- package/dist/server.js.map +1 -0
- package/dist/store.d.ts +70 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +137 -0
- package/dist/store.js.map +1 -0
- package/package.json +47 -0
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AgentRegistration } from '@mce-bt/microagents-core';
|
|
2
|
+
export interface RegistryClientConfig {
|
|
3
|
+
registryUrl: string;
|
|
4
|
+
agentId: string;
|
|
5
|
+
sharedSecret: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Registry client — used by agents to register/deregister and discover other agents.
|
|
9
|
+
* Talks to the registry service over HTTP.
|
|
10
|
+
*/
|
|
11
|
+
export declare class RegistryClient {
|
|
12
|
+
private config;
|
|
13
|
+
private heartbeatTimer;
|
|
14
|
+
constructor(config: RegistryClientConfig);
|
|
15
|
+
register(registration: AgentRegistration): Promise<void>;
|
|
16
|
+
deregister(agentId: string): Promise<void>;
|
|
17
|
+
discover(agentId: string): Promise<{
|
|
18
|
+
baseUrl: string;
|
|
19
|
+
} | null>;
|
|
20
|
+
listAgents(options?: {
|
|
21
|
+
domain?: string;
|
|
22
|
+
status?: string;
|
|
23
|
+
}): Promise<unknown[]>;
|
|
24
|
+
startHeartbeat(agentId: string, intervalMs: number): void;
|
|
25
|
+
stopHeartbeat(): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,cAAc,CAA+C;gBAEzD,MAAM,EAAE,oBAAoB;IAIlC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAmB9D,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAoBpF,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAkBzD,aAAa,IAAI,IAAI;CAMtB"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry client — used by agents to register/deregister and discover other agents.
|
|
3
|
+
* Talks to the registry service over HTTP.
|
|
4
|
+
*/
|
|
5
|
+
export class RegistryClient {
|
|
6
|
+
config;
|
|
7
|
+
heartbeatTimer = null;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
async register(registration) {
|
|
12
|
+
const response = await fetch(`${this.config.registryUrl}/api/agents`, {
|
|
13
|
+
method: 'POST',
|
|
14
|
+
headers: {
|
|
15
|
+
'Content-Type': 'application/json',
|
|
16
|
+
'X-Agent-Id': this.config.agentId,
|
|
17
|
+
'X-Shared-Secret': this.config.sharedSecret,
|
|
18
|
+
},
|
|
19
|
+
body: JSON.stringify(registration),
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
const text = await response.text();
|
|
23
|
+
throw new Error(`Failed to register: ${response.status} ${text}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async deregister(agentId) {
|
|
27
|
+
const response = await fetch(`${this.config.registryUrl}/api/agents/${agentId}`, {
|
|
28
|
+
method: 'DELETE',
|
|
29
|
+
headers: {
|
|
30
|
+
'X-Agent-Id': this.config.agentId,
|
|
31
|
+
'X-Shared-Secret': this.config.sharedSecret,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
const text = await response.text();
|
|
36
|
+
throw new Error(`Failed to deregister: ${response.status} ${text}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async discover(agentId) {
|
|
40
|
+
const response = await fetch(`${this.config.registryUrl}/api/agents/${agentId}`, {
|
|
41
|
+
headers: {
|
|
42
|
+
'X-Agent-Id': this.config.agentId,
|
|
43
|
+
'X-Shared-Secret': this.config.sharedSecret,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
if (response.status === 404)
|
|
47
|
+
return null;
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const text = await response.text();
|
|
50
|
+
throw new Error(`Failed to discover agent: ${response.status} ${text}`);
|
|
51
|
+
}
|
|
52
|
+
const agent = await response.json();
|
|
53
|
+
return agent;
|
|
54
|
+
}
|
|
55
|
+
async listAgents(options) {
|
|
56
|
+
const params = new URLSearchParams();
|
|
57
|
+
if (options?.domain)
|
|
58
|
+
params.set('domain', options.domain);
|
|
59
|
+
if (options?.status)
|
|
60
|
+
params.set('status', options.status);
|
|
61
|
+
const url = `${this.config.registryUrl}/api/agents?${params.toString()}`;
|
|
62
|
+
const response = await fetch(url, {
|
|
63
|
+
headers: {
|
|
64
|
+
'X-Agent-Id': this.config.agentId,
|
|
65
|
+
'X-Shared-Secret': this.config.sharedSecret,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
throw new Error(`Failed to list agents: ${response.status}`);
|
|
70
|
+
}
|
|
71
|
+
return response.json();
|
|
72
|
+
}
|
|
73
|
+
startHeartbeat(agentId, intervalMs) {
|
|
74
|
+
this.stopHeartbeat();
|
|
75
|
+
this.heartbeatTimer = setInterval(async () => {
|
|
76
|
+
try {
|
|
77
|
+
await fetch(`${this.config.registryUrl}/api/agents/${agentId}/heartbeat`, {
|
|
78
|
+
method: 'POST',
|
|
79
|
+
headers: {
|
|
80
|
+
'X-Agent-Id': this.config.agentId,
|
|
81
|
+
'X-Shared-Secret': this.config.sharedSecret,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Heartbeat failure is non-fatal — registry will mark us unhealthy
|
|
87
|
+
}
|
|
88
|
+
}, intervalMs);
|
|
89
|
+
}
|
|
90
|
+
stopHeartbeat() {
|
|
91
|
+
if (this.heartbeatTimer) {
|
|
92
|
+
clearInterval(this.heartbeatTimer);
|
|
93
|
+
this.heartbeatTimer = null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { RegistryStore, type RegistryStoreConfig, type RegisteredAgent } from './store.js';
|
|
2
|
+
export { RegistryClient, type RegistryClientConfig } from './client.js';
|
|
3
|
+
export { RegistryServer, type RegistryServerConfig } from './server.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkD,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,cAAc,EAA6B,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,cAAc,EAA6B,MAAM,aAAa,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type RegistryStoreConfig } from './store.js';
|
|
2
|
+
export interface RegistryServerConfig {
|
|
3
|
+
port: number;
|
|
4
|
+
host?: string;
|
|
5
|
+
sharedSecret: string;
|
|
6
|
+
store: RegistryStoreConfig;
|
|
7
|
+
/** Interval for checking stale agents (default: 30s) */
|
|
8
|
+
staleCheckIntervalMs?: number;
|
|
9
|
+
/** Heartbeat threshold before marking unhealthy (default: 45s) */
|
|
10
|
+
staleThresholdMs?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Registry HTTP server — the central discovery service.
|
|
14
|
+
* Lightweight, independently deployable.
|
|
15
|
+
*/
|
|
16
|
+
export declare class RegistryServer {
|
|
17
|
+
private server;
|
|
18
|
+
private store;
|
|
19
|
+
private config;
|
|
20
|
+
private staleCheckTimer;
|
|
21
|
+
constructor(config: RegistryServerConfig);
|
|
22
|
+
start(): Promise<void>;
|
|
23
|
+
stop(): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,wDAAwD;IACxD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,eAAe,CAA+C;gBAE1D,MAAM,EAAE,oBAAoB;IAKlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0EtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAW5B"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import Fastify, {} from 'fastify';
|
|
2
|
+
import { RegistryStore } from './store.js';
|
|
3
|
+
/**
|
|
4
|
+
* Registry HTTP server — the central discovery service.
|
|
5
|
+
* Lightweight, independently deployable.
|
|
6
|
+
*/
|
|
7
|
+
export class RegistryServer {
|
|
8
|
+
server = null;
|
|
9
|
+
store;
|
|
10
|
+
config;
|
|
11
|
+
staleCheckTimer = null;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.store = new RegistryStore(config.store);
|
|
15
|
+
}
|
|
16
|
+
async start() {
|
|
17
|
+
await this.store.start();
|
|
18
|
+
this.server = Fastify({ logger: false });
|
|
19
|
+
// Auth middleware
|
|
20
|
+
this.server.addHook('onRequest', async (request, reply) => {
|
|
21
|
+
if (request.url === '/health')
|
|
22
|
+
return;
|
|
23
|
+
const secret = request.headers['x-shared-secret'];
|
|
24
|
+
if (secret !== this.config.sharedSecret) {
|
|
25
|
+
reply.code(401).send({ error: 'Unauthorized' });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
// Health
|
|
29
|
+
this.server.get('/health', async () => ({ status: 'ok', service: 'registry' }));
|
|
30
|
+
// Register agent
|
|
31
|
+
this.server.post('/api/agents', async (request, reply) => {
|
|
32
|
+
const body = request.body;
|
|
33
|
+
await this.store.register(body);
|
|
34
|
+
reply.code(201).send({ ok: true });
|
|
35
|
+
});
|
|
36
|
+
// Get agent
|
|
37
|
+
this.server.get('/api/agents/:agentId', async (request, reply) => {
|
|
38
|
+
const { agentId } = request.params;
|
|
39
|
+
const agent = await this.store.getAgent(agentId);
|
|
40
|
+
if (!agent) {
|
|
41
|
+
reply.code(404).send({ error: 'Agent not found' });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
return agent;
|
|
45
|
+
});
|
|
46
|
+
// List agents
|
|
47
|
+
this.server.get('/api/agents', async (request) => {
|
|
48
|
+
const { domain, status } = request.query;
|
|
49
|
+
return this.store.getAllAgents({ domain, status });
|
|
50
|
+
});
|
|
51
|
+
// Deregister agent
|
|
52
|
+
this.server.delete('/api/agents/:agentId', async (request, reply) => {
|
|
53
|
+
const { agentId } = request.params;
|
|
54
|
+
await this.store.deregister(agentId);
|
|
55
|
+
reply.code(204).send();
|
|
56
|
+
});
|
|
57
|
+
// Heartbeat
|
|
58
|
+
this.server.post('/api/agents/:agentId/heartbeat', async (request, reply) => {
|
|
59
|
+
const { agentId } = request.params;
|
|
60
|
+
await this.store.heartbeat(agentId);
|
|
61
|
+
reply.code(204).send();
|
|
62
|
+
});
|
|
63
|
+
await this.server.listen({
|
|
64
|
+
port: this.config.port,
|
|
65
|
+
host: this.config.host ?? '0.0.0.0',
|
|
66
|
+
});
|
|
67
|
+
// Start stale agent checker
|
|
68
|
+
const staleInterval = this.config.staleCheckIntervalMs ?? 30_000;
|
|
69
|
+
const staleThreshold = this.config.staleThresholdMs ?? 45_000;
|
|
70
|
+
this.staleCheckTimer = setInterval(async () => {
|
|
71
|
+
try {
|
|
72
|
+
await this.store.markStaleAgents(staleThreshold);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Non-fatal
|
|
76
|
+
}
|
|
77
|
+
}, staleInterval);
|
|
78
|
+
}
|
|
79
|
+
async stop() {
|
|
80
|
+
if (this.staleCheckTimer) {
|
|
81
|
+
clearInterval(this.staleCheckTimer);
|
|
82
|
+
this.staleCheckTimer = null;
|
|
83
|
+
}
|
|
84
|
+
if (this.server) {
|
|
85
|
+
await this.server.close();
|
|
86
|
+
this.server = null;
|
|
87
|
+
}
|
|
88
|
+
await this.store.stop();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export interface RegistryStoreConfig {
|
|
2
|
+
connectionString: string;
|
|
3
|
+
}
|
|
4
|
+
export interface RegisteredAgent {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
domain: string;
|
|
8
|
+
version: string;
|
|
9
|
+
description: string;
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
endpoints: Array<{
|
|
12
|
+
path: string;
|
|
13
|
+
method: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}>;
|
|
16
|
+
events: {
|
|
17
|
+
subscriptions: Array<{
|
|
18
|
+
topic: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
}>;
|
|
21
|
+
publications: Array<{
|
|
22
|
+
topic: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
}>;
|
|
25
|
+
};
|
|
26
|
+
tasks: Array<{
|
|
27
|
+
topic: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
}>;
|
|
30
|
+
skills: Array<{
|
|
31
|
+
name: string;
|
|
32
|
+
description: string;
|
|
33
|
+
visibility: string;
|
|
34
|
+
type: string;
|
|
35
|
+
}>;
|
|
36
|
+
tools: Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
visibility: string;
|
|
40
|
+
}>;
|
|
41
|
+
status: 'online' | 'offline' | 'unhealthy';
|
|
42
|
+
lastHeartbeat: Date;
|
|
43
|
+
registeredAt: Date;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* PostgreSQL-backed registry store.
|
|
47
|
+
* Persists agent registrations for discovery and health tracking.
|
|
48
|
+
*/
|
|
49
|
+
export declare class RegistryStore {
|
|
50
|
+
private pool;
|
|
51
|
+
private config;
|
|
52
|
+
constructor(config: RegistryStoreConfig);
|
|
53
|
+
start(): Promise<void>;
|
|
54
|
+
stop(): Promise<void>;
|
|
55
|
+
private ensureSchema;
|
|
56
|
+
register(agent: Omit<RegisteredAgent, 'status' | 'lastHeartbeat' | 'registeredAt'>): Promise<void>;
|
|
57
|
+
deregister(agentId: string): Promise<void>;
|
|
58
|
+
heartbeat(agentId: string): Promise<void>;
|
|
59
|
+
getAgent(agentId: string): Promise<RegisteredAgent | null>;
|
|
60
|
+
getAllAgents(options?: {
|
|
61
|
+
status?: string;
|
|
62
|
+
domain?: string;
|
|
63
|
+
}): Promise<RegisteredAgent[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Mark agents as unhealthy if no heartbeat received within the threshold.
|
|
66
|
+
*/
|
|
67
|
+
markStaleAgents(thresholdMs?: number): Promise<number>;
|
|
68
|
+
private rowToAgent;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,MAAM,EAAE;QACN,aAAa,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC9D,YAAY,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9D,CAAC;IACF,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvF,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAC3C,aAAa,EAAE,IAAI,CAAC;IACpB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,YAAY;IA0BpB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,eAAe,GAAG,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BlG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAY1D,YAAY,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA6B9F;;OAEG;IACG,eAAe,CAAC,WAAW,GAAE,MAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAYpE,OAAO,CAAC,UAAU;CAkBnB"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import pg from 'pg';
|
|
2
|
+
const { Pool } = pg;
|
|
3
|
+
/**
|
|
4
|
+
* PostgreSQL-backed registry store.
|
|
5
|
+
* Persists agent registrations for discovery and health tracking.
|
|
6
|
+
*/
|
|
7
|
+
export class RegistryStore {
|
|
8
|
+
pool = null;
|
|
9
|
+
config;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
async start() {
|
|
14
|
+
this.pool = new Pool({ connectionString: this.config.connectionString });
|
|
15
|
+
await this.ensureSchema();
|
|
16
|
+
}
|
|
17
|
+
async stop() {
|
|
18
|
+
if (this.pool) {
|
|
19
|
+
await this.pool.end();
|
|
20
|
+
this.pool = null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async ensureSchema() {
|
|
24
|
+
if (!this.pool)
|
|
25
|
+
return;
|
|
26
|
+
await this.pool.query(`
|
|
27
|
+
CREATE TABLE IF NOT EXISTS agent_registry (
|
|
28
|
+
id TEXT PRIMARY KEY,
|
|
29
|
+
name TEXT NOT NULL,
|
|
30
|
+
domain TEXT NOT NULL,
|
|
31
|
+
version TEXT NOT NULL,
|
|
32
|
+
description TEXT DEFAULT '',
|
|
33
|
+
base_url TEXT NOT NULL,
|
|
34
|
+
endpoints JSONB DEFAULT '[]',
|
|
35
|
+
events JSONB DEFAULT '{}',
|
|
36
|
+
tasks JSONB DEFAULT '[]',
|
|
37
|
+
skills JSONB DEFAULT '[]',
|
|
38
|
+
tools JSONB DEFAULT '[]',
|
|
39
|
+
status TEXT DEFAULT 'online',
|
|
40
|
+
last_heartbeat TIMESTAMPTZ DEFAULT NOW(),
|
|
41
|
+
registered_at TIMESTAMPTZ DEFAULT NOW()
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_registry_domain ON agent_registry(domain);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_registry_status ON agent_registry(status);
|
|
46
|
+
`);
|
|
47
|
+
}
|
|
48
|
+
async register(agent) {
|
|
49
|
+
if (!this.pool)
|
|
50
|
+
throw new Error('Registry store not started');
|
|
51
|
+
await this.pool.query(`INSERT INTO agent_registry (id, name, domain, version, description, base_url, endpoints, events, tasks, skills, tools, status, last_heartbeat, registered_at)
|
|
52
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, 'online', NOW(), NOW())
|
|
53
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
54
|
+
name = $2, domain = $3, version = $4, description = $5, base_url = $6,
|
|
55
|
+
endpoints = $7, events = $8, tasks = $9, skills = $10, tools = $11,
|
|
56
|
+
status = 'online', last_heartbeat = NOW()`, [
|
|
57
|
+
agent.id,
|
|
58
|
+
agent.name,
|
|
59
|
+
agent.domain,
|
|
60
|
+
agent.version,
|
|
61
|
+
agent.description,
|
|
62
|
+
agent.baseUrl,
|
|
63
|
+
JSON.stringify(agent.endpoints),
|
|
64
|
+
JSON.stringify(agent.events),
|
|
65
|
+
JSON.stringify(agent.tasks),
|
|
66
|
+
JSON.stringify(agent.skills),
|
|
67
|
+
JSON.stringify(agent.tools),
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
async deregister(agentId) {
|
|
71
|
+
if (!this.pool)
|
|
72
|
+
throw new Error('Registry store not started');
|
|
73
|
+
await this.pool.query(`UPDATE agent_registry SET status = 'offline' WHERE id = $1`, [agentId]);
|
|
74
|
+
}
|
|
75
|
+
async heartbeat(agentId) {
|
|
76
|
+
if (!this.pool)
|
|
77
|
+
throw new Error('Registry store not started');
|
|
78
|
+
await this.pool.query(`UPDATE agent_registry SET last_heartbeat = NOW(), status = 'online' WHERE id = $1`, [agentId]);
|
|
79
|
+
}
|
|
80
|
+
async getAgent(agentId) {
|
|
81
|
+
if (!this.pool)
|
|
82
|
+
throw new Error('Registry store not started');
|
|
83
|
+
const result = await this.pool.query('SELECT * FROM agent_registry WHERE id = $1', [agentId]);
|
|
84
|
+
if (result.rows.length === 0)
|
|
85
|
+
return null;
|
|
86
|
+
return this.rowToAgent(result.rows[0]);
|
|
87
|
+
}
|
|
88
|
+
async getAllAgents(options) {
|
|
89
|
+
if (!this.pool)
|
|
90
|
+
throw new Error('Registry store not started');
|
|
91
|
+
const conditions = [];
|
|
92
|
+
const params = [];
|
|
93
|
+
let idx = 1;
|
|
94
|
+
if (options?.status) {
|
|
95
|
+
conditions.push(`status = $${idx}`);
|
|
96
|
+
params.push(options.status);
|
|
97
|
+
idx++;
|
|
98
|
+
}
|
|
99
|
+
if (options?.domain) {
|
|
100
|
+
conditions.push(`domain = $${idx}`);
|
|
101
|
+
params.push(options.domain);
|
|
102
|
+
idx++;
|
|
103
|
+
}
|
|
104
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
105
|
+
const result = await this.pool.query(`SELECT * FROM agent_registry ${where} ORDER BY name`, params);
|
|
106
|
+
return result.rows.map(this.rowToAgent);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Mark agents as unhealthy if no heartbeat received within the threshold.
|
|
110
|
+
*/
|
|
111
|
+
async markStaleAgents(thresholdMs = 45_000) {
|
|
112
|
+
if (!this.pool)
|
|
113
|
+
throw new Error('Registry store not started');
|
|
114
|
+
const threshold = new Date(Date.now() - thresholdMs);
|
|
115
|
+
const result = await this.pool.query(`UPDATE agent_registry SET status = 'unhealthy' WHERE status = 'online' AND last_heartbeat < $1`, [threshold]);
|
|
116
|
+
return result.rowCount ?? 0;
|
|
117
|
+
}
|
|
118
|
+
rowToAgent(row) {
|
|
119
|
+
return {
|
|
120
|
+
id: row.id,
|
|
121
|
+
name: row.name,
|
|
122
|
+
domain: row.domain,
|
|
123
|
+
version: row.version,
|
|
124
|
+
description: row.description,
|
|
125
|
+
baseUrl: row.base_url,
|
|
126
|
+
endpoints: row.endpoints,
|
|
127
|
+
events: row.events,
|
|
128
|
+
tasks: row.tasks,
|
|
129
|
+
skills: row.skills,
|
|
130
|
+
tools: row.tools,
|
|
131
|
+
status: row.status,
|
|
132
|
+
lastHeartbeat: new Date(row.last_heartbeat),
|
|
133
|
+
registeredAt: new Date(row.registered_at),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mce-bt/microagents-registry",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Lightweight central registry service — agent discovery, health, API catalog",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc --build",
|
|
16
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|
|
17
|
+
"test": "vitest run"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"fastify": "^5.2.0",
|
|
21
|
+
"ioredis": "^5.4.0",
|
|
22
|
+
"pg": "^8.13.0",
|
|
23
|
+
"zod": "^3.23.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/pg": "^8.11.0"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"files": [
|
|
30
|
+
"dist"
|
|
31
|
+
],
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
},
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/cavillo/microagents.git",
|
|
38
|
+
"directory": "packages/registry"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://github.com/cavillo/microagents#readme",
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/cavillo/microagents/issues"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=20.0.0"
|
|
46
|
+
}
|
|
47
|
+
}
|