@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.
Files changed (62) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/__tests__/helpers.d.ts +4 -0
  3. package/dist/__tests__/helpers.d.ts.map +1 -1
  4. package/dist/__tests__/helpers.js +14 -0
  5. package/dist/__tests__/helpers.js.map +1 -1
  6. package/dist/app.d.ts +4 -0
  7. package/dist/app.d.ts.map +1 -1
  8. package/dist/app.js +29 -3
  9. package/dist/app.js.map +1 -1
  10. package/dist/index.js +12 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/middleware/ws-auth.d.ts +11 -0
  13. package/dist/middleware/ws-auth.d.ts.map +1 -1
  14. package/dist/middleware/ws-auth.js +46 -0
  15. package/dist/middleware/ws-auth.js.map +1 -1
  16. package/dist/routes/adapter.d.ts +17 -0
  17. package/dist/routes/adapter.d.ts.map +1 -0
  18. package/dist/routes/adapter.js +119 -0
  19. package/dist/routes/adapter.js.map +1 -0
  20. package/dist/routes/channel-mappings.d.ts +17 -0
  21. package/dist/routes/channel-mappings.d.ts.map +1 -0
  22. package/dist/routes/channel-mappings.js +120 -0
  23. package/dist/routes/channel-mappings.js.map +1 -0
  24. package/dist/routes/messages.d.ts +2 -1
  25. package/dist/routes/messages.d.ts.map +1 -1
  26. package/dist/routes/messages.js +19 -3
  27. package/dist/routes/messages.js.map +1 -1
  28. package/dist/routes/peers.d.ts.map +1 -1
  29. package/dist/routes/peers.js +5 -1
  30. package/dist/routes/peers.js.map +1 -1
  31. package/dist/services/adapter-registry.d.ts +45 -0
  32. package/dist/services/adapter-registry.d.ts.map +1 -0
  33. package/dist/services/adapter-registry.js +121 -0
  34. package/dist/services/adapter-registry.js.map +1 -0
  35. package/dist/services/channel-index.d.ts +29 -0
  36. package/dist/services/channel-index.d.ts.map +1 -0
  37. package/dist/services/channel-index.js +53 -0
  38. package/dist/services/channel-index.js.map +1 -0
  39. package/dist/services/connection-manager.d.ts +10 -0
  40. package/dist/services/connection-manager.d.ts.map +1 -1
  41. package/dist/services/connection-manager.js +23 -0
  42. package/dist/services/connection-manager.js.map +1 -1
  43. package/dist/types.d.ts +17 -0
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/ui/pages/HowToPage.d.ts.map +1 -1
  46. package/dist/ui/pages/HowToPage.js +3 -3
  47. package/dist/ui/pages/HowToPage.js.map +1 -1
  48. package/dist/ui/pages/LandingPage.d.ts.map +1 -1
  49. package/dist/ui/pages/LandingPage.js +1 -1
  50. package/dist/ui/pages/LandingPage.js.map +1 -1
  51. package/dist/ws/adapter-handler.d.ts +30 -0
  52. package/dist/ws/adapter-handler.d.ts.map +1 -0
  53. package/dist/ws/adapter-handler.js +81 -0
  54. package/dist/ws/adapter-handler.js.map +1 -0
  55. package/dist/ws/frames.d.ts +49 -1
  56. package/dist/ws/frames.d.ts.map +1 -1
  57. package/dist/ws/frames.js +24 -0
  58. package/dist/ws/frames.js.map +1 -1
  59. package/dist/ws/handler.d.ts.map +1 -1
  60. package/dist/ws/handler.js +30 -5
  61. package/dist/ws/handler.js.map +1 -1
  62. 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;AAGnE,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,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,WAAW,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoCvE;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,CAyD3E"}
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":"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"}
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;CAC5B;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,CA6DlD"}
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":"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"}
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 with 1012 (Service Restart) before HTTP server shutdown
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":"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"}
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":"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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 { 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"}