@essentialai/cogent-server 3.4.2 → 3.5.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 (110) hide show
  1. package/dist/__tests__/helpers.d.ts +5 -2
  2. package/dist/__tests__/helpers.d.ts.map +1 -1
  3. package/dist/__tests__/helpers.js +11 -4
  4. package/dist/__tests__/helpers.js.map +1 -1
  5. package/dist/__tests__/services/session-store-contract.d.ts +17 -0
  6. package/dist/__tests__/services/session-store-contract.d.ts.map +1 -0
  7. package/dist/__tests__/services/session-store-contract.js +186 -0
  8. package/dist/__tests__/services/session-store-contract.js.map +1 -0
  9. package/dist/app.d.ts +9 -0
  10. package/dist/app.d.ts.map +1 -1
  11. package/dist/app.js +18 -2
  12. package/dist/app.js.map +1 -1
  13. package/dist/config.d.ts +14 -0
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +44 -0
  16. package/dist/config.js.map +1 -1
  17. package/dist/contract/control-plane-contract.d.ts +93 -0
  18. package/dist/contract/control-plane-contract.d.ts.map +1 -0
  19. package/dist/contract/control-plane-contract.js +72 -0
  20. package/dist/contract/control-plane-contract.js.map +1 -0
  21. package/dist/db/index.d.ts +5 -0
  22. package/dist/db/index.d.ts.map +1 -0
  23. package/dist/db/index.js +3 -0
  24. package/dist/db/index.js.map +1 -0
  25. package/dist/db/migrate-cli.d.ts +2 -0
  26. package/dist/db/migrate-cli.d.ts.map +1 -0
  27. package/dist/db/migrate-cli.js +54 -0
  28. package/dist/db/migrate-cli.js.map +1 -0
  29. package/dist/db/migrate.d.ts +31 -0
  30. package/dist/db/migrate.d.ts.map +1 -0
  31. package/dist/db/migrate.js +98 -0
  32. package/dist/db/migrate.js.map +1 -0
  33. package/dist/db/migrations/0001_init_sessions.down.sql +4 -0
  34. package/dist/db/migrations/0001_init_sessions.up.sql +46 -0
  35. package/dist/db/migrations/0002_org_quotas.down.sql +2 -0
  36. package/dist/db/migrations/0002_org_quotas.up.sql +13 -0
  37. package/dist/db/pool.d.ts +39 -0
  38. package/dist/db/pool.d.ts.map +1 -0
  39. package/dist/db/pool.js +72 -0
  40. package/dist/db/pool.js.map +1 -0
  41. package/dist/index.js +33 -3
  42. package/dist/index.js.map +1 -1
  43. package/dist/middleware/auth.d.ts.map +1 -1
  44. package/dist/middleware/auth.js +32 -0
  45. package/dist/middleware/auth.js.map +1 -1
  46. package/dist/middleware/control-plane-auth.d.ts +17 -0
  47. package/dist/middleware/control-plane-auth.d.ts.map +1 -0
  48. package/dist/middleware/control-plane-auth.js +35 -0
  49. package/dist/middleware/control-plane-auth.js.map +1 -0
  50. package/dist/routes/control-plane.d.ts +20 -0
  51. package/dist/routes/control-plane.d.ts.map +1 -0
  52. package/dist/routes/control-plane.js +122 -0
  53. package/dist/routes/control-plane.js.map +1 -0
  54. package/dist/routes/messages.d.ts.map +1 -1
  55. package/dist/routes/messages.js +18 -0
  56. package/dist/routes/messages.js.map +1 -1
  57. package/dist/routes/poll.js +2 -2
  58. package/dist/routes/poll.js.map +1 -1
  59. package/dist/routes/sessions.d.ts +24 -1
  60. package/dist/routes/sessions.d.ts.map +1 -1
  61. package/dist/routes/sessions.js +135 -14
  62. package/dist/routes/sessions.js.map +1 -1
  63. package/dist/routes/validation-hook.d.ts +31 -0
  64. package/dist/routes/validation-hook.d.ts.map +1 -1
  65. package/dist/routes/validation-hook.js +3 -0
  66. package/dist/routes/validation-hook.js.map +1 -1
  67. package/dist/services/auth-service.d.ts +5 -45
  68. package/dist/services/auth-service.d.ts.map +1 -1
  69. package/dist/services/auth-service.js +5 -60
  70. package/dist/services/auth-service.js.map +1 -1
  71. package/dist/services/connection-manager.d.ts +15 -0
  72. package/dist/services/connection-manager.d.ts.map +1 -1
  73. package/dist/services/connection-manager.js +29 -0
  74. package/dist/services/connection-manager.js.map +1 -1
  75. package/dist/services/join-rate-limiter.d.ts +50 -0
  76. package/dist/services/join-rate-limiter.d.ts.map +1 -0
  77. package/dist/services/join-rate-limiter.js +89 -0
  78. package/dist/services/join-rate-limiter.js.map +1 -0
  79. package/dist/services/obs-log.d.ts +51 -0
  80. package/dist/services/obs-log.d.ts.map +1 -0
  81. package/dist/services/obs-log.js +93 -0
  82. package/dist/services/obs-log.js.map +1 -0
  83. package/dist/services/session-store-memory.d.ts +60 -0
  84. package/dist/services/session-store-memory.d.ts.map +1 -0
  85. package/dist/services/session-store-memory.js +189 -0
  86. package/dist/services/session-store-memory.js.map +1 -0
  87. package/dist/services/session-store-postgres.d.ts +60 -0
  88. package/dist/services/session-store-postgres.d.ts.map +1 -0
  89. package/dist/services/session-store-postgres.js +393 -0
  90. package/dist/services/session-store-postgres.js.map +1 -0
  91. package/dist/services/session-store.d.ts +73 -5
  92. package/dist/services/session-store.d.ts.map +1 -1
  93. package/dist/services/session-store.js +62 -16
  94. package/dist/services/session-store.js.map +1 -1
  95. package/dist/types.d.ts +13 -0
  96. package/dist/types.d.ts.map +1 -1
  97. package/dist/ui/components/Layout.d.ts.map +1 -1
  98. package/dist/ui/components/Layout.js +1 -1
  99. package/dist/ui/components/Layout.js.map +1 -1
  100. package/dist/ui/components/Terminal.js +1 -1
  101. package/dist/ui/components/Terminal.js.map +1 -1
  102. package/dist/ui/pages/LandingPage.d.ts +2 -2
  103. package/dist/ui/pages/LandingPage.d.ts.map +1 -1
  104. package/dist/ui/pages/LandingPage.js +103 -66
  105. package/dist/ui/pages/LandingPage.js.map +1 -1
  106. package/dist/ui/styles/theme.d.ts +35 -22
  107. package/dist/ui/styles/theme.d.ts.map +1 -1
  108. package/dist/ui/styles/theme.js +57 -28
  109. package/dist/ui/styles/theme.js.map +1 -1
  110. package/package.json +11 -6
@@ -1,6 +1,6 @@
1
1
  import type { Hono } from "hono";
2
2
  import type { ServerType } from "@hono/node-server";
3
- import { SessionStore } from "../services/session-store.js";
3
+ import type { 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";
@@ -22,8 +22,11 @@ export interface TestApp {
22
22
  * Each call creates a fresh temp directory for isolation.
23
23
  *
24
24
  * @param maxMessages - Message cap for the session store (default 500, use small value for cap tests)
25
+ * @param multiTenant - Enable Business Edition Org_ID enforcement (default false = free relay)
26
+ * @param controlPlaneToken - Shared control-plane bearer token. Only consumed when
27
+ * multiTenant=true (the control-plane route is mounted only on the business relay).
25
28
  */
26
- export declare function createTestApp(maxMessages?: number): Promise<TestApp>;
29
+ export declare function createTestApp(maxMessages?: number, multiTenant?: boolean, controlPlaneToken?: string | null): Promise<TestApp>;
27
30
  /**
28
31
  * Helper to create a session and get a bearer token.
29
32
  * Returns { sessionId, token } for use in subsequent requests.
@@ -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;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,CA6CvE;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"}
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;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,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;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,WAAW,SAAM,EACjB,WAAW,UAAQ,EACnB,iBAAiB,GAAE,MAAM,GAAG,IAAW,GACtC,OAAO,CAAC,OAAO,CAAC,CA+ClB;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,CAiE3E"}
@@ -2,7 +2,7 @@ import fs from "node:fs/promises";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { createAdaptorServer } from "@hono/node-server";
5
- import { SessionStore } from "../services/session-store.js";
5
+ import { FileSessionStore } from "../services/session-store.js";
6
6
  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";
@@ -15,10 +15,13 @@ import { createApp } from "../app.js";
15
15
  * Each call creates a fresh temp directory for isolation.
16
16
  *
17
17
  * @param maxMessages - Message cap for the session store (default 500, use small value for cap tests)
18
+ * @param multiTenant - Enable Business Edition Org_ID enforcement (default false = free relay)
19
+ * @param controlPlaneToken - Shared control-plane bearer token. Only consumed when
20
+ * multiTenant=true (the control-plane route is mounted only on the business relay).
18
21
  */
19
- export async function createTestApp(maxMessages = 500) {
22
+ export async function createTestApp(maxMessages = 500, multiTenant = false, controlPlaneToken = null) {
20
23
  const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "route-test-"));
21
- const sessionStore = new SessionStore(tmpDir, maxMessages);
24
+ const sessionStore = new FileSessionStore(tmpDir, maxMessages);
22
25
  const authService = new AuthService(4); // Low rounds for fast tests
23
26
  const connectionManager = new ConnectionManager(30_000);
24
27
  const messageQueue = new MessageQueueService(sessionStore);
@@ -40,6 +43,8 @@ export async function createTestApp(maxMessages = 500) {
40
43
  heartbeatMaxMissed: 3,
41
44
  adapterRegistry,
42
45
  channelIndex,
46
+ multiTenant,
47
+ controlPlaneToken,
43
48
  });
44
49
  return {
45
50
  app,
@@ -98,7 +103,7 @@ export async function registerPeer(app, sessionId, token, peerId, label = `Peer
98
103
  */
99
104
  export async function createTestWsApp(maxMessages = 500) {
100
105
  const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "ws-test-"));
101
- const sessionStore = new SessionStore(tmpDir, maxMessages);
106
+ const sessionStore = new FileSessionStore(tmpDir, maxMessages);
102
107
  const authService = new AuthService(4);
103
108
  await sessionStore.init();
104
109
  const connectionManager = new ConnectionManager(30_000);
@@ -120,6 +125,8 @@ export async function createTestWsApp(maxMessages = 500) {
120
125
  heartbeatMaxMissed: 3,
121
126
  adapterRegistry,
122
127
  channelIndex,
128
+ multiTenant: false,
129
+ controlPlaneToken: null,
123
130
  });
124
131
  // Create real HTTP server on ephemeral port
125
132
  const server = createAdaptorServer(app);
@@ -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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"}
@@ -0,0 +1,17 @@
1
+ import type { SessionStore } from "../../services/session-store.js";
2
+ import type { TokenEntry } from "../../types.js";
3
+ /** A store instance + how to tear it down, at a small message cap (5). */
4
+ export interface ContractFixture {
5
+ store: SessionStore;
6
+ cleanup: () => Promise<void>;
7
+ }
8
+ export declare function makeToken(suffix?: string): TokenEntry;
9
+ /**
10
+ * One behavioral contract every SessionStore implementation must satisfy
11
+ * identically — run against FileSessionStore, InMemorySessionStore, and (gated)
12
+ * PostgresSessionStore so divergence is caught. Session IDs are real UUIDs
13
+ * (production uses UUIDs; the Postgres schema's session_id is a uuid column).
14
+ * `MAX = 5` (message cap).
15
+ */
16
+ export declare function runSessionStoreContract(name: string, setup: () => Promise<ContractFixture>): void;
17
+ //# sourceMappingURL=session-store-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store-contract.d.ts","sourceRoot":"","sources":["../../../src/__tests__/services/session-store-contract.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAGD,wBAAgB,SAAS,CAAC,MAAM,SAAM,GAAG,UAAU,CAGlD;AAgBD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAkLjG"}
@@ -0,0 +1,186 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { randomUUID } from "node:crypto";
3
+ import { ErrorCode } from "@essentialai/cogent";
4
+ let tokenCounter = 0;
5
+ export function makeToken(suffix = "t") {
6
+ tokenCounter += 1;
7
+ return { tokenHash: `hash_${suffix}_${tokenCounter}`, createdAt: new Date().toISOString() };
8
+ }
9
+ function makeMessage(i) {
10
+ return {
11
+ id: `msg-${i}`,
12
+ fromPeerId: "alice",
13
+ toPeerId: "bob",
14
+ message: `m${i}`,
15
+ response: null,
16
+ timestamp: new Date().toISOString(),
17
+ durationMs: null,
18
+ success: true,
19
+ error: null,
20
+ };
21
+ }
22
+ /**
23
+ * One behavioral contract every SessionStore implementation must satisfy
24
+ * identically — run against FileSessionStore, InMemorySessionStore, and (gated)
25
+ * PostgresSessionStore so divergence is caught. Session IDs are real UUIDs
26
+ * (production uses UUIDs; the Postgres schema's session_id is a uuid column).
27
+ * `MAX = 5` (message cap).
28
+ */
29
+ export function runSessionStoreContract(name, setup) {
30
+ describe(`SessionStore contract — ${name}`, () => {
31
+ let store;
32
+ let cleanup;
33
+ beforeEach(async () => {
34
+ ({ store, cleanup } = await setup());
35
+ await store.init();
36
+ });
37
+ afterEach(async () => {
38
+ await cleanup();
39
+ });
40
+ it("creates and reads back a session", async () => {
41
+ const id = randomUUID();
42
+ const tok = makeToken();
43
+ const state = await store.createSession(id, "label-1", "secret-hash", tok);
44
+ expect(state.sessionId).toBe(id);
45
+ expect(state.label).toBe("label-1");
46
+ expect(state.tokens).toHaveLength(1);
47
+ expect(state.peers).toEqual({});
48
+ expect(state.messages).toEqual([]);
49
+ const read = await store.getSession(id);
50
+ expect(read.sessionId).toBe(id);
51
+ expect(read.label).toBe("label-1");
52
+ expect(read.tokens[0].tokenHash).toBe(tok.tokenHash);
53
+ });
54
+ it("returns null for a missing session (and for a malformed id)", async () => {
55
+ expect(await store.getSession(randomUUID())).toBeNull();
56
+ expect(await store.getSession("not-a-uuid")).toBeNull(); // no 500/throw, parity
57
+ });
58
+ it("throws INVALID_INPUT on a duplicate sessionId", async () => {
59
+ const id = randomUUID();
60
+ await store.createSession(id, "a", "h", makeToken());
61
+ await expect(store.createSession(id, "b", "h2", makeToken())).rejects.toMatchObject({
62
+ code: ErrorCode.INVALID_INPUT,
63
+ });
64
+ });
65
+ it("resolves a session by token hash", async () => {
66
+ const id = randomUUID();
67
+ const tok = makeToken();
68
+ await store.createSession(id, "l", "h", tok);
69
+ expect((await store.getSessionByTokenHash(tok.tokenHash)).sessionId).toBe(id);
70
+ expect(await store.getSessionByTokenHash("nope")).toBeNull();
71
+ });
72
+ it("applies updateSession and persists peers + messages", async () => {
73
+ const id = randomUUID();
74
+ await store.createSession(id, "l", "h", makeToken());
75
+ const updated = await store.updateSession(id, (s) => {
76
+ s.peers["p1"] = { peerId: "p1", cwd: "/x", label: "P1" };
77
+ s.messages.push(makeMessage(0));
78
+ return s;
79
+ });
80
+ expect(updated.messages).toHaveLength(1);
81
+ const read = await store.getSession(id);
82
+ expect(read.messages).toHaveLength(1);
83
+ expect(read.peers["p1"]).toBeDefined();
84
+ });
85
+ it("round-trips the offline messageQueue and channelMappings", async () => {
86
+ const id = randomUUID();
87
+ await store.createSession(id, "l", "h", makeToken());
88
+ await store.updateSession(id, (s) => {
89
+ s.messageQueue = { p1: [{ messageId: "m1", enqueuedAt: "2026-06-04T00:00:00.000Z", message: makeMessage(0) }] };
90
+ s.channelMappings = { slack: { platform: "slack", channelId: "C1", mappedAt: "2026-06-04T00:00:00.000Z" } };
91
+ return s;
92
+ });
93
+ const read = await store.getSession(id);
94
+ expect(read.messageQueue.p1).toHaveLength(1); // must NOT be silently dropped
95
+ expect(read.messageQueue.p1[0].messageId).toBe("m1");
96
+ expect(read.channelMappings.slack.channelId).toBe("C1");
97
+ });
98
+ it("updateSession throws SESSION_NOT_FOUND for a missing session", async () => {
99
+ await expect(store.updateSession(randomUUID(), (s) => s)).rejects.toMatchObject({
100
+ code: ErrorCode.SESSION_NOT_FOUND,
101
+ });
102
+ });
103
+ it("enforces the message cap (5)", async () => {
104
+ const id = randomUUID();
105
+ await store.createSession(id, "l", "h", makeToken());
106
+ for (let i = 0; i < 8; i++) {
107
+ await store.updateSession(id, (s) => {
108
+ s.messages.push(makeMessage(i));
109
+ return s;
110
+ });
111
+ }
112
+ const read = await store.getSession(id);
113
+ expect(read.messages).toHaveLength(5);
114
+ expect(read.messages.map((m) => m.id)).toEqual(["msg-3", "msg-4", "msg-5", "msg-6", "msg-7"]);
115
+ });
116
+ it("addToken adds + indexes a token; throws SESSION_NOT_FOUND when the session is missing", async () => {
117
+ const id = randomUUID();
118
+ await store.createSession(id, "l", "h", makeToken());
119
+ const t2 = makeToken();
120
+ await store.addToken(id, t2);
121
+ expect((await store.getSession(id)).tokens).toHaveLength(2);
122
+ expect((await store.getSessionByTokenHash(t2.tokenHash)).sessionId).toBe(id);
123
+ await expect(store.addToken(randomUUID(), makeToken())).rejects.toMatchObject({
124
+ code: ErrorCode.SESSION_NOT_FOUND,
125
+ });
126
+ });
127
+ it("deleteSession removes the session and clears its indexes", async () => {
128
+ const id = randomUUID();
129
+ const tok = makeToken();
130
+ await store.createSession(id, "del-label", "h", tok);
131
+ await store.deleteSession(id);
132
+ expect(await store.getSession(id)).toBeNull();
133
+ expect(await store.getSessionByTokenHash(tok.tokenHash)).toBeNull();
134
+ expect(store.isLabelTaken("del-label")).toBe(false);
135
+ expect(store.getSessionIdByLabel("del-label")).toBeNull();
136
+ expect(await store.listSessions()).toEqual([]);
137
+ });
138
+ it("round-trips orgIdHash + orgScope and scopes labels per org", async () => {
139
+ const a1 = randomUUID();
140
+ const b1 = randomUUID();
141
+ await store.createSession(a1, "sprint-42", "h", makeToken(), undefined, { idHash: "ha", scope: "scope-a" });
142
+ await store.createSession(b1, "sprint-42", "h", makeToken(), undefined, { idHash: "hb", scope: "scope-b" });
143
+ const a = await store.getSession(a1);
144
+ expect(a.orgIdHash).toBe("ha");
145
+ expect(a.orgScope).toBe("scope-a");
146
+ expect(store.getSessionIdByLabel("sprint-42", "scope-a")).toBe(a1);
147
+ expect(store.getSessionIdByLabel("sprint-42", "scope-b")).toBe(b1);
148
+ expect(store.getSessionIdByLabel("sprint-42")).toBeNull(); // public scope can't see business
149
+ await expect(store.createSession(randomUUID(), "sprint-42", "h", makeToken(), undefined, { idHash: "ha", scope: "scope-a" })).rejects.toMatchObject({ code: ErrorCode.INVALID_INPUT });
150
+ });
151
+ it("countAgentsByOrgScope sums peers across the org's sessions, scope-isolated", async () => {
152
+ const a1 = randomUUID();
153
+ const a2 = randomUUID();
154
+ const b1 = randomUUID();
155
+ await store.createSession(a1, "chan-a1", "h", makeToken(), undefined, { idHash: "ha", scope: "scope-x" });
156
+ await store.createSession(a2, "chan-a2", "h", makeToken(), undefined, { idHash: "ha", scope: "scope-x" });
157
+ await store.createSession(b1, "chan-b1", "h", makeToken(), undefined, { idHash: "hb", scope: "scope-y" });
158
+ await store.updateSession(a1, (s) => {
159
+ s.peers["alice"] = { peerId: "alice", cwd: "/x", label: "A" };
160
+ s.peers["bob"] = { peerId: "bob", cwd: "/x", label: "B" };
161
+ return s;
162
+ });
163
+ await store.updateSession(a2, (s) => {
164
+ s.peers["carol"] = { peerId: "carol", cwd: "/x", label: "C" };
165
+ return s;
166
+ });
167
+ await store.updateSession(b1, (s) => {
168
+ s.peers["dave"] = { peerId: "dave", cwd: "/x", label: "D" };
169
+ return s;
170
+ });
171
+ expect(await store.countAgentsByOrgScope("scope-x")).toBe(3); // alice+bob+carol
172
+ expect(await store.countAgentsByOrgScope("scope-y")).toBe(1); // dave only
173
+ expect(await store.countAgentsByOrgScope("scope-unknown")).toBe(0);
174
+ });
175
+ it("tracks the global message counter atomically", async () => {
176
+ expect(await store.getGlobalMessageCount()).toBe(0);
177
+ await Promise.all([
178
+ store.incrementGlobalMessageCount(),
179
+ store.incrementGlobalMessageCount(),
180
+ store.incrementGlobalMessageCount(),
181
+ ]);
182
+ expect(await store.getGlobalMessageCount()).toBe(3);
183
+ });
184
+ });
185
+ }
186
+ //# sourceMappingURL=session-store-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store-contract.js","sourceRoot":"","sources":["../../../src/__tests__/services/session-store-contract.ts"],"names":[],"mappings":"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"}
package/dist/app.d.ts CHANGED
@@ -23,6 +23,15 @@ export interface AppDeps {
23
23
  heartbeatMaxMissed: number;
24
24
  adapterRegistry?: AdapterRegistry;
25
25
  channelIndex?: ChannelIndex;
26
+ /** Multi-tenant (Business Edition) flag, sourced once from config.MULTI_TENANT. */
27
+ multiTenant: boolean;
28
+ /**
29
+ * Shared bearer token the control plane authenticates with (Business Edition).
30
+ * `null` when unset → the control-plane endpoint, even if mounted, rejects every
31
+ * request (fail-closed). Sourced from config.CONTROL_PLANE_TOKEN. Required (not
32
+ * optional) so a forgotten wiring is a compile error, matching `adminPassword`.
33
+ */
34
+ controlPlaneToken: string | null;
26
35
  }
27
36
  /** Return type of createApp -- app + injectWebSocket for index.ts wiring. */
28
37
  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,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"}
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;AAc5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,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;IAC5B,mFAAmF;IACnF,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;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,CA8GlD"}
package/dist/app.js CHANGED
@@ -4,6 +4,7 @@ import { requestLogger } from "./middleware/request-logger.js";
4
4
  import { errorHandler } from "./middleware/error-handler.js";
5
5
  import { notFoundHandler } from "./middleware/not-found.js";
6
6
  import { createSessionRoutes } from "./routes/sessions.js";
7
+ import { JoinRateLimiter } from "./services/join-rate-limiter.js";
7
8
  import { createHealthRoutes } from "./routes/health.js";
8
9
  import { createPeerRoutes } from "./routes/peers.js";
9
10
  import { createMessageRoutes } from "./routes/messages.js";
@@ -14,6 +15,8 @@ import { createWsHandler } from "./ws/handler.js";
14
15
  import { createAdapterWsHandler } from "./ws/adapter-handler.js";
15
16
  import { createAdapterRoutes } from "./routes/adapter.js";
16
17
  import { createChannelMappingRoutes } from "./routes/channel-mappings.js";
18
+ import { createControlPlaneRoutes } from "./routes/control-plane.js";
19
+ import { createControlPlaneAuthMiddleware } from "./middleware/control-plane-auth.js";
17
20
  /**
18
21
  * Create and configure the Hono app with all middleware and routes.
19
22
  *
@@ -24,9 +27,14 @@ import { createChannelMappingRoutes } from "./routes/channel-mappings.js";
24
27
  * be called with the HTTP server after serve() -- see RESEARCH.md Pitfall 2.
25
28
  */
26
29
  export function createApp(deps) {
27
- const { sessionStore, authService, startTime, maxMessages, connectionManager, messageQueue, statsService, adminPassword, heartbeatIntervalMs, heartbeatMaxMissed, adapterRegistry, channelIndex, } = deps;
30
+ const { sessionStore, authService, startTime, maxMessages, connectionManager, messageQueue, statsService, adminPassword, heartbeatIntervalMs, heartbeatMaxMissed, adapterRegistry, channelIndex, multiTenant, controlPlaneToken, } = deps;
28
31
  const app = new Hono();
29
32
  const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app });
33
+ // Brute-force lockout for session joins, within a 15-min window -> 15-min
34
+ // lockout. Tier 1: 5 failures per (IP, channel) for UX. Tier 2: 20 failures
35
+ // per channel (non-spoofable) as the security backstop against header-forged
36
+ // IP rotation. Process-local for the single-node MVP.
37
+ const joinRateLimiter = new JoinRateLimiter(5, 20, 15 * 60_000, 15 * 60_000);
30
38
  // --- Error handling ---
31
39
  app.onError(errorHandler);
32
40
  app.notFound(notFoundHandler);
@@ -64,7 +72,7 @@ export function createApp(deps) {
64
72
  const uiRoutes = createUiRoutes({ statsService, adminPassword, sessionStore, connectionManager });
65
73
  app.route("/", uiRoutes);
66
74
  // --- Unauthenticated routes ---
67
- app.route("/api/sessions", createSessionRoutes(sessionStore, authService));
75
+ app.route("/api/sessions", createSessionRoutes(sessionStore, authService, multiTenant, joinRateLimiter));
68
76
  app.route("/api/health", createHealthRoutes(sessionStore, startTime, connectionManager));
69
77
  // --- Authenticated routes ---
70
78
  // Peer routes: /:sessionId/peers (POST, GET), /:sessionId/peers/:peerId (DELETE)
@@ -81,6 +89,14 @@ export function createApp(deps) {
81
89
  if (channelIndex) {
82
90
  app.route("/api/sessions", createChannelMappingRoutes(sessionStore, authService, channelIndex));
83
91
  }
92
+ // --- Control-plane receiver (Business Edition only) ---
93
+ // Mounted ONLY on the multi-tenant relay; the free relay never exposes it. The
94
+ // auth middleware is fail-closed, so a missing token rejects every request even
95
+ // though the route is mounted.
96
+ if (multiTenant) {
97
+ app.use("/api/control-plane/*", createControlPlaneAuthMiddleware(controlPlaneToken, authService));
98
+ app.route("/api/control-plane", createControlPlaneRoutes(sessionStore, authService, connectionManager));
99
+ }
84
100
  return { app, injectWebSocket };
85
101
  }
86
102
  //# 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/config.d.ts CHANGED
@@ -25,6 +25,13 @@ declare const ServerConfigSchema: z.ZodObject<{
25
25
  SESSION_INACTIVITY_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
26
26
  SESSION_CLEANUP_INTERVAL_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
27
27
  ADMIN_PASSWORD: z.ZodOptional<z.ZodString>;
28
+ CONTROL_PLANE_TOKEN: z.ZodOptional<z.ZodString>;
29
+ MULTI_TENANT: z.ZodPipe<z.ZodDefault<z.ZodString>, z.ZodTransform<boolean, string>>;
30
+ DATABASE_URL: z.ZodOptional<z.ZodString>;
31
+ DB_POOL_MAX: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
32
+ DB_CONNECTION_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
33
+ DB_IDLE_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
34
+ DB_STATEMENT_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
28
35
  }, z.core.$strip>;
29
36
  /** Inferred server configuration type. */
30
37
  export type ServerConfig = z.infer<typeof ServerConfigSchema>;
@@ -49,6 +56,13 @@ export interface ConfigFileOptions {
49
56
  sessionInactivityMs?: number;
50
57
  sessionCleanupIntervalMs?: number;
51
58
  adminPassword?: string;
59
+ controlPlaneToken?: string;
60
+ multiTenant?: boolean;
61
+ databaseUrl?: string;
62
+ dbPoolMax?: number;
63
+ dbConnectionTimeoutMs?: number;
64
+ dbIdleTimeoutMs?: number;
65
+ dbStatementTimeoutMs?: number;
52
66
  }
53
67
  /**
54
68
  * Load a config.json file and return its values mapped to COGENT_SERVER_* env var names.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;GAGG;AACH,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;iBA2BtB,CAAC;AAEH,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAsBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BzE;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,UAAU,GAAE,MAAgD,GAC3D,QAAQ,CAAC,YAAY,CAAC,CA2BxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,QAAQ,CAAC,YAAY,CAAC,CAOxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;GAGG;AACH,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgEtB,CAAC;AAEH,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AA6BD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BzE;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,UAAU,GAAE,MAAgD,GAC3D,QAAQ,CAAC,YAAY,CAAC,CA2BxB;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,QAAQ,CAAC,YAAY,CAAC,CAOxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
package/dist/config.js CHANGED
@@ -31,6 +31,43 @@ const ServerConfigSchema = z.object({
31
31
  SESSION_CLEANUP_INTERVAL_MS: z.coerce.number().default(3_600_000),
32
32
  /** Admin dashboard password. When undefined, admin dashboard is disabled entirely. */
33
33
  ADMIN_PASSWORD: z.string().optional(),
34
+ /**
35
+ * Shared bearer token authenticating the control plane (Business Edition) on
36
+ * the privileged /api/control-plane/* endpoint. When UNSET, that endpoint is
37
+ * fail-closed (every request rejected) — an unconfigured token must never mean
38
+ * "open". Only meaningful with MULTI_TENANT=true (the route isn't mounted on
39
+ * the free relay). When SET it must be ≥32 chars (Sec-M1): the timing-safe compare
40
+ * defeats prefix-timing + unconfigured-open, but NOT low-entropy online guessing of a
41
+ * fully-armed any-org endpoint. Optional() keeps the free relay (token unset) unaffected.
42
+ */
43
+ CONTROL_PLANE_TOKEN: z
44
+ .string()
45
+ .min(32, "CONTROL_PLANE_TOKEN must be ≥32 chars (high-entropy) — it guards the any-org control-plane endpoint")
46
+ .optional(),
47
+ /**
48
+ * Multi-tenant (Business Edition) flag. Off on the free relay.
49
+ * Parsed explicitly from the string "true" -- NOT z.coerce.boolean(), which
50
+ * would coerce the string "false" to `true`.
51
+ */
52
+ MULTI_TENANT: z
53
+ .string()
54
+ .default("false")
55
+ .transform((v) => v === "true"),
56
+ /**
57
+ * Postgres connection string for the business instance (FR35). OPTIONAL:
58
+ * when unset, the relay uses the file store and never opens a pool (the free
59
+ * relay path is unchanged). Story 2.4b selects the Postgres store from this.
60
+ */
61
+ DATABASE_URL: z.string().optional(),
62
+ /** Max pooled connections (bounded — the back-pressure ceiling). */
63
+ DB_POOL_MAX: z.coerce.number().int().min(1).default(10),
64
+ /** Acquire timeout: a connect that can't be served in this window REJECTS
65
+ * (graceful degradation) instead of hanging. */
66
+ DB_CONNECTION_TIMEOUT_MS: z.coerce.number().int().min(1).default(5_000),
67
+ /** Idle client reaped after this long. */
68
+ DB_IDLE_TIMEOUT_MS: z.coerce.number().int().min(0).default(30_000),
69
+ /** Per-statement timeout (server-side) to bound runaway queries. */
70
+ DB_STATEMENT_TIMEOUT_MS: z.coerce.number().int().min(0).default(30_000),
34
71
  });
35
72
  const ENV_PREFIX = "COGENT_SERVER_";
36
73
  /** Maps camelCase config.json keys to COGENT_SERVER_* env var names. */
@@ -51,6 +88,13 @@ const CONFIG_KEY_MAP = {
51
88
  sessionInactivityMs: "COGENT_SERVER_SESSION_INACTIVITY_MS",
52
89
  sessionCleanupIntervalMs: "COGENT_SERVER_SESSION_CLEANUP_INTERVAL_MS",
53
90
  adminPassword: "COGENT_SERVER_ADMIN_PASSWORD",
91
+ controlPlaneToken: "COGENT_SERVER_CONTROL_PLANE_TOKEN",
92
+ multiTenant: "COGENT_SERVER_MULTI_TENANT",
93
+ databaseUrl: "COGENT_SERVER_DATABASE_URL",
94
+ dbPoolMax: "COGENT_SERVER_DB_POOL_MAX",
95
+ dbConnectionTimeoutMs: "COGENT_SERVER_DB_CONNECTION_TIMEOUT_MS",
96
+ dbIdleTimeoutMs: "COGENT_SERVER_DB_IDLE_TIMEOUT_MS",
97
+ dbStatementTimeoutMs: "COGENT_SERVER_DB_STATEMENT_TIMEOUT_MS",
54
98
  };
55
99
  /**
56
100
  * Load a config.json file and return its values mapped to COGENT_SERVER_* env var names.
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,UAAU,CAAC,CACtD;IACD,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACrE,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACjE,qBAAqB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IAC3D,wBAAwB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACtE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACpC,4DAA4D;IAC5D,wBAAwB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAC3D,wGAAwG;IACxG,uBAAuB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,+FAA+F;IAC/F,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACrD,iDAAiD;IACjD,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACpD,uDAAuD;IACvD,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IAChE,kGAAkG;IAClG,qBAAqB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IAC7D,4EAA4E;IAC5E,2BAA2B,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACjE,sFAAsF;IACtF,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC;;;;;;;;OAQG;IACH,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,GAAG,CAAC,EAAE,EAAE,qGAAqG,CAAC;SAC9G,QAAQ,EAAE;IACb;;;;OAIG;IACH,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,OAAO,CAAC,OAAO,CAAC;SAChB,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC;IACjC;;;;OAIG;IACH,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,oEAAoE;IACpE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD;qDACiD;IACjD,wBAAwB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACvE,0CAA0C;IAC1C,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAClE,oEAAoE;IACpE,uBAAuB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CACxE,CAAC,CAAC;AAKH,MAAM,UAAU,GAAG,gBAAgB,CAAC;AAgCpC,wEAAwE;AACxE,MAAM,cAAc,GAA4C;IAC9D,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE,oBAAoB;IAC1B,QAAQ,EAAE,yBAAyB;IACnC,QAAQ,EAAE,yBAAyB;IACnC,YAAY,EAAE,6BAA6B;IAC3C,kBAAkB,EAAE,qCAAqC;IACzD,qBAAqB,EAAE,wCAAwC;IAC/D,UAAU,EAAE,2BAA2B;IACvC,qBAAqB,EAAE,wCAAwC;IAC/D,oBAAoB,EAAE,uCAAuC;IAC7D,eAAe,EAAE,kCAAkC;IACnD,UAAU,EAAE,4BAA4B;IACxC,sBAAsB,EAAE,yCAAyC;IACjE,mBAAmB,EAAE,qCAAqC;IAC1D,wBAAwB,EAAE,2CAA2C;IACrE,aAAa,EAAE,8BAA8B;IAC7C,iBAAiB,EAAE,mCAAmC;IACtD,WAAW,EAAE,4BAA4B;IACzC,WAAW,EAAE,4BAA4B;IACzC,SAAS,EAAE,2BAA2B;IACtC,qBAAqB,EAAE,wCAAwC;IAC/D,eAAe,EAAE,kCAAkC;IACnD,oBAAoB,EAAE,uCAAuC;CAC9D,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,kDAAkD;QAClD,IAAI,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9F,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,SAAS,GAAG,MAA2B,CAAC;IAC9C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,SAAS,CAAC,GAA8B,CAAC,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,IAAI,OAAO,GAAkC,IAAI,CAAC;AAElD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAA0C,OAAO,CAAC,GAAG,EACrD,aAAqB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC;IAE5D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,iEAAiE;IACjE,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAE9C,qDAAqD;IACrD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtD,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,sFAAsF;IACtF,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC"}