@honeybee-ai/incubator 1.0.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.
Potentially problematic release.
This version of @honeybee-ai/incubator might be problematic. Click here for more details.
- package/README.md +586 -0
- package/dashboard/dist/assets/index-CVqcfjV3.js +9 -0
- package/dashboard/dist/assets/index-CyFMIiFl.css +1 -0
- package/dashboard/dist/index.html +13 -0
- package/dist/agent/prompt.d.ts +70 -0
- package/dist/agent/prompt.js +165 -0
- package/dist/agent/prompt.js.map +1 -0
- package/dist/agent/providers.d.ts +6 -0
- package/dist/agent/providers.js +320 -0
- package/dist/agent/providers.js.map +1 -0
- package/dist/agent/runner.d.ts +22 -0
- package/dist/agent/runner.js +282 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/test-helpers.d.ts +11 -0
- package/dist/agent/test-helpers.js +63 -0
- package/dist/agent/test-helpers.js.map +1 -0
- package/dist/agent/tools.d.ts +4 -0
- package/dist/agent/tools.js +545 -0
- package/dist/agent/tools.js.map +1 -0
- package/dist/agent/types.d.ts +54 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/bus.d.ts +24 -0
- package/dist/bus.js +79 -0
- package/dist/bus.js.map +1 -0
- package/dist/guard.d.ts +44 -0
- package/dist/guard.js +178 -0
- package/dist/guard.js.map +1 -0
- package/dist/heartbeat.d.ts +41 -0
- package/dist/heartbeat.js +104 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/honeycomb.d.ts +49 -0
- package/dist/honeycomb.js +176 -0
- package/dist/honeycomb.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +371 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/config.d.ts +14 -0
- package/dist/integrations/config.js +48 -0
- package/dist/integrations/config.js.map +1 -0
- package/dist/integrations/index.d.ts +4 -0
- package/dist/integrations/index.js +4 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/loader.d.ts +8 -0
- package/dist/integrations/loader.js +27 -0
- package/dist/integrations/loader.js.map +1 -0
- package/dist/integrations/manager.d.ts +29 -0
- package/dist/integrations/manager.js +108 -0
- package/dist/integrations/manager.js.map +1 -0
- package/dist/namespaces.d.ts +25 -0
- package/dist/namespaces.js +84 -0
- package/dist/namespaces.js.map +1 -0
- package/dist/persistence.d.ts +7 -0
- package/dist/persistence.js +62 -0
- package/dist/persistence.js.map +1 -0
- package/dist/protocol/index.d.ts +5 -0
- package/dist/protocol/index.js +5 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/parser.d.ts +31 -0
- package/dist/protocol/parser.js +193 -0
- package/dist/protocol/parser.js.map +1 -0
- package/dist/protocol/renderer.d.ts +16 -0
- package/dist/protocol/renderer.js +193 -0
- package/dist/protocol/renderer.js.map +1 -0
- package/dist/protocol/schema.d.ts +341 -0
- package/dist/protocol/schema.js +285 -0
- package/dist/protocol/schema.js.map +1 -0
- package/dist/protocol/types.d.ts +144 -0
- package/dist/protocol/types.js +8 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/protocol/variables.d.ts +22 -0
- package/dist/protocol/variables.js +58 -0
- package/dist/protocol/variables.js.map +1 -0
- package/dist/rest.d.ts +3 -0
- package/dist/rest.js +794 -0
- package/dist/rest.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.js +410 -0
- package/dist/server.js.map +1 -0
- package/dist/stores/backend.d.ts +15 -0
- package/dist/stores/backend.js +28 -0
- package/dist/stores/backend.js.map +1 -0
- package/dist/stores/claims.d.ts +14 -0
- package/dist/stores/claims.js +77 -0
- package/dist/stores/claims.js.map +1 -0
- package/dist/stores/conflicts.d.ts +10 -0
- package/dist/stores/conflicts.js +39 -0
- package/dist/stores/conflicts.js.map +1 -0
- package/dist/stores/control.d.ts +37 -0
- package/dist/stores/control.js +105 -0
- package/dist/stores/control.js.map +1 -0
- package/dist/stores/discoveries.d.ts +11 -0
- package/dist/stores/discoveries.js +45 -0
- package/dist/stores/discoveries.js.map +1 -0
- package/dist/stores/events.d.ts +14 -0
- package/dist/stores/events.js +37 -0
- package/dist/stores/events.js.map +1 -0
- package/dist/stores/help.d.ts +11 -0
- package/dist/stores/help.js +46 -0
- package/dist/stores/help.js.map +1 -0
- package/dist/stores/interfaces.d.ts +87 -0
- package/dist/stores/interfaces.js +2 -0
- package/dist/stores/interfaces.js.map +1 -0
- package/dist/stores/messages.d.ts +8 -0
- package/dist/stores/messages.js +29 -0
- package/dist/stores/messages.js.map +1 -0
- package/dist/stores/progress.d.ts +8 -0
- package/dist/stores/progress.js +21 -0
- package/dist/stores/progress.js.map +1 -0
- package/dist/stores/proposals.d.ts +11 -0
- package/dist/stores/proposals.js +46 -0
- package/dist/stores/proposals.js.map +1 -0
- package/dist/stores/redis/claims.d.ts +15 -0
- package/dist/stores/redis/claims.js +96 -0
- package/dist/stores/redis/claims.js.map +1 -0
- package/dist/stores/redis/db.d.ts +39 -0
- package/dist/stores/redis/db.js +34 -0
- package/dist/stores/redis/db.js.map +1 -0
- package/dist/stores/redis/discoveries.d.ts +13 -0
- package/dist/stores/redis/discoveries.js +54 -0
- package/dist/stores/redis/discoveries.js.map +1 -0
- package/dist/stores/redis/events.d.ts +17 -0
- package/dist/stores/redis/events.js +57 -0
- package/dist/stores/redis/events.js.map +1 -0
- package/dist/stores/redis/index.d.ts +3 -0
- package/dist/stores/redis/index.js +29 -0
- package/dist/stores/redis/index.js.map +1 -0
- package/dist/stores/redis/state.d.ts +14 -0
- package/dist/stores/redis/state.js +83 -0
- package/dist/stores/redis/state.js.map +1 -0
- package/dist/stores/reinforcements.d.ts +11 -0
- package/dist/stores/reinforcements.js +42 -0
- package/dist/stores/reinforcements.js.map +1 -0
- package/dist/stores/roles.d.ts +9 -0
- package/dist/stores/roles.js +22 -0
- package/dist/stores/roles.js.map +1 -0
- package/dist/stores/sqlite/claims.d.ts +17 -0
- package/dist/stores/sqlite/claims.js +121 -0
- package/dist/stores/sqlite/claims.js.map +1 -0
- package/dist/stores/sqlite/db.d.ts +16 -0
- package/dist/stores/sqlite/db.js +77 -0
- package/dist/stores/sqlite/db.js.map +1 -0
- package/dist/stores/sqlite/discoveries.d.ts +14 -0
- package/dist/stores/sqlite/discoveries.js +66 -0
- package/dist/stores/sqlite/discoveries.js.map +1 -0
- package/dist/stores/sqlite/events.d.ts +16 -0
- package/dist/stores/sqlite/events.js +75 -0
- package/dist/stores/sqlite/events.js.map +1 -0
- package/dist/stores/sqlite/index.d.ts +2 -0
- package/dist/stores/sqlite/index.js +31 -0
- package/dist/stores/sqlite/index.js.map +1 -0
- package/dist/stores/sqlite/state.d.ts +15 -0
- package/dist/stores/sqlite/state.js +99 -0
- package/dist/stores/sqlite/state.js.map +1 -0
- package/dist/stores/state.d.ts +11 -0
- package/dist/stores/state.js +67 -0
- package/dist/stores/state.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.js +20 -0
- package/dist/utils.js.map +1 -0
- package/dist/ws.d.ts +25 -0
- package/dist/ws.js +117 -0
- package/dist/ws.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { matchGlob, isExpired } from '../utils.js';
|
|
2
|
+
export class StateStore {
|
|
3
|
+
entries = new Map();
|
|
4
|
+
async get(key) {
|
|
5
|
+
const entry = this.entries.get(key);
|
|
6
|
+
if (!entry)
|
|
7
|
+
return null;
|
|
8
|
+
if (isExpired(entry.setAt, entry.ttlMs)) {
|
|
9
|
+
this.entries.delete(key);
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return entry;
|
|
13
|
+
}
|
|
14
|
+
async set(key, value, agentId, category, ttlMs) {
|
|
15
|
+
const now = new Date().toISOString();
|
|
16
|
+
const existing = this.entries.get(key);
|
|
17
|
+
const entry = {
|
|
18
|
+
key,
|
|
19
|
+
value,
|
|
20
|
+
category,
|
|
21
|
+
setBy: agentId,
|
|
22
|
+
setAt: existing?.setAt ?? now,
|
|
23
|
+
updatedAt: now,
|
|
24
|
+
ttlMs,
|
|
25
|
+
};
|
|
26
|
+
this.entries.set(key, entry);
|
|
27
|
+
return entry;
|
|
28
|
+
}
|
|
29
|
+
async delete(key) {
|
|
30
|
+
return this.entries.delete(key);
|
|
31
|
+
}
|
|
32
|
+
async query(pattern, category) {
|
|
33
|
+
const results = [];
|
|
34
|
+
for (const entry of this.entries.values()) {
|
|
35
|
+
if (isExpired(entry.setAt, entry.ttlMs)) {
|
|
36
|
+
this.entries.delete(entry.key);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (pattern && !matchGlob(pattern, entry.key))
|
|
40
|
+
continue;
|
|
41
|
+
if (category && entry.category !== category)
|
|
42
|
+
continue;
|
|
43
|
+
results.push(entry);
|
|
44
|
+
}
|
|
45
|
+
return results;
|
|
46
|
+
}
|
|
47
|
+
// For persistence
|
|
48
|
+
async getAll() {
|
|
49
|
+
// Clean expired on export
|
|
50
|
+
const results = [];
|
|
51
|
+
for (const entry of this.entries.values()) {
|
|
52
|
+
if (!isExpired(entry.setAt, entry.ttlMs)) {
|
|
53
|
+
results.push(entry);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return results;
|
|
57
|
+
}
|
|
58
|
+
async load(entries) {
|
|
59
|
+
this.entries.clear();
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
if (!isExpired(entry.setAt, entry.ttlMs)) {
|
|
62
|
+
this.entries.set(entry.key, entry);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/stores/state.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface StateEntry {
|
|
2
|
+
key: string;
|
|
3
|
+
value: unknown;
|
|
4
|
+
category?: string;
|
|
5
|
+
setBy: string;
|
|
6
|
+
setAt: string;
|
|
7
|
+
updatedAt: string;
|
|
8
|
+
ttlMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface Claim {
|
|
11
|
+
resource: string;
|
|
12
|
+
value: string;
|
|
13
|
+
owner: string;
|
|
14
|
+
status: 'active' | 'released' | 'expired';
|
|
15
|
+
claimedAt: string;
|
|
16
|
+
ttlMs?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface IncubatorEvent {
|
|
19
|
+
id: number;
|
|
20
|
+
type: string;
|
|
21
|
+
data: unknown;
|
|
22
|
+
publishedBy: string;
|
|
23
|
+
publishedAt: string;
|
|
24
|
+
}
|
|
25
|
+
export interface Discovery {
|
|
26
|
+
id: string;
|
|
27
|
+
topic: string;
|
|
28
|
+
content: string;
|
|
29
|
+
category?: string;
|
|
30
|
+
publishedBy: string;
|
|
31
|
+
publishedAt: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ClaimResult {
|
|
34
|
+
status: 'approved' | 'rejected';
|
|
35
|
+
claim: Claim;
|
|
36
|
+
}
|
|
37
|
+
export type { Message, HelpRequest, ProgressReport, Conflict, RoleAssignment, ReinforcementRequest, Proposal, } from '@agentcoordinationprotocol/spec';
|
|
38
|
+
export interface Snapshot {
|
|
39
|
+
state: StateEntry[];
|
|
40
|
+
claims: Claim[];
|
|
41
|
+
events: IncubatorEvent[];
|
|
42
|
+
discoveries: Discovery[];
|
|
43
|
+
eventCursor: number;
|
|
44
|
+
savedAt: string;
|
|
45
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
package/dist/utils.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
let idCounter = 0;
|
|
2
|
+
export function generateId() {
|
|
3
|
+
return `${Date.now()}-${++idCounter}`;
|
|
4
|
+
}
|
|
5
|
+
export function matchGlob(pattern, text) {
|
|
6
|
+
// Convert glob pattern to regex
|
|
7
|
+
// Supports * (any chars) and ? (single char)
|
|
8
|
+
const escaped = pattern
|
|
9
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
10
|
+
.replace(/\*/g, '.*')
|
|
11
|
+
.replace(/\?/g, '.');
|
|
12
|
+
return new RegExp(`^${escaped}$`).test(text);
|
|
13
|
+
}
|
|
14
|
+
export function isExpired(timestamp, ttlMs) {
|
|
15
|
+
if (!ttlMs)
|
|
16
|
+
return false;
|
|
17
|
+
const created = new Date(timestamp).getTime();
|
|
18
|
+
return Date.now() > created + ttlMs;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,MAAM,UAAU,UAAU;IACxB,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,IAAY;IACrD,gCAAgC;IAChC,6CAA6C;IAC7C,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvB,OAAO,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,KAAc;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC;AACtC,CAAC"}
|
package/dist/ws.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Server as HttpServer, IncomingMessage } from 'node:http';
|
|
2
|
+
import type { Duplex } from 'node:stream';
|
|
3
|
+
import type { NotificationBus } from './bus.js';
|
|
4
|
+
import type { NamespaceRegistry } from './namespaces.js';
|
|
5
|
+
interface WebSocketLike {
|
|
6
|
+
send(data: string): void;
|
|
7
|
+
close(): void;
|
|
8
|
+
readyState: number;
|
|
9
|
+
on(event: string, cb: (...args: unknown[]) => void): void;
|
|
10
|
+
OPEN: number;
|
|
11
|
+
}
|
|
12
|
+
interface WebSocketServerLike {
|
|
13
|
+
handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer, cb: (ws: WebSocketLike) => void): void;
|
|
14
|
+
close(): void;
|
|
15
|
+
clients: Set<WebSocketLike>;
|
|
16
|
+
}
|
|
17
|
+
export interface WsManager {
|
|
18
|
+
close(): void;
|
|
19
|
+
}
|
|
20
|
+
export declare function setupWebSocket(httpServer: HttpServer, registry: NamespaceRegistry, bus: NotificationBus, verbose?: boolean,
|
|
21
|
+
/** @internal for testing — inject WebSocketServer to avoid createRequire issues in vitest */
|
|
22
|
+
WebSocketServerOverride?: new (opts: {
|
|
23
|
+
noServer: true;
|
|
24
|
+
}) => WebSocketServerLike): WsManager;
|
|
25
|
+
export {};
|
package/dist/ws.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
const PING_INTERVAL = 30_000;
|
|
3
|
+
function loadWebSocketServer() {
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const ws = require('ws');
|
|
6
|
+
return ws.WebSocketServer;
|
|
7
|
+
}
|
|
8
|
+
export function setupWebSocket(httpServer, registry, bus, verbose,
|
|
9
|
+
/** @internal for testing — inject WebSocketServer to avoid createRequire issues in vitest */
|
|
10
|
+
WebSocketServerOverride) {
|
|
11
|
+
const WebSocketServer = WebSocketServerOverride ?? loadWebSocketServer();
|
|
12
|
+
const wss = new WebSocketServer({ noServer: true });
|
|
13
|
+
httpServer.on('upgrade', (req, socket, head) => {
|
|
14
|
+
const url = new URL(req.url ?? '/', `http://localhost`);
|
|
15
|
+
if (url.pathname !== '/ws') {
|
|
16
|
+
socket.destroy();
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
20
|
+
handleConnection(ws, url, registry, bus, verbose);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
close() {
|
|
25
|
+
wss.close();
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function handleConnection(ws, url, registry, bus, verbose) {
|
|
30
|
+
const namespace = url.searchParams.get('namespace') ?? 'default';
|
|
31
|
+
const sinceParam = url.searchParams.get('since');
|
|
32
|
+
const since = sinceParam !== null ? parseInt(sinceParam, 10) : undefined;
|
|
33
|
+
const typesParam = url.searchParams.get('types');
|
|
34
|
+
let typeFilter = typesParam ? new Set(typesParam.split(',').filter(Boolean)) : null;
|
|
35
|
+
// Buffer for events arriving during replay
|
|
36
|
+
const buffer = [];
|
|
37
|
+
let replaying = true;
|
|
38
|
+
let replayCursor = since ?? 0;
|
|
39
|
+
function send(msg) {
|
|
40
|
+
if (ws.readyState === ws.OPEN) {
|
|
41
|
+
ws.send(JSON.stringify(msg));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function matchesFilter(event) {
|
|
45
|
+
if (!typeFilter)
|
|
46
|
+
return true;
|
|
47
|
+
return typeFilter.has(event.type);
|
|
48
|
+
}
|
|
49
|
+
// Subscribe to bus FIRST (buffer during replay)
|
|
50
|
+
const unsubscribe = bus.subscribe(namespace, (event) => {
|
|
51
|
+
if (!matchesFilter(event))
|
|
52
|
+
return;
|
|
53
|
+
if (replaying) {
|
|
54
|
+
buffer.push(event);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
send({ type: 'event', event });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
// Replay from store
|
|
61
|
+
const stores = registry.get(namespace);
|
|
62
|
+
stores.events.getEvents(since).then(({ events, cursor }) => {
|
|
63
|
+
// Send replayed events
|
|
64
|
+
for (const event of events) {
|
|
65
|
+
if (matchesFilter(event)) {
|
|
66
|
+
send({ type: 'event', event });
|
|
67
|
+
replayCursor = Math.max(replayCursor, event.id);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
replayCursor = Math.max(replayCursor, cursor);
|
|
71
|
+
// Send replay_done marker
|
|
72
|
+
send({ type: 'replay_done', cursor: replayCursor });
|
|
73
|
+
// Flush buffer (de-dup: skip events already sent via replay)
|
|
74
|
+
replaying = false;
|
|
75
|
+
for (const event of buffer) {
|
|
76
|
+
if (event.id > replayCursor) {
|
|
77
|
+
send({ type: 'event', event });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
buffer.length = 0;
|
|
81
|
+
if (verbose) {
|
|
82
|
+
console.error(`[incubator] WS client connected: ns=${namespace} since=${since ?? 'start'} replayed=${events.length}`);
|
|
83
|
+
}
|
|
84
|
+
}).catch((err) => {
|
|
85
|
+
send({ type: 'error', message: 'Replay failed' });
|
|
86
|
+
if (verbose)
|
|
87
|
+
console.error('[incubator] WS replay error:', err);
|
|
88
|
+
ws.close();
|
|
89
|
+
});
|
|
90
|
+
// Handle client messages
|
|
91
|
+
ws.on('message', (raw) => {
|
|
92
|
+
try {
|
|
93
|
+
const msg = JSON.parse(String(raw));
|
|
94
|
+
if (msg.type === 'subscribe') {
|
|
95
|
+
typeFilter = msg.types ? new Set(msg.types) : null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// ignore malformed messages
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
// Ping keepalive
|
|
103
|
+
const pingTimer = setInterval(() => {
|
|
104
|
+
send({ type: 'ping', ts: Date.now() });
|
|
105
|
+
}, PING_INTERVAL);
|
|
106
|
+
// Cleanup on close/error
|
|
107
|
+
const cleanup = () => {
|
|
108
|
+
clearInterval(pingTimer);
|
|
109
|
+
unsubscribe();
|
|
110
|
+
if (verbose) {
|
|
111
|
+
console.error(`[incubator] WS client disconnected: ns=${namespace}`);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
ws.on('close', cleanup);
|
|
115
|
+
ws.on('error', cleanup);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=ws.js.map
|
package/dist/ws.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@honeybee-ai/incubator",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Give your agent swarm shared memory. MCP server + REST API for multi-agent coordination.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"incubator": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"dashboard/dist",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:watch": "node --experimental-vm-modules node_modules/.bin/vitest",
|
|
22
|
+
"prepublishOnly": "pnpm run build && pnpm test"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"mcp",
|
|
26
|
+
"multi-agent",
|
|
27
|
+
"coordination",
|
|
28
|
+
"ai-agents",
|
|
29
|
+
"swarm",
|
|
30
|
+
"claims",
|
|
31
|
+
"shared-state",
|
|
32
|
+
"model-context-protocol",
|
|
33
|
+
"claude",
|
|
34
|
+
"llm",
|
|
35
|
+
"agent-coordination",
|
|
36
|
+
"rest-api",
|
|
37
|
+
"sqlite",
|
|
38
|
+
"redis",
|
|
39
|
+
"persistent"
|
|
40
|
+
],
|
|
41
|
+
"author": "Honeybee AI <hello@honeyb.dev>",
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "https://github.com/honeybee-ai/incubator"
|
|
46
|
+
},
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=18"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@agentcoordinationprotocol/sdk": "^0.1.0",
|
|
52
|
+
"@agentcoordinationprotocol/spec": "^0.2.1",
|
|
53
|
+
"@honeybee-ai/integration-sdk": "^0.1.0",
|
|
54
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
55
|
+
"@honeybee-ai/carapace": "^1.0.0",
|
|
56
|
+
"zod": "^3.24.2"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
60
|
+
"@types/node": "^22.13.1",
|
|
61
|
+
"@types/ws": "^8.5.14",
|
|
62
|
+
"typescript": "^5.7.3",
|
|
63
|
+
"vitest": "^3.0.5"
|
|
64
|
+
},
|
|
65
|
+
"pnpm": {
|
|
66
|
+
"onlyBuiltDependencies": ["better-sqlite3", "esbuild"]
|
|
67
|
+
},
|
|
68
|
+
"optionalDependencies": {
|
|
69
|
+
"better-sqlite3": "^12.6.2",
|
|
70
|
+
"ioredis": "^5.9.2",
|
|
71
|
+
"sirv": "^3.0.0",
|
|
72
|
+
"ws": "^8.18.0"
|
|
73
|
+
}
|
|
74
|
+
}
|