@essentialai/cogent-server 2.0.0 → 3.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.
- package/CHANGELOG.md +24 -0
- package/dist/__tests__/helpers.d.ts +4 -0
- package/dist/__tests__/helpers.d.ts.map +1 -1
- package/dist/__tests__/helpers.js +14 -0
- package/dist/__tests__/helpers.js.map +1 -1
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +29 -3
- package/dist/app.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/ws-auth.d.ts +11 -0
- package/dist/middleware/ws-auth.d.ts.map +1 -1
- package/dist/middleware/ws-auth.js +46 -0
- package/dist/middleware/ws-auth.js.map +1 -1
- package/dist/routes/adapter.d.ts +17 -0
- package/dist/routes/adapter.d.ts.map +1 -0
- package/dist/routes/adapter.js +119 -0
- package/dist/routes/adapter.js.map +1 -0
- package/dist/routes/channel-mappings.d.ts +17 -0
- package/dist/routes/channel-mappings.d.ts.map +1 -0
- package/dist/routes/channel-mappings.js +120 -0
- package/dist/routes/channel-mappings.js.map +1 -0
- package/dist/routes/messages.d.ts +2 -1
- package/dist/routes/messages.d.ts.map +1 -1
- package/dist/routes/messages.js +19 -3
- package/dist/routes/messages.js.map +1 -1
- package/dist/routes/peers.d.ts.map +1 -1
- package/dist/routes/peers.js +5 -1
- package/dist/routes/peers.js.map +1 -1
- package/dist/services/adapter-registry.d.ts +45 -0
- package/dist/services/adapter-registry.d.ts.map +1 -0
- package/dist/services/adapter-registry.js +121 -0
- package/dist/services/adapter-registry.js.map +1 -0
- package/dist/services/channel-index.d.ts +29 -0
- package/dist/services/channel-index.d.ts.map +1 -0
- package/dist/services/channel-index.js +53 -0
- package/dist/services/channel-index.js.map +1 -0
- package/dist/services/connection-manager.d.ts +10 -0
- package/dist/services/connection-manager.d.ts.map +1 -1
- package/dist/services/connection-manager.js +23 -0
- package/dist/services/connection-manager.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/pages/HowToPage.d.ts.map +1 -1
- package/dist/ui/pages/HowToPage.js +3 -3
- package/dist/ui/pages/HowToPage.js.map +1 -1
- package/dist/ui/pages/LandingPage.d.ts.map +1 -1
- package/dist/ui/pages/LandingPage.js +1 -1
- package/dist/ui/pages/LandingPage.js.map +1 -1
- package/dist/ws/adapter-handler.d.ts +30 -0
- package/dist/ws/adapter-handler.d.ts.map +1 -0
- package/dist/ws/adapter-handler.js +81 -0
- package/dist/ws/adapter-handler.js.map +1 -0
- package/dist/ws/frames.d.ts +49 -1
- package/dist/ws/frames.d.ts.map +1 -1
- package/dist/ws/frames.js +24 -0
- package/dist/ws/frames.js.map +1 -1
- package/dist/ws/handler.d.ts.map +1 -1
- package/dist/ws/handler.js +30 -5
- package/dist/ws/handler.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.0.0] - 2026-03-19
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- Transport adapter abstraction: AdapterRegistry, ChannelIndex, adapter inbound API
|
|
7
|
+
- Adapter WebSocket endpoint (/ws/:sessionId/adapter) with heartbeat, offline queue flush, 3-stage delivery ack
|
|
8
|
+
- Channel mapping CRUD routes (PUT/GET/DELETE /api/sessions/:sessionId/channel-mappings/:platform)
|
|
9
|
+
- Echo suppression: originPlatform-based broadcast filtering at routing layer
|
|
10
|
+
- Adapter-specific WS auth middleware (token + platform, no peerId required)
|
|
11
|
+
- broadcastToSessionWithFilter() on ConnectionManager for platform-aware broadcasting
|
|
12
|
+
- Peer registration now accepts platform/type/transport/platformIdentity fields
|
|
13
|
+
- Slack adapter package (slack-adapter/): bidirectional Slack-COGENT message bridge
|
|
14
|
+
- Slack Socket Mode integration via @slack/bolt v4.6.0
|
|
15
|
+
- Bidirectional format translation: markdown to mrkdwn (slackify-markdown) and mrkdwn to markdown (custom)
|
|
16
|
+
- Slack user auto-registration as COGENT peers with display name + profile title
|
|
17
|
+
- Slash commands: /cogent peers, /cogent send, /cogent status, /cogent map
|
|
18
|
+
- Bidirectional @mention resolution (CC names to Slack user IDs and vice versa)
|
|
19
|
+
- Custom bot attribution per agent with role-based emoji
|
|
20
|
+
- Slack adapter deployed as separate systemd service (cogent-slack-adapter)
|
|
21
|
+
- Website: Slack Integration section on landing page and How-To guide
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- Server now initializes AdapterRegistry and ChannelIndex on startup
|
|
25
|
+
- Graceful shutdown closes adapter connections before peer connections
|
|
26
|
+
|
|
3
27
|
## [2.0.0] - 2026-02-25
|
|
4
28
|
|
|
5
29
|
### Added
|
|
@@ -4,6 +4,8 @@ import { SessionStore } from "../services/session-store.js";
|
|
|
4
4
|
import { AuthService } from "../services/auth-service.js";
|
|
5
5
|
import { ConnectionManager } from "../services/connection-manager.js";
|
|
6
6
|
import { MessageQueueService } from "../services/message-queue.js";
|
|
7
|
+
import { AdapterRegistry } from "../services/adapter-registry.js";
|
|
8
|
+
import { ChannelIndex } from "../services/channel-index.js";
|
|
7
9
|
import type { ServerEnv } from "../types.js";
|
|
8
10
|
export interface TestApp {
|
|
9
11
|
app: Hono<ServerEnv>;
|
|
@@ -11,6 +13,8 @@ export interface TestApp {
|
|
|
11
13
|
authService: AuthService;
|
|
12
14
|
connectionManager: ConnectionManager;
|
|
13
15
|
messageQueue: MessageQueueService;
|
|
16
|
+
adapterRegistry: AdapterRegistry;
|
|
17
|
+
channelIndex: ChannelIndex;
|
|
14
18
|
cleanup: () => Promise<void>;
|
|
15
19
|
}
|
|
16
20
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,mBAAmB,CAAC;IAClC,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,WAAW,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0CvE;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EACpB,MAAM,SAAsB,GAC3B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ/C;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,SAAmB,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAclC;AAED;;;GAGG;AACH,MAAM,WAAW,SAAU,SAAQ,OAAO;IACxC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACpE,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,WAAW,SAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA+D3E"}
|
|
@@ -7,6 +7,8 @@ import { AuthService } from "../services/auth-service.js";
|
|
|
7
7
|
import { ConnectionManager } from "../services/connection-manager.js";
|
|
8
8
|
import { MessageQueueService } from "../services/message-queue.js";
|
|
9
9
|
import { StatsService } from "../services/stats-service.js";
|
|
10
|
+
import { AdapterRegistry } from "../services/adapter-registry.js";
|
|
11
|
+
import { ChannelIndex } from "../services/channel-index.js";
|
|
10
12
|
import { createApp } from "../app.js";
|
|
11
13
|
/**
|
|
12
14
|
* Create a fully-wired test app with real SessionStore and AuthService.
|
|
@@ -20,6 +22,8 @@ export async function createTestApp(maxMessages = 500) {
|
|
|
20
22
|
const authService = new AuthService(4); // Low rounds for fast tests
|
|
21
23
|
const connectionManager = new ConnectionManager(30_000);
|
|
22
24
|
const messageQueue = new MessageQueueService(sessionStore);
|
|
25
|
+
const adapterRegistry = new AdapterRegistry();
|
|
26
|
+
const channelIndex = new ChannelIndex();
|
|
23
27
|
await sessionStore.init();
|
|
24
28
|
const startTime = Date.now();
|
|
25
29
|
const statsService = new StatsService(sessionStore, connectionManager, startTime);
|
|
@@ -34,6 +38,8 @@ export async function createTestApp(maxMessages = 500) {
|
|
|
34
38
|
adminPassword: null,
|
|
35
39
|
heartbeatIntervalMs: 30_000,
|
|
36
40
|
heartbeatMaxMissed: 3,
|
|
41
|
+
adapterRegistry,
|
|
42
|
+
channelIndex,
|
|
37
43
|
});
|
|
38
44
|
return {
|
|
39
45
|
app,
|
|
@@ -41,6 +47,8 @@ export async function createTestApp(maxMessages = 500) {
|
|
|
41
47
|
authService,
|
|
42
48
|
connectionManager,
|
|
43
49
|
messageQueue,
|
|
50
|
+
adapterRegistry,
|
|
51
|
+
channelIndex,
|
|
44
52
|
cleanup: async () => {
|
|
45
53
|
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
46
54
|
},
|
|
@@ -92,6 +100,8 @@ export async function createTestWsApp(maxMessages = 500) {
|
|
|
92
100
|
await sessionStore.init();
|
|
93
101
|
const connectionManager = new ConnectionManager(30_000);
|
|
94
102
|
const messageQueue = new MessageQueueService(sessionStore, 7 * 24 * 60 * 60 * 1000);
|
|
103
|
+
const adapterRegistry = new AdapterRegistry();
|
|
104
|
+
const channelIndex = new ChannelIndex();
|
|
95
105
|
const startTime = Date.now();
|
|
96
106
|
const statsService = new StatsService(sessionStore, connectionManager, startTime);
|
|
97
107
|
const { app, injectWebSocket } = createApp({
|
|
@@ -105,6 +115,8 @@ export async function createTestWsApp(maxMessages = 500) {
|
|
|
105
115
|
adminPassword: null,
|
|
106
116
|
heartbeatIntervalMs: 30_000,
|
|
107
117
|
heartbeatMaxMissed: 3,
|
|
118
|
+
adapterRegistry,
|
|
119
|
+
channelIndex,
|
|
108
120
|
});
|
|
109
121
|
// Create real HTTP server on ephemeral port
|
|
110
122
|
const server = createAdaptorServer(app);
|
|
@@ -119,6 +131,8 @@ export async function createTestWsApp(maxMessages = 500) {
|
|
|
119
131
|
authService,
|
|
120
132
|
connectionManager,
|
|
121
133
|
messageQueue,
|
|
134
|
+
adapterRegistry,
|
|
135
|
+
channelIndex,
|
|
122
136
|
server,
|
|
123
137
|
port,
|
|
124
138
|
wsUrl: (sessionId, token, peerId) => `ws://localhost:${port}/ws/${sessionId}?token=${encodeURIComponent(token)}&peerId=${encodeURIComponent(peerId)}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/app.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ import type { ConnectionManager } from "./services/connection-manager.js";
|
|
|
7
7
|
import type { MessageQueueService } from "./services/message-queue.js";
|
|
8
8
|
import type { StatsService } from "./services/stats-service.js";
|
|
9
9
|
import type { ServerEnv } from "./types.js";
|
|
10
|
+
import type { AdapterRegistry } from "./services/adapter-registry.js";
|
|
11
|
+
import type { ChannelIndex } from "./services/channel-index.js";
|
|
10
12
|
/** Dependencies required to create the Hono app. */
|
|
11
13
|
export interface AppDeps {
|
|
12
14
|
sessionStore: SessionStore;
|
|
@@ -19,6 +21,8 @@ export interface AppDeps {
|
|
|
19
21
|
adminPassword: string | null;
|
|
20
22
|
heartbeatIntervalMs: number;
|
|
21
23
|
heartbeatMaxMissed: number;
|
|
24
|
+
adapterRegistry?: AdapterRegistry;
|
|
25
|
+
channelIndex?: ChannelIndex;
|
|
22
26
|
}
|
|
23
27
|
/** Return type of createApp -- app + injectWebSocket for index.ts wiring. */
|
|
24
28
|
export interface AppResult {
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAa5C,oDAAoD;AACpD,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,mBAAmB,CAAC;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAa5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,oDAAoD;AACpD,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,mBAAmB,CAAC;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,6EAA6E;AAC7E,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACrB,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,iBAAiB,KAAK,IAAI,CAAC;CAC7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CA6FlD"}
|
package/dist/app.js
CHANGED
|
@@ -9,8 +9,11 @@ import { createPeerRoutes } from "./routes/peers.js";
|
|
|
9
9
|
import { createMessageRoutes } from "./routes/messages.js";
|
|
10
10
|
import { createPollRoutes } from "./routes/poll.js";
|
|
11
11
|
import { createUiRoutes } from "./routes/ui.js";
|
|
12
|
-
import { createWsAuthMiddleware } from "./middleware/ws-auth.js";
|
|
12
|
+
import { createWsAuthMiddleware, createAdapterWsAuthMiddleware } from "./middleware/ws-auth.js";
|
|
13
13
|
import { createWsHandler } from "./ws/handler.js";
|
|
14
|
+
import { createAdapterWsHandler } from "./ws/adapter-handler.js";
|
|
15
|
+
import { createAdapterRoutes } from "./routes/adapter.js";
|
|
16
|
+
import { createChannelMappingRoutes } from "./routes/channel-mappings.js";
|
|
14
17
|
/**
|
|
15
18
|
* Create and configure the Hono app with all middleware and routes.
|
|
16
19
|
*
|
|
@@ -21,7 +24,7 @@ import { createWsHandler } from "./ws/handler.js";
|
|
|
21
24
|
* be called with the HTTP server after serve() -- see RESEARCH.md Pitfall 2.
|
|
22
25
|
*/
|
|
23
26
|
export function createApp(deps) {
|
|
24
|
-
const { sessionStore, authService, startTime, maxMessages, connectionManager, messageQueue, statsService, adminPassword, heartbeatIntervalMs, heartbeatMaxMissed, } = deps;
|
|
27
|
+
const { sessionStore, authService, startTime, maxMessages, connectionManager, messageQueue, statsService, adminPassword, heartbeatIntervalMs, heartbeatMaxMissed, adapterRegistry, channelIndex, } = deps;
|
|
25
28
|
const app = new Hono();
|
|
26
29
|
const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app });
|
|
27
30
|
// --- Error handling ---
|
|
@@ -40,6 +43,21 @@ export function createApp(deps) {
|
|
|
40
43
|
heartbeatMaxMissed,
|
|
41
44
|
});
|
|
42
45
|
}));
|
|
46
|
+
// --- Adapter WebSocket route (BEFORE requestLogger, same as peer WS route) ---
|
|
47
|
+
if (adapterRegistry) {
|
|
48
|
+
app.get("/ws/:sessionId/adapter", createAdapterWsAuthMiddleware(sessionStore, authService), upgradeWebSocket((c) => {
|
|
49
|
+
const sessionId = c.get("sessionId");
|
|
50
|
+
const platform = c.req.query("platform");
|
|
51
|
+
return createAdapterWsHandler(sessionId, platform, {
|
|
52
|
+
adapterRegistry,
|
|
53
|
+
messageQueue,
|
|
54
|
+
sessionStore,
|
|
55
|
+
connectionManager,
|
|
56
|
+
heartbeatIntervalMs,
|
|
57
|
+
heartbeatMaxMissed,
|
|
58
|
+
});
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
43
61
|
// --- Global middleware (applied after WS route to avoid header conflicts per RESEARCH.md Pitfall 1) ---
|
|
44
62
|
app.use("*", requestLogger());
|
|
45
63
|
// --- UI routes (after requestLogger, before API routes) ---
|
|
@@ -52,9 +70,17 @@ export function createApp(deps) {
|
|
|
52
70
|
// Peer routes: /:sessionId/peers (POST, GET), /:sessionId/peers/:peerId (DELETE)
|
|
53
71
|
app.route("/api/sessions", createPeerRoutes(sessionStore, authService, connectionManager));
|
|
54
72
|
// Message routes: /:sessionId/messages (POST, GET)
|
|
55
|
-
app.route("/api/sessions", createMessageRoutes(sessionStore, authService, maxMessages, connectionManager, messageQueue));
|
|
73
|
+
app.route("/api/sessions", createMessageRoutes(sessionStore, authService, maxMessages, connectionManager, messageQueue, adapterRegistry));
|
|
56
74
|
// Poll routes: /:sessionId/poll (GET)
|
|
57
75
|
app.route("/api/sessions", createPollRoutes(sessionStore, authService));
|
|
76
|
+
// Adapter routes: /adapter/:sessionId/messages (POST, GET)
|
|
77
|
+
if (adapterRegistry) {
|
|
78
|
+
app.route("/adapter", createAdapterRoutes(sessionStore, authService, maxMessages, connectionManager, adapterRegistry, messageQueue));
|
|
79
|
+
}
|
|
80
|
+
// Channel mapping routes: /api/sessions/:sessionId/channel-mappings (PUT, GET, DELETE)
|
|
81
|
+
if (channelIndex) {
|
|
82
|
+
app.route("/api/sessions", createChannelMappingRoutes(sessionStore, authService, channelIndex));
|
|
83
|
+
}
|
|
58
84
|
return { app, injectWebSocket };
|
|
59
85
|
}
|
|
60
86
|
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAOpD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,8 @@ import { MessageQueueService } from "./services/message-queue.js";
|
|
|
8
8
|
import { StatsService } from "./services/stats-service.js";
|
|
9
9
|
import { createPeerDisconnectedFrame } from "./ws/frames.js";
|
|
10
10
|
import { SessionCleanup } from "./services/session-cleanup.js";
|
|
11
|
+
import { AdapterRegistry } from "./services/adapter-registry.js";
|
|
12
|
+
import { ChannelIndex } from "./services/channel-index.js";
|
|
11
13
|
import { createApp } from "./app.js";
|
|
12
14
|
/**
|
|
13
15
|
* Cogent Server entry point.
|
|
@@ -30,6 +32,11 @@ async function main() {
|
|
|
30
32
|
// Create WebSocket-aware services
|
|
31
33
|
const connectionManager = new ConnectionManager(config.WS_GRACE_PERIOD_MS);
|
|
32
34
|
const messageQueue = new MessageQueueService(sessionStore, config.QUEUE_TTL_MS);
|
|
35
|
+
// v3.0: Adapter connection tracking and channel reverse index
|
|
36
|
+
const adapterRegistry = new AdapterRegistry();
|
|
37
|
+
const channelIndex = new ChannelIndex();
|
|
38
|
+
await channelIndex.rebuild(sessionStore);
|
|
39
|
+
console.error(`Channel index rebuilt: ${channelIndex.size} mapping(s)`);
|
|
33
40
|
// Set up peer offline callback: broadcast peer_disconnected when grace period expires
|
|
34
41
|
connectionManager.setOnPeerOffline((sessionId, peerId) => {
|
|
35
42
|
const frame = createPeerDisconnectedFrame(peerId);
|
|
@@ -53,6 +60,8 @@ async function main() {
|
|
|
53
60
|
adminPassword,
|
|
54
61
|
heartbeatIntervalMs: config.WS_HEARTBEAT_INTERVAL_MS,
|
|
55
62
|
heartbeatMaxMissed: config.WS_HEARTBEAT_MAX_MISSED,
|
|
63
|
+
adapterRegistry,
|
|
64
|
+
channelIndex,
|
|
56
65
|
});
|
|
57
66
|
// Start stale peer cleanup background service
|
|
58
67
|
const peerCleanup = new PeerCleanup(sessionStore, config.STALE_PEER_TIMEOUT_MS);
|
|
@@ -82,7 +91,9 @@ async function main() {
|
|
|
82
91
|
peerCleanup.stop();
|
|
83
92
|
sessionCleanup.stop();
|
|
84
93
|
messageQueue.stopCleanup();
|
|
85
|
-
// Close all WebSocket connections
|
|
94
|
+
// Close all adapter WebSocket connections
|
|
95
|
+
adapterRegistry.closeAll(1012, "Service restart");
|
|
96
|
+
// Close all peer WebSocket connections with 1012 (Service Restart) before HTTP server shutdown
|
|
86
97
|
connectionManager.closeAll(1012, "Service restart");
|
|
87
98
|
server.close((err) => {
|
|
88
99
|
if (err) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;;;;;;;;GASG;AACH,KAAK,UAAU,IAAI;IACjB,yDAAyD;IACzD,gBAAgB,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,sBAAsB;IACtB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAI,YAAY,CACnC,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,wBAAwB,CAChC,CAAC;IACF,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IAE1B,kCAAkC;IAClC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,IAAI,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAEhF,sFAAsF;IACtF,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;QACvD,MAAM,KAAK,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;QAClD,iBAAiB,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,mDAAmD;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC;IAEpD,4DAA4D;IAC5D,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,YAAY,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAElF,yEAAyE;IACzE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC;QACzC,YAAY;QACZ,WAAW;QACX,SAAS;QACT,WAAW,EAAE,MAAM,CAAC,wBAAwB;QAC5C,iBAAiB;QACjB,YAAY;QACZ,YAAY;QACZ,aAAa;QACb,mBAAmB,EAAE,MAAM,CAAC,wBAAwB;QACpD,kBAAkB,EAAE,MAAM,CAAC,uBAAuB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,4 +18,15 @@ import type { ServerEnv } from "../types.js";
|
|
|
18
18
|
* peers from establishing WebSocket connections.
|
|
19
19
|
*/
|
|
20
20
|
export declare function createWsAuthMiddleware(sessionStore: SessionStore, authService: AuthService): import("hono").MiddlewareHandler<ServerEnv, string, {}, Response>;
|
|
21
|
+
/**
|
|
22
|
+
* Create WebSocket auth middleware for adapter connections.
|
|
23
|
+
*
|
|
24
|
+
* Reuses the same token-based auth flow as peer WS auth but:
|
|
25
|
+
* - Does NOT require peerId query parameter
|
|
26
|
+
* - Does NOT validate peer registration
|
|
27
|
+
* - DOES require platform query parameter (e.g., "slack", "gchat")
|
|
28
|
+
*
|
|
29
|
+
* Adapter WS URL: /ws/:sessionId/adapter?token=<token>&platform=<platform>
|
|
30
|
+
*/
|
|
31
|
+
export declare function createAdapterWsAuthMiddleware(sessionStore: SessionStore, authService: AuthService): import("hono").MiddlewareHandler<ServerEnv, string, {}, Response>;
|
|
21
32
|
//# sourceMappingURL=ws-auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-auth.d.ts","sourceRoot":"","sources":["../../src/middleware/ws-auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,qEA0EzB"}
|
|
1
|
+
{"version":3,"file":"ws-auth.d.ts","sourceRoot":"","sources":["../../src/middleware/ws-auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,qEA0EzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,qEAiEzB"}
|
|
@@ -56,4 +56,50 @@ export function createWsAuthMiddleware(sessionStore, authService) {
|
|
|
56
56
|
await next();
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Create WebSocket auth middleware for adapter connections.
|
|
61
|
+
*
|
|
62
|
+
* Reuses the same token-based auth flow as peer WS auth but:
|
|
63
|
+
* - Does NOT require peerId query parameter
|
|
64
|
+
* - Does NOT validate peer registration
|
|
65
|
+
* - DOES require platform query parameter (e.g., "slack", "gchat")
|
|
66
|
+
*
|
|
67
|
+
* Adapter WS URL: /ws/:sessionId/adapter?token=<token>&platform=<platform>
|
|
68
|
+
*/
|
|
69
|
+
export function createAdapterWsAuthMiddleware(sessionStore, authService) {
|
|
70
|
+
return createMiddleware(async (c, next) => {
|
|
71
|
+
// 1. Extract token from query parameter
|
|
72
|
+
const token = c.req.query("token");
|
|
73
|
+
if (!token) {
|
|
74
|
+
throw new BridgeError(ErrorCode.AUTH_MISSING_TOKEN, "Token query parameter required for adapter WebSocket connection", "Include '?token=<bearer-token>' in the WebSocket URL");
|
|
75
|
+
}
|
|
76
|
+
// 2. Hash the token with SHA-256 for index lookup
|
|
77
|
+
const tokenHash = authService.hashToken(token);
|
|
78
|
+
// 3. Look up session by token hash
|
|
79
|
+
const result = await sessionStore.getSessionByTokenHash(tokenHash);
|
|
80
|
+
if (!result) {
|
|
81
|
+
throw new BridgeError(ErrorCode.AUTH_INVALID_TOKEN, "Invalid or expired token");
|
|
82
|
+
}
|
|
83
|
+
// 4. Defense-in-depth: timing-safe comparison of the token hash
|
|
84
|
+
const storedTokenHash = result.state.tokens.find((t) => t.tokenHash === tokenHash)?.tokenHash;
|
|
85
|
+
if (!storedTokenHash ||
|
|
86
|
+
!authService.timingSafeCompare(tokenHash, storedTokenHash)) {
|
|
87
|
+
throw new BridgeError(ErrorCode.AUTH_INVALID_TOKEN, "Invalid or expired token");
|
|
88
|
+
}
|
|
89
|
+
// 5. Verify path sessionId matches the authenticated session
|
|
90
|
+
const pathSessionId = c.req.param("sessionId");
|
|
91
|
+
if (pathSessionId !== result.sessionId) {
|
|
92
|
+
throw new BridgeError(ErrorCode.AUTH_INVALID_TOKEN, "Token does not match the requested session");
|
|
93
|
+
}
|
|
94
|
+
// 6. Validate platform query parameter (adapters are not peers)
|
|
95
|
+
const platform = c.req.query("platform");
|
|
96
|
+
if (!platform) {
|
|
97
|
+
throw new BridgeError(ErrorCode.AUTH_INVALID_TOKEN, "platform query parameter required for adapter WebSocket connection", "Include '&platform=<platform>' in the WebSocket URL (e.g., slack, gchat)");
|
|
98
|
+
}
|
|
99
|
+
// 7. Set session context for downstream handlers
|
|
100
|
+
c.set("sessionId", result.sessionId);
|
|
101
|
+
c.set("session", result.state);
|
|
102
|
+
await next();
|
|
103
|
+
});
|
|
104
|
+
}
|
|
59
105
|
//# sourceMappingURL=ws-auth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-auth.js","sourceRoot":"","sources":["../../src/middleware/ws-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAK7D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,sBAAsB,CACpC,YAA0B,EAC1B,WAAwB;IAExB,OAAO,gBAAgB,CAAY,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACnD,wCAAwC;QACxC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,yDAAyD,EACzD,sDAAsD,CACvD,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE/C,mCAAmC;QACnC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,0BAA0B,CAC3B,CAAC;QACJ,CAAC;QAED,gEAAgE;QAChE,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,EAAE,SAAS,CAAC;QAEb,IACE,CAAC,eAAe;YAChB,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,EAAE,eAAe,CAAC,EAC1D,CAAC;YACD,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,0BAA0B,CAC3B,CAAC;QACJ,CAAC;QAED,6DAA6D;QAC7D,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,aAAa,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,4CAA4C,CAC7C,CAAC;QACJ,CAAC;QAED,+DAA+D;QAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,cAAc,EACxB,0DAA0D,EAC1D,kDAAkD,CACnD,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,cAAc,EACxB,SAAS,MAAM,qCAAqC,EACpD,iEAAiE,CAClE,CAAC;QACJ,CAAC;QAED,iDAAiD;QACjD,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"ws-auth.js","sourceRoot":"","sources":["../../src/middleware/ws-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAK7D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,sBAAsB,CACpC,YAA0B,EAC1B,WAAwB;IAExB,OAAO,gBAAgB,CAAY,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACnD,wCAAwC;QACxC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,yDAAyD,EACzD,sDAAsD,CACvD,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE/C,mCAAmC;QACnC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,0BAA0B,CAC3B,CAAC;QACJ,CAAC;QAED,gEAAgE;QAChE,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,EAAE,SAAS,CAAC;QAEb,IACE,CAAC,eAAe;YAChB,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,EAAE,eAAe,CAAC,EAC1D,CAAC;YACD,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,0BAA0B,CAC3B,CAAC;QACJ,CAAC;QAED,6DAA6D;QAC7D,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,aAAa,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,4CAA4C,CAC7C,CAAC;QACJ,CAAC;QAED,+DAA+D;QAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,cAAc,EACxB,0DAA0D,EAC1D,kDAAkD,CACnD,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,cAAc,EACxB,SAAS,MAAM,qCAAqC,EACpD,iEAAiE,CAClE,CAAC;QACJ,CAAC;QAED,iDAAiD;QACjD,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,6BAA6B,CAC3C,YAA0B,EAC1B,WAAwB;IAExB,OAAO,gBAAgB,CAAY,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACnD,wCAAwC;QACxC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,iEAAiE,EACjE,sDAAsD,CACvD,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE/C,mCAAmC;QACnC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,0BAA0B,CAC3B,CAAC;QACJ,CAAC;QAED,gEAAgE;QAChE,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,EAAE,SAAS,CAAC;QAEb,IACE,CAAC,eAAe;YAChB,CAAC,WAAW,CAAC,iBAAiB,CAAC,SAAS,EAAE,eAAe,CAAC,EAC1D,CAAC;YACD,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,0BAA0B,CAC3B,CAAC;QACJ,CAAC;QAED,6DAA6D;QAC7D,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,aAAa,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,4CAA4C,CAC7C,CAAC;QACJ,CAAC;QAED,gEAAgE;QAChE,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,WAAW,CACnB,SAAS,CAAC,kBAAkB,EAC5B,oEAAoE,EACpE,0EAA0E,CAC3E,CAAC;QACJ,CAAC;QAED,iDAAiD;QACjD,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import type { SessionStore } from "../services/session-store.js";
|
|
3
|
+
import type { AuthService } from "../services/auth-service.js";
|
|
4
|
+
import type { ConnectionManager } from "../services/connection-manager.js";
|
|
5
|
+
import type { AdapterRegistry } from "../services/adapter-registry.js";
|
|
6
|
+
import type { MessageQueueService } from "../services/message-queue.js";
|
|
7
|
+
import type { ServerEnv } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Create adapter routes sub-router.
|
|
10
|
+
*
|
|
11
|
+
* POST /:sessionId/messages -> Adapter injects a message into a COGENT session
|
|
12
|
+
* GET /:sessionId/messages -> Poll fallback for adapter (messages since lastId)
|
|
13
|
+
*
|
|
14
|
+
* All routes require bearer token auth.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createAdapterRoutes(sessionStore: SessionStore, authService: AuthService, maxMessages: number, connectionManager: ConnectionManager, adapterRegistry: AdapterRegistry, messageQueue: MessageQueueService): Hono<ServerEnv>;
|
|
17
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/routes/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAgB7C;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,mBAAmB,GAChC,IAAI,CAAC,SAAS,CAAC,CAqHjB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { zValidator } from "@hono/zod-validator";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { BridgeError, ErrorCode, generateMessageId } from "@essentialai/cogent";
|
|
5
|
+
import { createAuthMiddleware } from "../middleware/auth.js";
|
|
6
|
+
import { validationHook } from "./validation-hook.js";
|
|
7
|
+
import { createMessageFrame } from "../ws/frames.js";
|
|
8
|
+
/**
|
|
9
|
+
* Zod schema for adapter inbound message requests.
|
|
10
|
+
* Server-only schema (not in cogent/ shared package).
|
|
11
|
+
*/
|
|
12
|
+
const AdapterInboundMessageSchema = z.object({
|
|
13
|
+
fromPeerId: z.string().min(1),
|
|
14
|
+
toPeerId: z.string().min(1),
|
|
15
|
+
message: z.string().min(1),
|
|
16
|
+
originPlatform: z.enum(["cc", "slack", "gchat", "web"]),
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Create adapter routes sub-router.
|
|
20
|
+
*
|
|
21
|
+
* POST /:sessionId/messages -> Adapter injects a message into a COGENT session
|
|
22
|
+
* GET /:sessionId/messages -> Poll fallback for adapter (messages since lastId)
|
|
23
|
+
*
|
|
24
|
+
* All routes require bearer token auth.
|
|
25
|
+
*/
|
|
26
|
+
export function createAdapterRoutes(sessionStore, authService, maxMessages, connectionManager, adapterRegistry, messageQueue) {
|
|
27
|
+
const adapter = new Hono();
|
|
28
|
+
const auth = createAuthMiddleware(sessionStore, authService);
|
|
29
|
+
// POST /:sessionId/messages -- adapter injects a message
|
|
30
|
+
adapter.post("/:sessionId/messages", auth, zValidator("json", AdapterInboundMessageSchema, validationHook), async (c) => {
|
|
31
|
+
const authSessionId = c.get("sessionId");
|
|
32
|
+
const pathSessionId = c.req.param("sessionId");
|
|
33
|
+
if (pathSessionId !== authSessionId) {
|
|
34
|
+
throw new BridgeError(ErrorCode.AUTH_INVALID_TOKEN, "Token does not belong to this session");
|
|
35
|
+
}
|
|
36
|
+
const { fromPeerId, toPeerId, message, originPlatform } = c.req.valid("json");
|
|
37
|
+
let messageId;
|
|
38
|
+
let timestamp;
|
|
39
|
+
let record;
|
|
40
|
+
await sessionStore.updateSession(authSessionId, (state) => {
|
|
41
|
+
// Verify sender peer exists (Slack users registered as peers by adapter)
|
|
42
|
+
if (!state.peers[fromPeerId]) {
|
|
43
|
+
throw new BridgeError(ErrorCode.PEER_NOT_FOUND, "Sender peer not registered in session");
|
|
44
|
+
}
|
|
45
|
+
// For direct messages, verify recipient exists (skip for broadcast)
|
|
46
|
+
if (toPeerId !== "*" && !state.peers[toPeerId]) {
|
|
47
|
+
throw new BridgeError(ErrorCode.PEER_NOT_FOUND, "Recipient peer not found in session");
|
|
48
|
+
}
|
|
49
|
+
const now = new Date().toISOString();
|
|
50
|
+
state.peers[fromPeerId].lastSeenAt = now;
|
|
51
|
+
messageId = generateMessageId();
|
|
52
|
+
timestamp = now;
|
|
53
|
+
record = {
|
|
54
|
+
id: messageId,
|
|
55
|
+
fromPeerId,
|
|
56
|
+
toPeerId,
|
|
57
|
+
message,
|
|
58
|
+
response: null,
|
|
59
|
+
timestamp,
|
|
60
|
+
durationMs: null,
|
|
61
|
+
success: true,
|
|
62
|
+
error: null,
|
|
63
|
+
originPlatform,
|
|
64
|
+
};
|
|
65
|
+
state.messages.push(record);
|
|
66
|
+
if (state.messages.length > maxMessages) {
|
|
67
|
+
state.messages = state.messages.slice(-maxMessages);
|
|
68
|
+
}
|
|
69
|
+
return state;
|
|
70
|
+
});
|
|
71
|
+
// Deliver via WebSocket
|
|
72
|
+
try {
|
|
73
|
+
const frame = createMessageFrame(record);
|
|
74
|
+
const data = JSON.stringify(frame);
|
|
75
|
+
if (toPeerId === "*") {
|
|
76
|
+
// Broadcast to all CC peers (CC peers always receive all messages)
|
|
77
|
+
connectionManager.broadcastToSession(authSessionId, data, fromPeerId);
|
|
78
|
+
// Broadcast to adapters on OTHER platforms (echo suppression)
|
|
79
|
+
adapterRegistry.broadcastToAdapters(authSessionId, data, originPlatform);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Direct message to a specific peer
|
|
83
|
+
if (connectionManager.isConnected(authSessionId, toPeerId)) {
|
|
84
|
+
connectionManager.sendToPeer(authSessionId, toPeerId, data);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
await messageQueue.enqueue(authSessionId, toPeerId, record);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
console.error("Adapter message delivery failed:", err);
|
|
93
|
+
}
|
|
94
|
+
return c.json({ id: messageId, success: true, timestamp: timestamp }, 201);
|
|
95
|
+
});
|
|
96
|
+
// GET /:sessionId/messages -- poll fallback for adapter
|
|
97
|
+
adapter.get("/:sessionId/messages", auth, async (c) => {
|
|
98
|
+
const authSessionId = c.get("sessionId");
|
|
99
|
+
const pathSessionId = c.req.param("sessionId");
|
|
100
|
+
if (pathSessionId !== authSessionId) {
|
|
101
|
+
throw new BridgeError(ErrorCode.AUTH_INVALID_TOKEN, "Token does not belong to this session");
|
|
102
|
+
}
|
|
103
|
+
const since = c.req.query("since");
|
|
104
|
+
const session = await sessionStore.getSession(authSessionId);
|
|
105
|
+
if (!session) {
|
|
106
|
+
throw new BridgeError(ErrorCode.SESSION_NOT_FOUND, `Session ${authSessionId} not found`);
|
|
107
|
+
}
|
|
108
|
+
let messages = session.messages;
|
|
109
|
+
if (since) {
|
|
110
|
+
const sinceIdx = messages.findIndex((m) => m.id === since);
|
|
111
|
+
if (sinceIdx !== -1) {
|
|
112
|
+
messages = messages.slice(sinceIdx + 1);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return c.json({ messages });
|
|
116
|
+
});
|
|
117
|
+
return adapter;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/routes/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import type { SessionStore } from "../services/session-store.js";
|
|
3
|
+
import type { AuthService } from "../services/auth-service.js";
|
|
4
|
+
import type { ChannelIndex } from "../services/channel-index.js";
|
|
5
|
+
import type { ServerEnv } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Create channel mapping CRUD routes sub-router.
|
|
8
|
+
*
|
|
9
|
+
* PUT /:sessionId/channel-mappings/:platform -> Create or update a channel mapping
|
|
10
|
+
* GET /:sessionId/channel-mappings -> List all channel mappings for a session
|
|
11
|
+
* GET /:sessionId/channel-mappings/:platform -> Get a specific channel mapping
|
|
12
|
+
* DELETE /:sessionId/channel-mappings/:platform -> Delete a channel mapping
|
|
13
|
+
*
|
|
14
|
+
* All routes require bearer token auth.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createChannelMappingRoutes(sessionStore: SessionStore, authService: AuthService, channelIndex: ChannelIndex): Hono<ServerEnv>;
|
|
17
|
+
//# sourceMappingURL=channel-mappings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-mappings.d.ts","sourceRoot":"","sources":["../../src/routes/channel-mappings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AAY7D;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,GACzB,IAAI,CAAC,SAAS,CAAC,CA2IjB"}
|