aibroker 0.2.6 → 0.6.1
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/README.md +164 -4
- package/dist/adapters/iterm/core.d.ts +2 -0
- package/dist/adapters/iterm/core.d.ts.map +1 -1
- package/dist/adapters/iterm/core.js +13 -5
- package/dist/adapters/iterm/core.js.map +1 -1
- package/dist/adapters/iterm/iterm2-api.d.ts +20 -0
- package/dist/adapters/iterm/iterm2-api.d.ts.map +1 -0
- package/dist/adapters/iterm/iterm2-api.js +244 -0
- package/dist/adapters/iterm/iterm2-api.js.map +1 -0
- package/dist/adapters/iterm/sessions.d.ts.map +1 -1
- package/dist/adapters/iterm/sessions.js +3 -2
- package/dist/adapters/iterm/sessions.js.map +1 -1
- package/dist/adapters/kokoro/media.d.ts +2 -1
- package/dist/adapters/kokoro/media.d.ts.map +1 -1
- package/dist/adapters/kokoro/media.js +53 -5
- package/dist/adapters/kokoro/media.js.map +1 -1
- package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-13-56).d.ts +49 -0
- package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-13-56).d.ts.map +1 -0
- package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-13-56).js +632 -0
- package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-13-56).js.map +1 -0
- package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-13-59).js +632 -0
- package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-15-36).d.ts +49 -0
- package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-15-36).d.ts.map +1 -0
- package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-15-36).js +614 -0
- package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-15-36).js.map +1 -0
- package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-15-46).js +614 -0
- package/dist/adapters/pailot/gateway.d.ts +48 -0
- package/dist/adapters/pailot/gateway.d.ts (SFConflict mnott 2026-03-06-21-13-59).map +1 -0
- package/dist/adapters/pailot/gateway.d.ts (SFConflict mnott 2026-03-06-21-15-46).map +1 -0
- package/dist/adapters/pailot/gateway.d.ts.map +1 -0
- package/dist/adapters/pailot/gateway.js +828 -0
- package/dist/adapters/pailot/gateway.js (SFConflict mnott 2026-03-06-21-13-59).map +1 -0
- package/dist/adapters/pailot/gateway.js (SFConflict mnott 2026-03-06-21-15-46).map +1 -0
- package/dist/adapters/pailot/gateway.js.map +1 -0
- package/dist/backend/api.d.ts +5 -1
- package/dist/backend/api.d.ts.map +1 -1
- package/dist/backend/api.js +74 -3
- package/dist/backend/api.js.map +1 -1
- package/dist/core/hybrid.d.ts +7 -0
- package/dist/core/hybrid.d.ts.map +1 -1
- package/dist/core/hybrid.js +33 -0
- package/dist/core/hybrid.js.map +1 -1
- package/dist/core/state.d.ts +3 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +4 -0
- package/dist/core/state.js.map +1 -1
- package/dist/core/status-cache.d.ts +51 -0
- package/dist/core/status-cache.d.ts.map +1 -0
- package/dist/core/status-cache.js +62 -0
- package/dist/core/status-cache.js.map +1 -0
- package/dist/daemon/adapter-registry (SFConflict mnott 2026-03-06-21-15-36).d.ts +63 -0
- package/dist/daemon/adapter-registry (SFConflict mnott 2026-03-06-21-15-36).d.ts.map +1 -0
- package/dist/daemon/adapter-registry (SFConflict mnott 2026-03-06-21-15-36).js +229 -0
- package/dist/daemon/adapter-registry (SFConflict mnott 2026-03-06-21-15-36).js.map +1 -0
- package/dist/daemon/adapter-registry.d.ts +63 -0
- package/dist/daemon/adapter-registry.d.ts.map +1 -0
- package/dist/daemon/adapter-registry.js +240 -0
- package/dist/daemon/adapter-registry.js.map +1 -0
- package/dist/daemon/cli.d.ts +14 -0
- package/dist/daemon/cli.d.ts.map +1 -0
- package/dist/daemon/cli.js +150 -0
- package/dist/daemon/cli.js.map +1 -0
- package/dist/daemon/command-context.d.ts +24 -0
- package/dist/daemon/command-context.d.ts.map +1 -0
- package/dist/daemon/command-context.js +13 -0
- package/dist/daemon/command-context.js.map +1 -0
- package/dist/daemon/commands.d.ts +22 -0
- package/dist/daemon/commands.d.ts.map +1 -0
- package/dist/daemon/commands.js +632 -0
- package/dist/daemon/commands.js.map +1 -0
- package/dist/daemon/core-handlers.d.ts +24 -0
- package/dist/daemon/core-handlers.d.ts.map +1 -0
- package/dist/daemon/core-handlers.js +640 -0
- package/dist/daemon/core-handlers.js.map +1 -0
- package/dist/daemon/create-adapter.d.ts +22 -0
- package/dist/daemon/create-adapter.d.ts.map +1 -0
- package/dist/daemon/create-adapter.js +153 -0
- package/dist/daemon/create-adapter.js.map +1 -0
- package/dist/daemon/image-gen.d.ts +28 -0
- package/dist/daemon/image-gen.d.ts.map +1 -0
- package/dist/daemon/image-gen.js +97 -0
- package/dist/daemon/image-gen.js.map +1 -0
- package/dist/daemon/index.d.ts +12 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +184 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/pai-projects.d.ts +68 -0
- package/dist/daemon/pai-projects.d.ts.map +1 -0
- package/dist/daemon/pai-projects.js +174 -0
- package/dist/daemon/pai-projects.js.map +1 -0
- package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-13-56).d.ts +12 -0
- package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-13-56).d.ts.map +1 -0
- package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-13-56).js +252 -0
- package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-13-56).js.map +1 -0
- package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-13-59).js +252 -0
- package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-15-36).d.ts +12 -0
- package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-15-36).d.ts.map +1 -0
- package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-15-36).js +240 -0
- package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-15-36).js.map +1 -0
- package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-15-46).js +240 -0
- package/dist/daemon/screenshot.d.ts +12 -0
- package/dist/daemon/screenshot.d.ts (SFConflict mnott 2026-03-06-21-13-59).map +1 -0
- package/dist/daemon/screenshot.d.ts (SFConflict mnott 2026-03-06-21-15-46).map +1 -0
- package/dist/daemon/screenshot.d.ts.map +1 -0
- package/dist/daemon/screenshot.js +252 -0
- package/dist/daemon/screenshot.js (SFConflict mnott 2026-03-06-21-13-59).map +1 -0
- package/dist/daemon/screenshot.js (SFConflict mnott 2026-03-06-21-15-46).map +1 -0
- package/dist/daemon/screenshot.js.map +1 -0
- package/dist/daemon/session-content.d.ts +27 -0
- package/dist/daemon/session-content.d.ts.map +1 -0
- package/dist/daemon/session-content.js +76 -0
- package/dist/daemon/session-content.js.map +1 -0
- package/dist/daemon/vision.d.ts +46 -0
- package/dist/daemon/vision.d.ts.map +1 -0
- package/dist/daemon/vision.js +176 -0
- package/dist/daemon/vision.js.map +1 -0
- package/dist/index.d.ts +16 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/ipc/client.d.ts +4 -1
- package/dist/ipc/client.d.ts.map +1 -1
- package/dist/ipc/client.js +10 -1
- package/dist/ipc/client.js.map +1 -1
- package/dist/ipc/validate.d.ts +52 -0
- package/dist/ipc/validate.d.ts.map +1 -0
- package/dist/ipc/validate.js +129 -0
- package/dist/ipc/validate.js.map +1 -0
- package/dist/mcp/index (SFConflict mnott 2026-03-06-21-13-56).d.ts +23 -0
- package/dist/mcp/index (SFConflict mnott 2026-03-06-21-13-56).d.ts.map +1 -0
- package/dist/mcp/index (SFConflict mnott 2026-03-06-21-13-56).js +595 -0
- package/dist/mcp/index (SFConflict mnott 2026-03-06-21-13-56).js.map +1 -0
- package/dist/mcp/index (SFConflict mnott 2026-03-06-21-13-59).js +595 -0
- package/dist/mcp/index (SFConflict mnott 2026-03-06-21-15-36).d.ts +23 -0
- package/dist/mcp/index (SFConflict mnott 2026-03-06-21-15-36).d.ts.map +1 -0
- package/dist/mcp/index (SFConflict mnott 2026-03-06-21-15-36).js +592 -0
- package/dist/mcp/index (SFConflict mnott 2026-03-06-21-15-36).js.map +1 -0
- package/dist/mcp/index (SFConflict mnott 2026-03-06-21-15-46).js +592 -0
- package/dist/mcp/index.d.ts +23 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +660 -0
- package/dist/mcp/index.js (SFConflict mnott 2026-03-06-21-13-59).map +1 -0
- package/dist/mcp/index.js (SFConflict mnott 2026-03-06-21-15-46).map +1 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/types/adapter.d.ts +41 -0
- package/dist/types/adapter.d.ts.map +1 -0
- package/dist/types/adapter.js +2 -0
- package/dist/types/adapter.js.map +1 -0
- package/dist/types/backend.d.ts +29 -1
- package/dist/types/backend.d.ts.map +1 -1
- package/dist/types/broker.d.ts +47 -0
- package/dist/types/broker.d.ts.map +1 -0
- package/dist/types/broker.js +21 -0
- package/dist/types/broker.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +12 -2
- package/templates/adapter/ONBOARDING_PROMPT.md +309 -0
- package/templates/adapter/README.md.tmpl +81 -0
- package/templates/adapter/package.json.tmpl +23 -0
- package/templates/adapter/src/watcher/cli.ts.tmpl +12 -0
- package/templates/adapter/src/watcher/commands.ts.tmpl +44 -0
- package/templates/adapter/src/watcher/connection.ts.tmpl +59 -0
- package/templates/adapter/src/watcher/index.ts.tmpl +201 -0
- package/templates/adapter/src/watcher/ipc-server.ts.tmpl +250 -0
- package/templates/adapter/src/watcher/send.ts.tmpl +62 -0
- package/templates/adapter/src/watcher/state.ts.tmpl +39 -0
- package/templates/adapter/tsconfig.json.tmpl +14 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon/adapter-registry.ts — Registry of connected adapters + routing engine.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1: minimal adapter tracking and commandHandler dispatch.
|
|
5
|
+
* Phase 2: full BrokerMessage routing with hub -> adapter delivery via IPC.
|
|
6
|
+
*/
|
|
7
|
+
import type { BrokerMessage, RouteResult } from "../types/broker.js";
|
|
8
|
+
import type { AdapterHealth } from "../types/adapter.js";
|
|
9
|
+
import type { CommandContext } from "./command-context.js";
|
|
10
|
+
export interface AdapterDescriptor {
|
|
11
|
+
name: string;
|
|
12
|
+
socketPath: string;
|
|
13
|
+
registeredAt: number;
|
|
14
|
+
}
|
|
15
|
+
type HubCommandHandler = (text: string, timestamp: number, ctx: CommandContext) => void | Promise<void>;
|
|
16
|
+
export declare class AdapterRegistry {
|
|
17
|
+
private readonly adapters;
|
|
18
|
+
private readonly lastHealth;
|
|
19
|
+
private pollInterval;
|
|
20
|
+
private hubCommandHandler;
|
|
21
|
+
setCommandHandler(handler: HubCommandHandler): void;
|
|
22
|
+
register(descriptor: AdapterDescriptor): void;
|
|
23
|
+
unregister(name: string): void;
|
|
24
|
+
startHealthPolling(intervalMs?: number): void;
|
|
25
|
+
stopHealthPolling(): void;
|
|
26
|
+
getAdapterHealth(name: string): AdapterHealth | undefined;
|
|
27
|
+
getAllHealth(): Map<string, AdapterHealth>;
|
|
28
|
+
private pollAllAdapters;
|
|
29
|
+
private pollAdapter;
|
|
30
|
+
get(name: string): AdapterDescriptor | undefined;
|
|
31
|
+
list(): AdapterDescriptor[];
|
|
32
|
+
/**
|
|
33
|
+
* Dispatch an incoming message from an adapter source through the
|
|
34
|
+
* BrokerMessage routing pipeline.
|
|
35
|
+
*
|
|
36
|
+
* Phase 1 called commandHandler directly. Phase 3 creates a proper
|
|
37
|
+
* BrokerMessage and routes it so PAILot messages flow through the
|
|
38
|
+
* same adapter pipeline as everything else (PAILot -> hub -> Whazaa).
|
|
39
|
+
*
|
|
40
|
+
* Falls back to commandHandler if no adapters are registered (embedded-like).
|
|
41
|
+
*/
|
|
42
|
+
dispatchIncoming(source: string, text: string, timestamp: number): void;
|
|
43
|
+
/**
|
|
44
|
+
* Route a BrokerMessage to the appropriate adapter.
|
|
45
|
+
*
|
|
46
|
+
* Routing logic:
|
|
47
|
+
* 1. If target is specified and adapter is registered -> deliver to that adapter
|
|
48
|
+
* 2. If target is specified but not registered -> error
|
|
49
|
+
* 3. If target is omitted and type is "command" -> run through commandHandler
|
|
50
|
+
* 4. If target is omitted -> deliver to first registered messaging adapter
|
|
51
|
+
* 5. If no adapters registered -> error
|
|
52
|
+
*/
|
|
53
|
+
route(message: BrokerMessage): Promise<RouteResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Deliver a BrokerMessage to an adapter via its IPC socket.
|
|
56
|
+
*
|
|
57
|
+
* The hub acts as an IPC client, connecting to the adapter's socket
|
|
58
|
+
* and calling the "deliver" method with the message as payload.
|
|
59
|
+
*/
|
|
60
|
+
deliverToAdapter(adapter: AdapterDescriptor, message: BrokerMessage): Promise<RouteResult>;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=adapter-registry%20(SFConflict%20mnott%202026-03-06-21-15-36).d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-registry (SFConflict mnott 2026-03-06-21-15-36).d.ts","sourceRoot":"","sources":["../../src/daemon/adapter-registry (SFConflict mnott 2026-03-06-21-15-36).ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,KAAK,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAExG,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,iBAAiB,CAAkC;IAE3D,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAInD,QAAQ,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAK7C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ9B,kBAAkB,CAAC,UAAU,GAAE,MAAe,GAAG,IAAI;IAMrD,iBAAiB,IAAI,IAAI;IAOzB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIzD,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;YAI5B,eAAe;YAKf,WAAW;IAoCzB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIhD,IAAI,IAAI,iBAAiB,EAAE;IAI3B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAwBvE;;;;;;;;;OASG;IACG,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IA8EzD;;;;;OAKG;IACG,gBAAgB,CACpB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,WAAW,CAAC;CAexB"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon/adapter-registry.ts — Registry of connected adapters + routing engine.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1: minimal adapter tracking and commandHandler dispatch.
|
|
5
|
+
* Phase 2: full BrokerMessage routing with hub -> adapter delivery via IPC.
|
|
6
|
+
*/
|
|
7
|
+
import { commandHandler } from "../core/state.js";
|
|
8
|
+
import { log } from "../core/log.js";
|
|
9
|
+
import { WatcherClient } from "../ipc/client.js";
|
|
10
|
+
import { createBrokerMessage } from "../types/broker.js";
|
|
11
|
+
import { validateAdapterHealth } from "../ipc/validate.js";
|
|
12
|
+
const HEALTH_TIMEOUT_MS = 5_000;
|
|
13
|
+
export class AdapterRegistry {
|
|
14
|
+
adapters = new Map();
|
|
15
|
+
lastHealth = new Map();
|
|
16
|
+
pollInterval = null;
|
|
17
|
+
hubCommandHandler = null;
|
|
18
|
+
setCommandHandler(handler) {
|
|
19
|
+
this.hubCommandHandler = handler;
|
|
20
|
+
}
|
|
21
|
+
register(descriptor) {
|
|
22
|
+
this.adapters.set(descriptor.name, descriptor);
|
|
23
|
+
log(`Adapter registered: ${descriptor.name} (socket: ${descriptor.socketPath})`);
|
|
24
|
+
}
|
|
25
|
+
unregister(name) {
|
|
26
|
+
this.adapters.delete(name);
|
|
27
|
+
this.lastHealth.delete(name);
|
|
28
|
+
log(`Adapter unregistered: ${name}`);
|
|
29
|
+
}
|
|
30
|
+
// ── Health Polling ──
|
|
31
|
+
startHealthPolling(intervalMs = 60_000) {
|
|
32
|
+
if (this.pollInterval !== null)
|
|
33
|
+
return;
|
|
34
|
+
log(`[hub] health polling started (interval: ${intervalMs}ms)`);
|
|
35
|
+
this.pollInterval = setInterval(() => { void this.pollAllAdapters(); }, intervalMs);
|
|
36
|
+
}
|
|
37
|
+
stopHealthPolling() {
|
|
38
|
+
if (this.pollInterval === null)
|
|
39
|
+
return;
|
|
40
|
+
clearInterval(this.pollInterval);
|
|
41
|
+
this.pollInterval = null;
|
|
42
|
+
log(`[hub] health polling stopped`);
|
|
43
|
+
}
|
|
44
|
+
getAdapterHealth(name) {
|
|
45
|
+
return this.lastHealth.get(name);
|
|
46
|
+
}
|
|
47
|
+
getAllHealth() {
|
|
48
|
+
return new Map(this.lastHealth);
|
|
49
|
+
}
|
|
50
|
+
async pollAllAdapters() {
|
|
51
|
+
const adapters = this.list();
|
|
52
|
+
await Promise.all(adapters.map(a => this.pollAdapter(a)));
|
|
53
|
+
}
|
|
54
|
+
async pollAdapter(adapter) {
|
|
55
|
+
const previous = this.lastHealth.get(adapter.name);
|
|
56
|
+
let health;
|
|
57
|
+
try {
|
|
58
|
+
const client = new WatcherClient(adapter.socketPath);
|
|
59
|
+
const result = await Promise.race([
|
|
60
|
+
client.call_raw("health", {}),
|
|
61
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("health poll timed out")), HEALTH_TIMEOUT_MS)),
|
|
62
|
+
]);
|
|
63
|
+
health = validateAdapterHealth(result);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
67
|
+
health = {
|
|
68
|
+
status: "down",
|
|
69
|
+
connectionStatus: "disconnected",
|
|
70
|
+
stats: { messagesReceived: 0, messagesSent: 0, errors: 0 },
|
|
71
|
+
lastMessageAgo: null,
|
|
72
|
+
detail: msg,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
this.lastHealth.set(adapter.name, health);
|
|
76
|
+
// Log on status change
|
|
77
|
+
if (previous === undefined || previous.status !== health.status) {
|
|
78
|
+
if (health.status === "ok") {
|
|
79
|
+
log(`[hub] adapter ${adapter.name} health: ok`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
log(`[hub] WARNING: adapter ${adapter.name} health: ${health.status}${health.detail ? ` — ${health.detail}` : ""}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
get(name) {
|
|
87
|
+
return this.adapters.get(name);
|
|
88
|
+
}
|
|
89
|
+
list() {
|
|
90
|
+
return [...this.adapters.values()];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Dispatch an incoming message from an adapter source through the
|
|
94
|
+
* BrokerMessage routing pipeline.
|
|
95
|
+
*
|
|
96
|
+
* Phase 1 called commandHandler directly. Phase 3 creates a proper
|
|
97
|
+
* BrokerMessage and routes it so PAILot messages flow through the
|
|
98
|
+
* same adapter pipeline as everything else (PAILot -> hub -> Whazaa).
|
|
99
|
+
*
|
|
100
|
+
* Falls back to commandHandler if no adapters are registered (embedded-like).
|
|
101
|
+
*/
|
|
102
|
+
dispatchIncoming(source, text, timestamp) {
|
|
103
|
+
log(`[hub] incoming from ${source}: ${text.slice(0, 80)}`);
|
|
104
|
+
const type = text.trim().startsWith("/") ? "command" : "text";
|
|
105
|
+
const message = createBrokerMessage(source, type, { text }, undefined);
|
|
106
|
+
message.timestamp = timestamp;
|
|
107
|
+
// Route through the standard pipeline
|
|
108
|
+
void this.route(message).then((result) => {
|
|
109
|
+
if (!result.ok) {
|
|
110
|
+
// Fallback: if routing failed (e.g. no adapters registered),
|
|
111
|
+
// try the local commandHandler for backward compatibility
|
|
112
|
+
log(`[hub] route failed (${result.error}), falling back to commandHandler`);
|
|
113
|
+
if (commandHandler) {
|
|
114
|
+
void commandHandler(text, timestamp);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
log(`[hub] no command handler and no adapters — message dropped`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// ── Phase 2: BrokerMessage Routing ──
|
|
123
|
+
/**
|
|
124
|
+
* Route a BrokerMessage to the appropriate adapter.
|
|
125
|
+
*
|
|
126
|
+
* Routing logic:
|
|
127
|
+
* 1. If target is specified and adapter is registered -> deliver to that adapter
|
|
128
|
+
* 2. If target is specified but not registered -> error
|
|
129
|
+
* 3. If target is omitted and type is "command" -> run through commandHandler
|
|
130
|
+
* 4. If target is omitted -> deliver to first registered messaging adapter
|
|
131
|
+
* 5. If no adapters registered -> error
|
|
132
|
+
*/
|
|
133
|
+
async route(message) {
|
|
134
|
+
log(`[hub] route: ${message.type} from=${message.source} target=${message.target ?? "(default)"} text=${(message.payload.text ?? "").slice(0, 60)}`);
|
|
135
|
+
// Explicit target
|
|
136
|
+
if (message.target) {
|
|
137
|
+
const adapter = this.adapters.get(message.target);
|
|
138
|
+
if (!adapter) {
|
|
139
|
+
return { ok: false, error: `Target adapter '${message.target}' is not registered` };
|
|
140
|
+
}
|
|
141
|
+
return this.deliverToAdapter(adapter, message);
|
|
142
|
+
}
|
|
143
|
+
// Commands and text messages with no explicit target -> hub command handler
|
|
144
|
+
// Text messages from adapters are user input that needs to reach iTerm2/API sessions.
|
|
145
|
+
if (message.type === "command" || message.type === "text") {
|
|
146
|
+
const handler = this.hubCommandHandler;
|
|
147
|
+
if (handler) {
|
|
148
|
+
const sourceAdapter = this.adapters.get(message.source);
|
|
149
|
+
const ctx = {
|
|
150
|
+
reply: async (text) => {
|
|
151
|
+
if (sourceAdapter) {
|
|
152
|
+
const replyMsg = createBrokerMessage("hub", "text", {
|
|
153
|
+
text,
|
|
154
|
+
recipient: message.payload.recipient,
|
|
155
|
+
});
|
|
156
|
+
await this.deliverToAdapter(sourceAdapter, replyMsg);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
log(`[hub] no adapter for reply to ${message.source}`);
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
replyImage: async (buffer, caption) => {
|
|
163
|
+
if (sourceAdapter) {
|
|
164
|
+
const replyMsg = createBrokerMessage("hub", "image", {
|
|
165
|
+
text: caption,
|
|
166
|
+
buffer: buffer.toString("base64"),
|
|
167
|
+
recipient: message.payload.recipient,
|
|
168
|
+
});
|
|
169
|
+
await this.deliverToAdapter(sourceAdapter, replyMsg);
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
replyVoice: async (audioBuffer, caption) => {
|
|
173
|
+
if (sourceAdapter) {
|
|
174
|
+
const replyMsg = createBrokerMessage("hub", "voice", {
|
|
175
|
+
buffer: audioBuffer.toString("base64"),
|
|
176
|
+
text: caption,
|
|
177
|
+
recipient: message.payload.recipient,
|
|
178
|
+
});
|
|
179
|
+
await this.deliverToAdapter(sourceAdapter, replyMsg);
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
source: message.source,
|
|
183
|
+
recipient: message.payload.recipient,
|
|
184
|
+
};
|
|
185
|
+
await handler(message.payload.text ?? "", message.timestamp, ctx);
|
|
186
|
+
return { ok: true, deliveredTo: "hub" };
|
|
187
|
+
}
|
|
188
|
+
// Fallback to old-style commandHandler
|
|
189
|
+
if (commandHandler) {
|
|
190
|
+
await commandHandler(message.payload.text ?? "", message.timestamp);
|
|
191
|
+
return { ok: true, deliveredTo: "hub" };
|
|
192
|
+
}
|
|
193
|
+
return { ok: false, error: "No command handler registered on the hub" };
|
|
194
|
+
}
|
|
195
|
+
// Default routing: first registered adapter that is NOT the source
|
|
196
|
+
const candidates = this.list().filter(a => a.name !== message.source);
|
|
197
|
+
if (candidates.length === 0) {
|
|
198
|
+
// Fall back to any adapter (including source, for self-chat scenarios)
|
|
199
|
+
const any = this.list();
|
|
200
|
+
if (any.length === 0) {
|
|
201
|
+
return { ok: false, error: "No adapters registered — cannot route message" };
|
|
202
|
+
}
|
|
203
|
+
return this.deliverToAdapter(any[0], message);
|
|
204
|
+
}
|
|
205
|
+
return this.deliverToAdapter(candidates[0], message);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Deliver a BrokerMessage to an adapter via its IPC socket.
|
|
209
|
+
*
|
|
210
|
+
* The hub acts as an IPC client, connecting to the adapter's socket
|
|
211
|
+
* and calling the "deliver" method with the message as payload.
|
|
212
|
+
*/
|
|
213
|
+
async deliverToAdapter(adapter, message) {
|
|
214
|
+
log(`[hub] delivering to ${adapter.name} via ${adapter.socketPath}`);
|
|
215
|
+
const client = new WatcherClient(adapter.socketPath);
|
|
216
|
+
try {
|
|
217
|
+
const result = await client.call_raw("deliver", {
|
|
218
|
+
message: message,
|
|
219
|
+
});
|
|
220
|
+
return { ok: true, deliveredTo: adapter.name, adapterResult: result };
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
224
|
+
log(`[hub] delivery to ${adapter.name} failed: ${msg}`);
|
|
225
|
+
return { ok: false, error: `Delivery to ${adapter.name} failed: ${msg}` };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=adapter-registry%20(SFConflict%20mnott%202026-03-06-21-15-36).js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-registry (SFConflict mnott 2026-03-06-21-15-36).js","sourceRoot":"","sources":["../../src/daemon/adapter-registry (SFConflict mnott 2026-03-06-21-15-36).ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon/adapter-registry.ts — Registry of connected adapters + routing engine.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1: minimal adapter tracking and commandHandler dispatch.
|
|
5
|
+
* Phase 2: full BrokerMessage routing with hub -> adapter delivery via IPC.
|
|
6
|
+
*/
|
|
7
|
+
import type { BrokerMessage, RouteResult } from "../types/broker.js";
|
|
8
|
+
import type { AdapterHealth } from "../types/adapter.js";
|
|
9
|
+
import type { CommandContext } from "./command-context.js";
|
|
10
|
+
export interface AdapterDescriptor {
|
|
11
|
+
name: string;
|
|
12
|
+
socketPath: string;
|
|
13
|
+
registeredAt: number;
|
|
14
|
+
}
|
|
15
|
+
type HubCommandHandler = (text: string, timestamp: number, ctx: CommandContext) => void | Promise<void>;
|
|
16
|
+
export declare class AdapterRegistry {
|
|
17
|
+
private readonly adapters;
|
|
18
|
+
private readonly lastHealth;
|
|
19
|
+
private pollInterval;
|
|
20
|
+
private hubCommandHandler;
|
|
21
|
+
setCommandHandler(handler: HubCommandHandler): void;
|
|
22
|
+
register(descriptor: AdapterDescriptor): void;
|
|
23
|
+
unregister(name: string): void;
|
|
24
|
+
startHealthPolling(intervalMs?: number): void;
|
|
25
|
+
stopHealthPolling(): void;
|
|
26
|
+
getAdapterHealth(name: string): AdapterHealth | undefined;
|
|
27
|
+
getAllHealth(): Map<string, AdapterHealth>;
|
|
28
|
+
private pollAllAdapters;
|
|
29
|
+
private pollAdapter;
|
|
30
|
+
get(name: string): AdapterDescriptor | undefined;
|
|
31
|
+
list(): AdapterDescriptor[];
|
|
32
|
+
/**
|
|
33
|
+
* Dispatch an incoming message from an adapter source through the
|
|
34
|
+
* BrokerMessage routing pipeline.
|
|
35
|
+
*
|
|
36
|
+
* Phase 1 called commandHandler directly. Phase 3 creates a proper
|
|
37
|
+
* BrokerMessage and routes it so PAILot messages flow through the
|
|
38
|
+
* same adapter pipeline as everything else (PAILot -> hub -> Whazaa).
|
|
39
|
+
*
|
|
40
|
+
* Falls back to commandHandler if no adapters are registered (embedded-like).
|
|
41
|
+
*/
|
|
42
|
+
dispatchIncoming(source: string, text: string, timestamp: number): void;
|
|
43
|
+
/**
|
|
44
|
+
* Route a BrokerMessage to the appropriate adapter.
|
|
45
|
+
*
|
|
46
|
+
* Routing logic:
|
|
47
|
+
* 1. If target is specified and adapter is registered -> deliver to that adapter
|
|
48
|
+
* 2. If target is specified but not registered -> error
|
|
49
|
+
* 3. If target is omitted and type is "command" -> run through commandHandler
|
|
50
|
+
* 4. If target is omitted -> deliver to first registered messaging adapter
|
|
51
|
+
* 5. If no adapters registered -> error
|
|
52
|
+
*/
|
|
53
|
+
route(message: BrokerMessage): Promise<RouteResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Deliver a BrokerMessage to an adapter via its IPC socket.
|
|
56
|
+
*
|
|
57
|
+
* The hub acts as an IPC client, connecting to the adapter's socket
|
|
58
|
+
* and calling the "deliver" method with the message as payload.
|
|
59
|
+
*/
|
|
60
|
+
deliverToAdapter(adapter: AdapterDescriptor, message: BrokerMessage): Promise<RouteResult>;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=adapter-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-registry.d.ts","sourceRoot":"","sources":["../../src/daemon/adapter-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,KAAK,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAExG,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,iBAAiB,CAAkC;IAE3D,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAInD,QAAQ,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAK7C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ9B,kBAAkB,CAAC,UAAU,GAAE,MAAe,GAAG,IAAI;IAMrD,iBAAiB,IAAI,IAAI;IAOzB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIzD,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;YAI5B,eAAe;YAKf,WAAW;IAoCzB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIhD,IAAI,IAAI,iBAAiB,EAAE;IAI3B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAwBvE;;;;;;;;;OASG;IACG,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IAqFzD;;;;;OAKG;IACG,gBAAgB,CACpB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,WAAW,CAAC;CAexB"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon/adapter-registry.ts — Registry of connected adapters + routing engine.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1: minimal adapter tracking and commandHandler dispatch.
|
|
5
|
+
* Phase 2: full BrokerMessage routing with hub -> adapter delivery via IPC.
|
|
6
|
+
*/
|
|
7
|
+
import { commandHandler } from "../core/state.js";
|
|
8
|
+
import { log } from "../core/log.js";
|
|
9
|
+
import { WatcherClient } from "../ipc/client.js";
|
|
10
|
+
import { createBrokerMessage } from "../types/broker.js";
|
|
11
|
+
import { validateAdapterHealth } from "../ipc/validate.js";
|
|
12
|
+
import { broadcastText, broadcastImage, broadcastVoice } from "../adapters/pailot/gateway.js";
|
|
13
|
+
const HEALTH_TIMEOUT_MS = 5_000;
|
|
14
|
+
export class AdapterRegistry {
|
|
15
|
+
adapters = new Map();
|
|
16
|
+
lastHealth = new Map();
|
|
17
|
+
pollInterval = null;
|
|
18
|
+
hubCommandHandler = null;
|
|
19
|
+
setCommandHandler(handler) {
|
|
20
|
+
this.hubCommandHandler = handler;
|
|
21
|
+
}
|
|
22
|
+
register(descriptor) {
|
|
23
|
+
this.adapters.set(descriptor.name, descriptor);
|
|
24
|
+
log(`Adapter registered: ${descriptor.name} (socket: ${descriptor.socketPath})`);
|
|
25
|
+
}
|
|
26
|
+
unregister(name) {
|
|
27
|
+
this.adapters.delete(name);
|
|
28
|
+
this.lastHealth.delete(name);
|
|
29
|
+
log(`Adapter unregistered: ${name}`);
|
|
30
|
+
}
|
|
31
|
+
// ── Health Polling ──
|
|
32
|
+
startHealthPolling(intervalMs = 60_000) {
|
|
33
|
+
if (this.pollInterval !== null)
|
|
34
|
+
return;
|
|
35
|
+
log(`[hub] health polling started (interval: ${intervalMs}ms)`);
|
|
36
|
+
this.pollInterval = setInterval(() => { void this.pollAllAdapters(); }, intervalMs);
|
|
37
|
+
}
|
|
38
|
+
stopHealthPolling() {
|
|
39
|
+
if (this.pollInterval === null)
|
|
40
|
+
return;
|
|
41
|
+
clearInterval(this.pollInterval);
|
|
42
|
+
this.pollInterval = null;
|
|
43
|
+
log(`[hub] health polling stopped`);
|
|
44
|
+
}
|
|
45
|
+
getAdapterHealth(name) {
|
|
46
|
+
return this.lastHealth.get(name);
|
|
47
|
+
}
|
|
48
|
+
getAllHealth() {
|
|
49
|
+
return new Map(this.lastHealth);
|
|
50
|
+
}
|
|
51
|
+
async pollAllAdapters() {
|
|
52
|
+
const adapters = this.list();
|
|
53
|
+
await Promise.all(adapters.map(a => this.pollAdapter(a)));
|
|
54
|
+
}
|
|
55
|
+
async pollAdapter(adapter) {
|
|
56
|
+
const previous = this.lastHealth.get(adapter.name);
|
|
57
|
+
let health;
|
|
58
|
+
try {
|
|
59
|
+
const client = new WatcherClient(adapter.socketPath);
|
|
60
|
+
const result = await Promise.race([
|
|
61
|
+
client.call_raw("health", {}),
|
|
62
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("health poll timed out")), HEALTH_TIMEOUT_MS)),
|
|
63
|
+
]);
|
|
64
|
+
health = validateAdapterHealth(result);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
68
|
+
health = {
|
|
69
|
+
status: "down",
|
|
70
|
+
connectionStatus: "disconnected",
|
|
71
|
+
stats: { messagesReceived: 0, messagesSent: 0, errors: 0 },
|
|
72
|
+
lastMessageAgo: null,
|
|
73
|
+
detail: msg,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
this.lastHealth.set(adapter.name, health);
|
|
77
|
+
// Log on status change
|
|
78
|
+
if (previous === undefined || previous.status !== health.status) {
|
|
79
|
+
if (health.status === "ok") {
|
|
80
|
+
log(`[hub] adapter ${adapter.name} health: ok`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
log(`[hub] WARNING: adapter ${adapter.name} health: ${health.status}${health.detail ? ` — ${health.detail}` : ""}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
get(name) {
|
|
88
|
+
return this.adapters.get(name);
|
|
89
|
+
}
|
|
90
|
+
list() {
|
|
91
|
+
return [...this.adapters.values()];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Dispatch an incoming message from an adapter source through the
|
|
95
|
+
* BrokerMessage routing pipeline.
|
|
96
|
+
*
|
|
97
|
+
* Phase 1 called commandHandler directly. Phase 3 creates a proper
|
|
98
|
+
* BrokerMessage and routes it so PAILot messages flow through the
|
|
99
|
+
* same adapter pipeline as everything else (PAILot -> hub -> Whazaa).
|
|
100
|
+
*
|
|
101
|
+
* Falls back to commandHandler if no adapters are registered (embedded-like).
|
|
102
|
+
*/
|
|
103
|
+
dispatchIncoming(source, text, timestamp) {
|
|
104
|
+
log(`[hub] incoming from ${source}: ${text.slice(0, 80)}`);
|
|
105
|
+
const type = text.trim().startsWith("/") ? "command" : "text";
|
|
106
|
+
const message = createBrokerMessage(source, type, { text }, undefined);
|
|
107
|
+
message.timestamp = timestamp;
|
|
108
|
+
// Route through the standard pipeline
|
|
109
|
+
void this.route(message).then((result) => {
|
|
110
|
+
if (!result.ok) {
|
|
111
|
+
// Fallback: if routing failed (e.g. no adapters registered),
|
|
112
|
+
// try the local commandHandler for backward compatibility
|
|
113
|
+
log(`[hub] route failed (${result.error}), falling back to commandHandler`);
|
|
114
|
+
if (commandHandler) {
|
|
115
|
+
void commandHandler(text, timestamp);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
log(`[hub] no command handler and no adapters — message dropped`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// ── Phase 2: BrokerMessage Routing ──
|
|
124
|
+
/**
|
|
125
|
+
* Route a BrokerMessage to the appropriate adapter.
|
|
126
|
+
*
|
|
127
|
+
* Routing logic:
|
|
128
|
+
* 1. If target is specified and adapter is registered -> deliver to that adapter
|
|
129
|
+
* 2. If target is specified but not registered -> error
|
|
130
|
+
* 3. If target is omitted and type is "command" -> run through commandHandler
|
|
131
|
+
* 4. If target is omitted -> deliver to first registered messaging adapter
|
|
132
|
+
* 5. If no adapters registered -> error
|
|
133
|
+
*/
|
|
134
|
+
async route(message) {
|
|
135
|
+
log(`[hub] route: ${message.type} from=${message.source} target=${message.target ?? "(default)"} text=${(message.payload.text ?? "").slice(0, 60)}`);
|
|
136
|
+
// Explicit target
|
|
137
|
+
if (message.target) {
|
|
138
|
+
const adapter = this.adapters.get(message.target);
|
|
139
|
+
if (!adapter) {
|
|
140
|
+
return { ok: false, error: `Target adapter '${message.target}' is not registered` };
|
|
141
|
+
}
|
|
142
|
+
return this.deliverToAdapter(adapter, message);
|
|
143
|
+
}
|
|
144
|
+
// Commands and text messages with no explicit target -> hub command handler
|
|
145
|
+
// Text messages from adapters are user input that needs to reach iTerm2/API sessions.
|
|
146
|
+
if (message.type === "command" || message.type === "text") {
|
|
147
|
+
const handler = this.hubCommandHandler;
|
|
148
|
+
if (handler) {
|
|
149
|
+
const sourceAdapter = this.adapters.get(message.source);
|
|
150
|
+
const isPailot = message.source === "pailot";
|
|
151
|
+
const ctx = {
|
|
152
|
+
reply: async (text) => {
|
|
153
|
+
if (isPailot) {
|
|
154
|
+
broadcastText(text);
|
|
155
|
+
}
|
|
156
|
+
else if (sourceAdapter) {
|
|
157
|
+
const replyMsg = createBrokerMessage("hub", "text", {
|
|
158
|
+
text,
|
|
159
|
+
recipient: message.payload.recipient,
|
|
160
|
+
});
|
|
161
|
+
await this.deliverToAdapter(sourceAdapter, replyMsg);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
log(`[hub] no adapter for reply to ${message.source}`);
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
replyImage: async (buffer, caption) => {
|
|
168
|
+
if (isPailot) {
|
|
169
|
+
broadcastImage(buffer, caption);
|
|
170
|
+
}
|
|
171
|
+
else if (sourceAdapter) {
|
|
172
|
+
const replyMsg = createBrokerMessage("hub", "image", {
|
|
173
|
+
text: caption,
|
|
174
|
+
buffer: buffer.toString("base64"),
|
|
175
|
+
recipient: message.payload.recipient,
|
|
176
|
+
});
|
|
177
|
+
await this.deliverToAdapter(sourceAdapter, replyMsg);
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
replyVoice: async (audioBuffer, caption) => {
|
|
181
|
+
if (isPailot) {
|
|
182
|
+
broadcastVoice(audioBuffer, caption);
|
|
183
|
+
}
|
|
184
|
+
else if (sourceAdapter) {
|
|
185
|
+
const replyMsg = createBrokerMessage("hub", "voice", {
|
|
186
|
+
buffer: audioBuffer.toString("base64"),
|
|
187
|
+
text: caption,
|
|
188
|
+
recipient: message.payload.recipient,
|
|
189
|
+
});
|
|
190
|
+
await this.deliverToAdapter(sourceAdapter, replyMsg);
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
source: message.source,
|
|
194
|
+
recipient: message.payload.recipient,
|
|
195
|
+
};
|
|
196
|
+
await handler(message.payload.text ?? "", message.timestamp, ctx);
|
|
197
|
+
return { ok: true, deliveredTo: "hub" };
|
|
198
|
+
}
|
|
199
|
+
// Fallback to old-style commandHandler
|
|
200
|
+
if (commandHandler) {
|
|
201
|
+
await commandHandler(message.payload.text ?? "", message.timestamp);
|
|
202
|
+
return { ok: true, deliveredTo: "hub" };
|
|
203
|
+
}
|
|
204
|
+
return { ok: false, error: "No command handler registered on the hub" };
|
|
205
|
+
}
|
|
206
|
+
// Default routing: first registered adapter that is NOT the source
|
|
207
|
+
const candidates = this.list().filter(a => a.name !== message.source);
|
|
208
|
+
if (candidates.length === 0) {
|
|
209
|
+
// Fall back to any adapter (including source, for self-chat scenarios)
|
|
210
|
+
const any = this.list();
|
|
211
|
+
if (any.length === 0) {
|
|
212
|
+
return { ok: false, error: "No adapters registered — cannot route message" };
|
|
213
|
+
}
|
|
214
|
+
return this.deliverToAdapter(any[0], message);
|
|
215
|
+
}
|
|
216
|
+
return this.deliverToAdapter(candidates[0], message);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Deliver a BrokerMessage to an adapter via its IPC socket.
|
|
220
|
+
*
|
|
221
|
+
* The hub acts as an IPC client, connecting to the adapter's socket
|
|
222
|
+
* and calling the "deliver" method with the message as payload.
|
|
223
|
+
*/
|
|
224
|
+
async deliverToAdapter(adapter, message) {
|
|
225
|
+
log(`[hub] delivering to ${adapter.name} via ${adapter.socketPath}`);
|
|
226
|
+
const client = new WatcherClient(adapter.socketPath);
|
|
227
|
+
try {
|
|
228
|
+
const result = await client.call_raw("deliver", {
|
|
229
|
+
message: message,
|
|
230
|
+
});
|
|
231
|
+
return { ok: true, deliveredTo: adapter.name, adapterResult: result };
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
235
|
+
log(`[hub] delivery to ${adapter.name} failed: ${msg}`);
|
|
236
|
+
return { ok: false, error: `Delivery to ${adapter.name} failed: ${msg}` };
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=adapter-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-registry.js","sourceRoot":"","sources":["../../src/daemon/adapter-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* daemon/cli.ts — CLI for the aibroker daemon.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* aibroker start Start the daemon
|
|
7
|
+
* aibroker start --socket /tmp/aibroker.sock
|
|
8
|
+
* aibroker status Query daemon status
|
|
9
|
+
* aibroker stop Send SIGTERM to daemon
|
|
10
|
+
* aibroker create-adapter <name> [--display-name <Name>] [--output <dir>]
|
|
11
|
+
* Scaffold a new adapter from the built-in template
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/daemon/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|