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.
Files changed (170) hide show
  1. package/README.md +164 -4
  2. package/dist/adapters/iterm/core.d.ts +2 -0
  3. package/dist/adapters/iterm/core.d.ts.map +1 -1
  4. package/dist/adapters/iterm/core.js +13 -5
  5. package/dist/adapters/iterm/core.js.map +1 -1
  6. package/dist/adapters/iterm/iterm2-api.d.ts +20 -0
  7. package/dist/adapters/iterm/iterm2-api.d.ts.map +1 -0
  8. package/dist/adapters/iterm/iterm2-api.js +244 -0
  9. package/dist/adapters/iterm/iterm2-api.js.map +1 -0
  10. package/dist/adapters/iterm/sessions.d.ts.map +1 -1
  11. package/dist/adapters/iterm/sessions.js +3 -2
  12. package/dist/adapters/iterm/sessions.js.map +1 -1
  13. package/dist/adapters/kokoro/media.d.ts +2 -1
  14. package/dist/adapters/kokoro/media.d.ts.map +1 -1
  15. package/dist/adapters/kokoro/media.js +53 -5
  16. package/dist/adapters/kokoro/media.js.map +1 -1
  17. package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-13-56).d.ts +49 -0
  18. package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-13-56).d.ts.map +1 -0
  19. package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-13-56).js +632 -0
  20. package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-13-56).js.map +1 -0
  21. package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-13-59).js +632 -0
  22. package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-15-36).d.ts +49 -0
  23. package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-15-36).d.ts.map +1 -0
  24. package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-15-36).js +614 -0
  25. package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-15-36).js.map +1 -0
  26. package/dist/adapters/pailot/gateway (SFConflict mnott 2026-03-06-21-15-46).js +614 -0
  27. package/dist/adapters/pailot/gateway.d.ts +48 -0
  28. package/dist/adapters/pailot/gateway.d.ts (SFConflict mnott 2026-03-06-21-13-59).map +1 -0
  29. package/dist/adapters/pailot/gateway.d.ts (SFConflict mnott 2026-03-06-21-15-46).map +1 -0
  30. package/dist/adapters/pailot/gateway.d.ts.map +1 -0
  31. package/dist/adapters/pailot/gateway.js +828 -0
  32. package/dist/adapters/pailot/gateway.js (SFConflict mnott 2026-03-06-21-13-59).map +1 -0
  33. package/dist/adapters/pailot/gateway.js (SFConflict mnott 2026-03-06-21-15-46).map +1 -0
  34. package/dist/adapters/pailot/gateway.js.map +1 -0
  35. package/dist/backend/api.d.ts +5 -1
  36. package/dist/backend/api.d.ts.map +1 -1
  37. package/dist/backend/api.js +74 -3
  38. package/dist/backend/api.js.map +1 -1
  39. package/dist/core/hybrid.d.ts +7 -0
  40. package/dist/core/hybrid.d.ts.map +1 -1
  41. package/dist/core/hybrid.js +33 -0
  42. package/dist/core/hybrid.js.map +1 -1
  43. package/dist/core/state.d.ts +3 -0
  44. package/dist/core/state.d.ts.map +1 -1
  45. package/dist/core/state.js +4 -0
  46. package/dist/core/state.js.map +1 -1
  47. package/dist/core/status-cache.d.ts +51 -0
  48. package/dist/core/status-cache.d.ts.map +1 -0
  49. package/dist/core/status-cache.js +62 -0
  50. package/dist/core/status-cache.js.map +1 -0
  51. package/dist/daemon/adapter-registry (SFConflict mnott 2026-03-06-21-15-36).d.ts +63 -0
  52. package/dist/daemon/adapter-registry (SFConflict mnott 2026-03-06-21-15-36).d.ts.map +1 -0
  53. package/dist/daemon/adapter-registry (SFConflict mnott 2026-03-06-21-15-36).js +229 -0
  54. package/dist/daemon/adapter-registry (SFConflict mnott 2026-03-06-21-15-36).js.map +1 -0
  55. package/dist/daemon/adapter-registry.d.ts +63 -0
  56. package/dist/daemon/adapter-registry.d.ts.map +1 -0
  57. package/dist/daemon/adapter-registry.js +240 -0
  58. package/dist/daemon/adapter-registry.js.map +1 -0
  59. package/dist/daemon/cli.d.ts +14 -0
  60. package/dist/daemon/cli.d.ts.map +1 -0
  61. package/dist/daemon/cli.js +150 -0
  62. package/dist/daemon/cli.js.map +1 -0
  63. package/dist/daemon/command-context.d.ts +24 -0
  64. package/dist/daemon/command-context.d.ts.map +1 -0
  65. package/dist/daemon/command-context.js +13 -0
  66. package/dist/daemon/command-context.js.map +1 -0
  67. package/dist/daemon/commands.d.ts +22 -0
  68. package/dist/daemon/commands.d.ts.map +1 -0
  69. package/dist/daemon/commands.js +632 -0
  70. package/dist/daemon/commands.js.map +1 -0
  71. package/dist/daemon/core-handlers.d.ts +24 -0
  72. package/dist/daemon/core-handlers.d.ts.map +1 -0
  73. package/dist/daemon/core-handlers.js +640 -0
  74. package/dist/daemon/core-handlers.js.map +1 -0
  75. package/dist/daemon/create-adapter.d.ts +22 -0
  76. package/dist/daemon/create-adapter.d.ts.map +1 -0
  77. package/dist/daemon/create-adapter.js +153 -0
  78. package/dist/daemon/create-adapter.js.map +1 -0
  79. package/dist/daemon/image-gen.d.ts +28 -0
  80. package/dist/daemon/image-gen.d.ts.map +1 -0
  81. package/dist/daemon/image-gen.js +97 -0
  82. package/dist/daemon/image-gen.js.map +1 -0
  83. package/dist/daemon/index.d.ts +12 -0
  84. package/dist/daemon/index.d.ts.map +1 -0
  85. package/dist/daemon/index.js +184 -0
  86. package/dist/daemon/index.js.map +1 -0
  87. package/dist/daemon/pai-projects.d.ts +68 -0
  88. package/dist/daemon/pai-projects.d.ts.map +1 -0
  89. package/dist/daemon/pai-projects.js +174 -0
  90. package/dist/daemon/pai-projects.js.map +1 -0
  91. package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-13-56).d.ts +12 -0
  92. package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-13-56).d.ts.map +1 -0
  93. package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-13-56).js +252 -0
  94. package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-13-56).js.map +1 -0
  95. package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-13-59).js +252 -0
  96. package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-15-36).d.ts +12 -0
  97. package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-15-36).d.ts.map +1 -0
  98. package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-15-36).js +240 -0
  99. package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-15-36).js.map +1 -0
  100. package/dist/daemon/screenshot (SFConflict mnott 2026-03-06-21-15-46).js +240 -0
  101. package/dist/daemon/screenshot.d.ts +12 -0
  102. package/dist/daemon/screenshot.d.ts (SFConflict mnott 2026-03-06-21-13-59).map +1 -0
  103. package/dist/daemon/screenshot.d.ts (SFConflict mnott 2026-03-06-21-15-46).map +1 -0
  104. package/dist/daemon/screenshot.d.ts.map +1 -0
  105. package/dist/daemon/screenshot.js +252 -0
  106. package/dist/daemon/screenshot.js (SFConflict mnott 2026-03-06-21-13-59).map +1 -0
  107. package/dist/daemon/screenshot.js (SFConflict mnott 2026-03-06-21-15-46).map +1 -0
  108. package/dist/daemon/screenshot.js.map +1 -0
  109. package/dist/daemon/session-content.d.ts +27 -0
  110. package/dist/daemon/session-content.d.ts.map +1 -0
  111. package/dist/daemon/session-content.js +76 -0
  112. package/dist/daemon/session-content.js.map +1 -0
  113. package/dist/daemon/vision.d.ts +46 -0
  114. package/dist/daemon/vision.d.ts.map +1 -0
  115. package/dist/daemon/vision.js +176 -0
  116. package/dist/daemon/vision.js.map +1 -0
  117. package/dist/index.d.ts +16 -2
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +12 -1
  120. package/dist/index.js.map +1 -1
  121. package/dist/ipc/client.d.ts +4 -1
  122. package/dist/ipc/client.d.ts.map +1 -1
  123. package/dist/ipc/client.js +10 -1
  124. package/dist/ipc/client.js.map +1 -1
  125. package/dist/ipc/validate.d.ts +52 -0
  126. package/dist/ipc/validate.d.ts.map +1 -0
  127. package/dist/ipc/validate.js +129 -0
  128. package/dist/ipc/validate.js.map +1 -0
  129. package/dist/mcp/index (SFConflict mnott 2026-03-06-21-13-56).d.ts +23 -0
  130. package/dist/mcp/index (SFConflict mnott 2026-03-06-21-13-56).d.ts.map +1 -0
  131. package/dist/mcp/index (SFConflict mnott 2026-03-06-21-13-56).js +595 -0
  132. package/dist/mcp/index (SFConflict mnott 2026-03-06-21-13-56).js.map +1 -0
  133. package/dist/mcp/index (SFConflict mnott 2026-03-06-21-13-59).js +595 -0
  134. package/dist/mcp/index (SFConflict mnott 2026-03-06-21-15-36).d.ts +23 -0
  135. package/dist/mcp/index (SFConflict mnott 2026-03-06-21-15-36).d.ts.map +1 -0
  136. package/dist/mcp/index (SFConflict mnott 2026-03-06-21-15-36).js +592 -0
  137. package/dist/mcp/index (SFConflict mnott 2026-03-06-21-15-36).js.map +1 -0
  138. package/dist/mcp/index (SFConflict mnott 2026-03-06-21-15-46).js +592 -0
  139. package/dist/mcp/index.d.ts +23 -0
  140. package/dist/mcp/index.d.ts.map +1 -0
  141. package/dist/mcp/index.js +660 -0
  142. package/dist/mcp/index.js (SFConflict mnott 2026-03-06-21-13-59).map +1 -0
  143. package/dist/mcp/index.js (SFConflict mnott 2026-03-06-21-15-46).map +1 -0
  144. package/dist/mcp/index.js.map +1 -0
  145. package/dist/types/adapter.d.ts +41 -0
  146. package/dist/types/adapter.d.ts.map +1 -0
  147. package/dist/types/adapter.js +2 -0
  148. package/dist/types/adapter.js.map +1 -0
  149. package/dist/types/backend.d.ts +29 -1
  150. package/dist/types/backend.d.ts.map +1 -1
  151. package/dist/types/broker.d.ts +47 -0
  152. package/dist/types/broker.d.ts.map +1 -0
  153. package/dist/types/broker.js +21 -0
  154. package/dist/types/broker.js.map +1 -0
  155. package/dist/types/index.d.ts +2 -0
  156. package/dist/types/index.d.ts.map +1 -1
  157. package/dist/types/index.js +2 -0
  158. package/dist/types/index.js.map +1 -1
  159. package/package.json +12 -2
  160. package/templates/adapter/ONBOARDING_PROMPT.md +309 -0
  161. package/templates/adapter/README.md.tmpl +81 -0
  162. package/templates/adapter/package.json.tmpl +23 -0
  163. package/templates/adapter/src/watcher/cli.ts.tmpl +12 -0
  164. package/templates/adapter/src/watcher/commands.ts.tmpl +44 -0
  165. package/templates/adapter/src/watcher/connection.ts.tmpl +59 -0
  166. package/templates/adapter/src/watcher/index.ts.tmpl +201 -0
  167. package/templates/adapter/src/watcher/ipc-server.ts.tmpl +250 -0
  168. package/templates/adapter/src/watcher/send.ts.tmpl +62 -0
  169. package/templates/adapter/src/watcher/state.ts.tmpl +39 -0
  170. 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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAQ9F,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAIhC,MAAM,OAAO,eAAe;IACT,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAChD,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IACvD,YAAY,GAA0C,IAAI,CAAC;IAC3D,iBAAiB,GAA6B,IAAI,CAAC;IAE3D,iBAAiB,CAAC,OAA0B;QAC1C,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;IACnC,CAAC;IAED,QAAQ,CAAC,UAA6B;QACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/C,GAAG,CAAC,uBAAuB,UAAU,CAAC,IAAI,aAAa,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC;IACnF,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,uBAAuB;IAEvB,kBAAkB,CAAC,aAAqB,MAAM;QAC5C,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;YAAE,OAAO;QACvC,GAAG,CAAC,2CAA2C,UAAU,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACtF,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;YAAE,OAAO;QACvC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,GAAG,CAAC,8BAA8B,CAAC,CAAC;IACtC,CAAC;IAED,gBAAgB,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,YAAY;QACV,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,OAA0B;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,MAAqB,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBAChC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC7B,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAChF;aACF,CAAC,CAAC;YACH,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,GAAG;gBACP,MAAM,EAAE,MAAM;gBACd,gBAAgB,EAAE,cAAc;gBAChC,KAAK,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;gBAC1D,cAAc,EAAE,IAAI;gBACpB,MAAM,EAAE,GAAG;aACZ,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE1C,uBAAuB;QACvB,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YAChE,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC3B,GAAG,CAAC,iBAAiB,OAAO,CAAC,IAAI,aAAa,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,0BAA0B,OAAO,CAAC,IAAI,YAAY,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtH,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;;;OASG;IACH,gBAAgB,CAAC,MAAc,EAAE,IAAY,EAAE,SAAiB;QAC9D,GAAG,CAAC,uBAAuB,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAE3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;QACvE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAE9B,sCAAsC;QACtC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,6DAA6D;gBAC7D,0DAA0D;gBAC1D,GAAG,CAAC,uBAAuB,MAAM,CAAC,KAAK,mCAAmC,CAAC,CAAC;gBAC5E,IAAI,cAAc,EAAE,CAAC;oBACnB,KAAK,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,4DAA4D,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uCAAuC;IAEvC;;;;;;;;;OASG;IACH,KAAK,CAAC,KAAK,CAAC,OAAsB;QAChC,GAAG,CAAC,gBAAgB,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,IAAI,WAAW,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAErJ,kBAAkB;QAClB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,OAAO,CAAC,MAAM,qBAAqB,EAAE,CAAC;YACtF,CAAC;YACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAED,4EAA4E;QAC5E,sFAAsF;QACtF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACvC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC;gBAC7C,MAAM,GAAG,GAAmB;oBAC1B,KAAK,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;wBAC5B,IAAI,QAAQ,EAAE,CAAC;4BACb,aAAa,CAAC,IAAI,CAAC,CAAC;wBACtB,CAAC;6BAAM,IAAI,aAAa,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE;gCAClD,IAAI;gCACJ,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS;6BACrC,CAAC,CAAC;4BACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;wBACvD,CAAC;6BAAM,CAAC;4BACN,GAAG,CAAC,iCAAiC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;wBACzD,CAAC;oBACH,CAAC;oBACD,UAAU,EAAE,KAAK,EAAE,MAAc,EAAE,OAAe,EAAE,EAAE;wBACpD,IAAI,QAAQ,EAAE,CAAC;4BACb,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;wBAClC,CAAC;6BAAM,IAAI,aAAa,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE;gCACnD,IAAI,EAAE,OAAO;gCACb,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;gCACjC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS;6BACrC,CAAC,CAAC;4BACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;wBACvD,CAAC;oBACH,CAAC;oBACD,UAAU,EAAE,KAAK,EAAE,WAAmB,EAAE,OAAe,EAAE,EAAE;wBACzD,IAAI,QAAQ,EAAE,CAAC;4BACb,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;wBACvC,CAAC;6BAAM,IAAI,aAAa,EAAE,CAAC;4BACzB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE;gCACnD,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;gCACtC,IAAI,EAAE,OAAO;gCACb,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS;6BACrC,CAAC,CAAC;4BACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;wBACvD,CAAC;oBACH,CAAC;oBACD,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS;iBACrC,CAAC;gBACF,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAClE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YAC1C,CAAC;YACD,uCAAuC;YACvC,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;gBACpE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YAC1C,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC;QAC1E,CAAC;QAED,mEAAmE;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QACtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,uEAAuE;YACvE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC;YAC/E,CAAC;YACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CACpB,OAA0B,EAC1B,OAAsB;QAEtB,GAAG,CAAC,uBAAuB,OAAO,CAAC,IAAI,QAAQ,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAErE,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE;gBAC9C,OAAO,EAAE,OAA6C;aACvD,CAAC,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;QACxE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,GAAG,CAAC,qBAAqB,OAAO,CAAC,IAAI,YAAY,GAAG,EAAE,CAAC,CAAC;YACxD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,OAAO,CAAC,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC;QAC5E,CAAC;IACH,CAAC;CACF"}
@@ -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"}